Was passiert, wenn ich die Instanz von SqlConnection nicht öffne?

Ich überprüfe ein Stück Code in einer Anwendung und ich kam zu etwas sehr merkwürdig in Bezug auf die Verbindung zur database.

Es führt Abfragen aus, ohne die Verbindung so zu öffnen:

using (sqlConnection1 = new SqlConnection(connString) { SqlCommand comm = new SqlCommand(query,sqlConnection1); // ... parameters are handled here... SqlDataAdapter ad = new SqlDataAdapter(comm); ds = new DataSet(); ad.FillSchema(ds, SchemaType.Source); ad.Fill(ds); } 

Sollte es nicht scheitern, weil die Verbindung nicht offen ist? Ich habe das in einem separaten Projekt getestet und es hat gearbeitet.

Wenn die Verbindung geschlossen ist, öffnet SqlDataAdapter.Fill die Verbindung http://msdn.microsoft.com/en-us/library/377a8x4t.aspx

In der Dokumentation öffnet SqlDataAdapter die Conenction, wenn sie noch nicht geöffnet ist und sie in ihren vorherigen Zustand zurücksendet.

Das mit dem SelectCommand verknüpfte Verbindungsobjekt muss gültig sein, muss aber nicht geöffnet sein. Wenn die Verbindung geschlossen ist, bevor FillSchema aufgerufen wird, wird es geöffnet, um data abzurufen, dann geschlossen. Wenn die Verbindung geöffnet ist, bevor FillSchema aufgerufen wird, bleibt sie offen.

Fill verhält sich auch in der gleichen Weise

Siehe MSDN

Die Fill-Methode öffnet implizit die Verbindung, die der DataAdapter verwendet, wenn er feststellt, dass die Verbindung nicht bereits geöffnet ist. Wenn Fill die Verbindung geöffnet hat, schließt es auch die Verbindung, wenn Fill beendet ist. Dies kann Ihren Code beim Umgang mit einer einzigen Operation wie einem Fill oder einem Update vereinfachen.

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

Von SqlDataAdapter.Fill Methode;

Die Fill-Methode ruft Zeilen aus der dataquelle mit der SELECT-statement ab, die von einer zugeordneten SelectCommand-Eigenschaft angegeben wird. Das mit der SELECT-statement verknüpfte Verbindungsobjekt muss gültig sein, muss aber nicht geöffnet sein. Wenn die Verbindung geschlossen ist, bevor Fill aufgerufen wird, wird es geöffnet, um data abzurufen, dann geschlossen. Wenn die Verbindung geöffnet ist, bevor Fill aufgerufen wird, bleibt sie offen.

Auch FillSchema Methode macht dasselbe.