Que se passe-t-il si je n'ouvre pas l'instance de SqlConnection?

J'examine un morceau de code dans une application et je suis arrivé à quelque chose de très étrange en ce qui concerne la connection à la database.

Il exécute des requêtes sans ouvrir la connection comme ceci:

using (sqlConnection1 = new SqlConnection(connSsortingng) { 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); } 

Ne devrait-il pas échouer en raison de la connection n'est pas ouverte? J'ai effectivement testé cela dans un projet séparé et cela a fonctionné.

Si la connection est fermée, l'utilisation de SqlDataAdapter.Fill ouvrira la connection http://msdn.microsoft.com/en-us/library/377a8x4t.aspx

Par la documentation , SqlDataAdapter ouvrira la conenction si elle n'est pas déjà ouverte, et la ramènera à son état précédent.

L'object de connection associé à SelectCommand doit être valide, mais il n'a pas besoin d'être ouvert. Si la connection est fermée avant l'appel de FillSchema, elle est ouverte pour récupérer datatables, puis fermée. Si la connection est ouverte avant que FillSchema soit appelé, il rest ouvert.

Fill se comporte également de la même manière

Consulter MSDN

La méthode Fill ouvre implicitement la connection que le DataAdapter utilise s'il trouve que la connection n'est pas déjà ouverte. Si Fill a ouvert la connection, il ferme également la connection lorsque Fill est terminé. Cela peut simplifier votre code lorsqu'il s'agit d'une seule opération telle qu'un remplissage ou une mise à jour.

Cela signifie qu'après da.Fill(ds, "Test"); votre connection est fermée par la méthode elle-même. Mais vous en avez besoin ouvert pour la mise à jour suivante (et cela échoue)

De la méthode SqlDataAdapter.Fill ;

La méthode Fill récupère les lignes de la source de données à l'aide de l'instruction SELECT spécifiée par une propriété SelectCommand associée. L'object de connection associé à l'instruction SELECT doit être valide, mais il n'a pas besoin d'être ouvert. Si la connection est fermée avant l'appel de Fill, il est ouvert pour récupérer datatables, puis fermé. Si la connection est ouverte avant l'appel de Fill, il rest ouvert.

Aussi la méthode FillSchema fait la même chose.