2012-04-14 71 views
4

我尝试在C#.net中使用DataAdapter。我仍然不明白DataAdapter的一些事情。DataAdapter不需要打开db连接?

我读了很多关于DataAdapter和DataReader的文章和博客。

我了解DataAdapter会在需要时自动打开和关闭数据库。

但是,

//conn.Open(); 
AdsDataAdapter da; 
da = new AdsDataAdapter("Select * from Test", conn); 
AdsCommandBuilder cb; 
cb = new AdsCommandBuilder(da); 

DataSet ds = new DataSet(); 
da.Fill(ds, "Test"); 

DataRow newrow = ds.Tables["Test"].NewRow(); 
newrow["Name"] = "How about"; 
ds.Tables["Test"].Rows.Add(newrow); 
da.Update(ds, "Test"); 

当我运行上面的代码,我得到说,一个错误信息“连接必须是开放的。”

为什么适配器无法自动打开连接?

和,我想插入数据使用insertCommand(为了这个测试,我打开了连接)。

da.InsertCommand = new AdsCommand("INSERT INTO test (NAME) values('Insert Test #1')", conn); 
//da.InsertCommand.ExecuteNonQuery(); // it works 
da.Update(ds,"Test"); //but it does not works. 

使用Adapter.Update(),但对我来说大量的实例,它不工作:(

没有插入错误并没有什么

,并使用da.InsertCommand.ExecuteNonQuery()。而不是更新(),它的工作原理。

我究竟做错了什么?

谢谢!

回答

10

MSDN

Fill方法隐含打开一个DataAdapter的 如果发现连接尚未打开时使用的连接。如果 填充打开连接,当填充完成时它也将关闭连接。这可以在处理单个操作(如填充或更新)时简化代码。

这意味着在da.Fill(ds, "Test");之后,您的连接被方法本身关闭。但是,你需要打开下面的更新(和失败)

编辑:从您的代码衍生以上

using(AdsConnection com = new AdsConnection(connectionString)); 
{ 
    conn.Open(); 
    using(AdsDataAdapter da = new AdsDataAdapter("Select * from Test", conn)) 
    { 
     AdsCommandBuilder cb = new AdsCommandBuilder(da); 
     DataSet ds = new DataSet(); 
     da.Fill(ds, "Test"); 

     // Now the connection is still open and you can issue other commands 

     DataRow newrow = ds.Tables["Test"].NewRow(); 
     newrow["Name"] = "How about"; 
     ds.Tables["Test"].Rows.Add(newrow); 

     // da.Update should work here. No more connection closed. 
     da.Update(ds, "Test"); 
    } 
} // Exiting from the using block, the connection will be closed 
+0

连接开放代码的伪代码已经由OP评论。它应该是一个评论。 – Pankaj 2012-04-14 13:26:43

+0

@PankajGarg这正是OP代码失败的原因。我的理解是,当你发现错误时,你会发布一个答案。 – Steve 2012-04-14 13:32:07

+0

谢谢你的回答!填充到DataSet后,连接将被关闭,那么在那之后,如果我们需要更新数据库,那么我们需要手动打开和关闭连接?你知道第二个问题吗? – 2012-04-14 13:33:56