如何从存储过程中填充DataTable

可能重复:
如何从存储过程检索表到数据表

我正在尝试填充我的数据表。 我已经创建了一个数据表tmpABCD但我需要使用存储过程中的值填充它。 我无法继续下去。

SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString); sqlcon.Open(); SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon); DataTable dt = new DataTable("tmpABCD"); dt.Columns.Add(new DataColumn("A")); dt.Columns.Add(new DataColumn("B")); dt.Columns.Add(new DataColumn("C")); dt.Columns.Add(new DataColumn("D")); 

您无需手动添加列。 只需使用DataAdapter ,它很简单:

 DataTable table = new DataTable(); using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString)) using(var cmd = new SqlCommand("usp_GetABCD", con)) using(var da = new SqlDataAdapter(cmd)) { cmd.CommandType = CommandType.StoredProcedure; da.Fill(table); } 

请注意,您甚至不需要打开/关闭连接。 这将由DataAdapter隐式完成。

与SELECT语句关联的连接对象必须有效,但不需要打开它。 如果在调用Fill之前关闭连接,则会打开它以检索数据,然后关闭。 如果在调用Fill之前连接已打开,则它将保持打开状态。

使用SqlDataAdapter,它更容易,您不需要自己定义列名称,它将从查询结果中获取列名称:

 using (SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString)) { using (SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon)) { cmd.CommandType = CommandType.StoredProcedure; using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); da.Fill(dt); } } } 

使用SqlDataAdapter,这将简化一切。

 //Your code to this point DataTable dt = new DataTable(); using(var cmd = new SqlCommand("usp_GetABCD", sqlcon)) { using(var da = new SqlDataAdapter(cmd)) { da.Fill(dt): } } 

只要存储的进度返回数据集(光标),您的DataTable就会拥有您要查找的信息。

您可以使用SqlDataAdapter

  SqlDataAdapter adapter = new SqlDataAdapter(); SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon); cmd.CommandType = CommandType.StoredProcedure; adapter.SelectCommand = cmd; DataTable dt = new DataTable(); adapter.Fill(dt);