2012-11-15 81 views
14

可能重复一个DataTable:
How can i retrieve a table from stored procedure to a 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")); 
+1

不能。没有足够的代表无论哪种方式,这里的答案都变得更好了。 – MikeSmithDev

回答

41

您不需要手动添加列。只需使用一个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之前打开,它将保持打开状态。

+3

+1令人敬畏的使用 – iMortalitySX

0

您可以使用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); 
+1

我需要打字速度更快,咖啡在哪里? – iMortalitySX

+1

我也是这样,虽然这段代码不起作用,但是数据适配器应该在其构造函数中使用cmd,或者应该在构建命令后设置它。在当前状态下,这个数据适配器会抛出一个错误,首先告诉你连接没有被初始化,然后一旦你修复了这个错误,它就没有选择命令的命令文本。 ;] – Sean

+0

@谢恩谢谢你指出。我是从内存中输入的,几年后还没有使用ADO.net :) – BFree

2

使用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将有你正在寻找的信息,只要你的存储proceedure返回一个数据集(光标)。

+0

-1没有使用块。 “两个错误不会令人满意”。 –

+0

@JohnSaunders固定。请删除,因为我对数据适配器对象更感兴趣而不是实现。你完全正确,虽然 – iMortalitySX

+0

''使用''SqlDataAdapter'也请,然后我会删除。 –

12

使用一个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); 
     } 
    } 
} 
+0

+1正确关闭。我太懒惰了我的回答 – iMortalitySX

+0

@John Saunders欢呼关闭我的支架,没有注意到=] – Sean

相关问题