2012-04-14 68 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