如何从存储过程填充DataTable

Ras*_*ash 19 .net c# asp.net ado.net

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

我正在尝试填充我的数据表.我已经创建了一个数据表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"));
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 51

您无需手动添加列.只需使用a 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • +1令人敬畏的使用 (3认同)

Sea*_*rey 13

使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)