2012-04-14 16 views
4

Ich versuche DataAdapter in C# .net zu verwenden. und ich verstehe immer noch nichts über DataAdapter.DataAdapter muss die db-Verbindung nicht öffnen?

Ich habe viele Artikel und Blogs über DataAdapter und DataReader gelesen.

Ich habe verstanden, dass DataAdapter Datenbank automatisch öffnet und schließt, wenn sie benötigen.

Aber

//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"); 

Wenn ich den Code oben laufen, erhalte ich eine Fehlermeldung, die sagen: „Verbindung offen sein muss.“

Warum kann der Adapter die Verbindung nicht automatisch öffnen?

und ich möchte Daten mit InsertCommand einfügen (für diesen Test habe ich die Verbindung geöffnet).

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. 

Viele Beispiel mit adapter.Update(), aber für mich ist es nicht funktioniert :(

Kein Fehler und eingefügt nichts

und mit da.InsertCommand.ExecuteNonQuery(). stattdessen Update(), es funktioniert.

, was mache ich falsch?

Dank!

Antwort

10

MSDN sagt, dass

Die Fill-Methode implizit die Verbindung öffnet, dass der Dataadapter verwendet, wenn er feststellt, dass die Verbindung nicht bereits geöffnet ist. Wenn Fill die Verbindung geöffnet hat, wird auch die Verbindung geschlossen, wenn Füllen beendet ist. Dies kann Ihren Code vereinfachen, wenn Sie mit einer einzelnen Operation wie Fill oder Update arbeiten.

Dies bedeutet, dass Ihre Verbindung nach da.Fill(ds, "Test"); durch die Methode selbst geschlossen wird. Aber Sie müssen es für das folgende Update öffnen (und das nicht funktioniert)

EDIT: Pseudocode aus dem Code abgeleitet oben

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

Verbindung offen Code wird bereits durch die OP kommentiert. Es sollte ein Kommentar sein. – Pankaj

+0

@ PankajGarg das ist genau der Grund für den Fehler des OP-Codes. Ich verstehe, dass Sie eine Antwort veröffentlichen, wenn Sie den Fehler finden. – Steve

+0

Vielen Dank für Ihre Antwort! Nach dem Füllen zu DataSet wird die Verbindung geschlossen. Wenn wir danach die Datenbank aktualisieren müssen, müssen wir die Verbindung manuell öffnen und schließen, oder? und weißt du von der zweiten Frage? –