2010-10-25 19 views
0

J'ai récemment posté (et supprimé rapidement, quand j'ai décidé que la question n'était pas pertinente au problème) une question à propos de SqlConnection perdant ses informations de base de données lorsque la portée de "ChangeDatabase" se termine. Exemple:Pourquoi SqlConnection oublie le type de base de données

//Other code... 
    dbConn = new SqlConnection(dbConnBuilder.ConnectionString); 
    dbConn.Open(); 
    dbConn.ChangeDatabase(currentDatabase); 
    dbConn.Close(); 
} 

Mes questions:

  1. est-il considéré comme une mauvaise pratique de tenir sur un objet SqlConnection et ouvrir et fermer chaque fois que vous en avez besoin quand vous ne jamais avoir une connexion d'une donnée type?
  2. Pourquoi ne dbConn.Databasepas se rappeler currentDatabase après ChangeDatabase (une méthode pas une variable) 'est hors de portée? (Heck, je ne savais pas des méthodes comme ChangeDatabase pourrait savoir sur la portée).

Ma chaîne de connexion était:

Data Source=server.name.com;Persist Security Info=True;User ID=username;Password=password 

Merci les gars, laissez-moi savoir si je peux vous donner plus d'informations, encore à apprendre à utiliser S.O.

Répondre

5

Appel Close() détruit complètement l'objet, de sorte que vous ne devriez pas en train de lire une de ses propriétés après.

En fait, il devrait même être un "après", car vous ne devriez pas appeler Close(). Au lieu de cela, instancier la connexion dans un bloc using, de sorte qu'il appelle Dispose(), ce qui fait la même chose que Close(), mais il est garanti de le faire, peu importe comment vous quittez le bloc.

+0

Donc, la reconstruction est vraiment le seul moyen d'y parvenir? (Garder un SqlConnection autour est un mauvais chemin à parcourir?) – Crisfole

+1

Correct. Vous ne gagnez rien à le garder parce qu'il y a un pool de connexion sous-jacent, de toute façon. –

+1

La règle générale - à quelques exceptions près - consiste à utiliser 'using' pour tout ce qui implémente' IDisposable'. –

0

Alors il suffit de ChangeDatabase appeler chaque fois que vous devez exécuter une instruction :-)

+0

Merci :-). Cela fonctionnerait, sauf que j'espérais faire abstraction de ce que je pourrais dire: obtenir la base de données et l'utiliser, ne pas obtenir, mettre en place, puis l'utiliser. – Crisfole