1

Je voudrais savoir quelle pourrait être la meilleure approche pour ouvrir un SqlConnection avec Sql Server 2008R2 Express Edition Base de données. Cette version de Sql a des limitations de l'utilisation de RAM et de l'utilisation du processeur, donc nous devons adopter quelque chose de mieux pour ouvrir un SqlConnection.Quelle est la meilleure approche pour ouvrir/fermer SqlConnection en C#

Maintenant je vérifie la connexion au début et à la fin de chaque méthode. Voici un exemple de cela.

private void CheckValidId(string Id) 
    { 
     CheckConnectionStatus(); 

     try 
     { 
      sqlConnection.Open(); 
      sqlCommand = new SqlCommand("select * from ValidId where [email protected]", sqlConnection); 
      sqlCommand.Parameters.AddWithValue("@id", Id); 
      sqlDataReader = sqlCommand.ExecuteReader(); 
      While (sqlDataReader.Read()) 
      { 
       string Test = sqlDataReader["Id"].toString(); 
       MessageBox.Show("Value of Id : " , Test); 
      } 
     } 
     catch (Exception exp) 
     { 
      MessageBox.Show(exp.Message.ToString(), "Exception in CheckValidId"); 
     } 
     finally 
     { 
      CheckConnectionStatus(); 
     } 
    } 

Voici CheckConnectionStatus Méthode

private void CheckConnectionStatus() 
    { 
     if (sqlConnection.State == ConnectionState.Open) 
     { 
      sqlConnection.Close(); 
     } 
    } 

Quelle est la meilleure approche pour effectuer cette opération.

Merci

+0

les deux réponses ci-dessous sont les bonnes réponses pour vous, la raison pour laquelle vous voulez utiliser une déclaration d'utilisation est parce que son jetable. Il fermera automatiquement la connexion lorsque son achèvement –

+0

@SimonPrice remercie l'homme –

Répondre

2

Votre motif d'ouverture et de fermeture est correct. Cependant, vous devez noter que cela n'ouvre pas et ne ferme pas la connexion à SQL Server, donc cela ne répond pas vraiment à vos préoccupations concernant l'utilisation de la mémoire et le processeur - en fait, cela ne fera aucune différence. Ce qui Open et Close est de louer et de renvoyer une connexion au pool de connexion ADO sur le PC client. Cela signifie que la fermeture d'une connexion ADO n'est pas garantie (et, dans la plupart des cas, ne le sera pas), fermez et libérez la connexion au serveur SQL. C'est parce que l'établissement et l'authentification d'une connexion est relativement cher et lent, de sorte que le pool de connexion ADO conserve vos connexions dans un pool, toujours ouvert, juste au cas où vous souhaitez rétablir une connexion. Ce qui fait la différence pour SQL Server, c'est le nombre de requêtes simultanées qu'il doit exécuter - et la taille de l'ensemble de données des requêtes, ainsi que la taille totale des données dans la base de données.

Les requêtes simultanées compriment le processeur et les jeux de données renvoyés réduisent la RAM disponible. Évidemment, plus votre base de données est grande, moins il y a de mémoire cache dans la RAM et moins vous aurez de chances d'obtenir un cache lors de l'interrogation.

En pratique, mon expérience avec les éditions SQL Express est que vous ne remarquerez aucune différence avec l'édition complète de SQL Server, sauf si vous faites des choses très spécifiques;

1) Écrire un outil de style BI qui permet à l'utilisateur de construire des requêtes définies par l'utilisateur ou par l'utilisateur. 2) Écriture terrible SQL - "big SQL" peut masquer votre mauvaise syntaxe de requête, mais Express ne sera pas en mesure de le faire, car il a moins de RAM disponible pour jouer avec.

Si vous écrivez un SQL efficace et contraint, vous ne rencontrerez probablement jamais les limitations de SQL Express.

+0

merci de répondre dans les détails. J'ai un maximum de 10 requêtes qui s'exécutent en continu. Je me sens un problème de performance depuis quelques mois. Je pense qu'il y a une impasse. Coz quand je redémarre Server tout va être normal. Alors pensez-vous que c'est un problème avec "Express Version Limitation"? Dois-je le mettre à niveau vers la version standard ou devrais-je revérifier mon C# pour toute échappatoire? –

+0

Vous avez 10 requêtes simultanées, ou 10 requêtes que vous exécutez dans une boucle? Si ses 10 requêtes s'exécutent dans une boucle alors SQL Express n'est pas votre problème. Même si vous avez 10 requêtes simultanées s'exécutant sans fin, je ne m'attendrais pas à ce que SQL Express ait un problème avec cela. Le redémarrage du serveur ne devrait faire aucune différence. Essayez tout ce qui est normal (par exemple, Windows Performance Monitor, SQL Server Profiler) pour voir ce qui se passe sur votre serveur. – PhillipH

5

utilisent juste using comme il dispose de la connexion une fois fait.

using(SqlConnection conn = new SqlConnection("Connection string")){ 
    //do sql stuff 
    conn.Open(); 
    //etc etc 
    conn.Close(); 
} 
+0

Merci Man pour votre suggestion aimable –

+1

Note: 'conn.Close();' est optionnel comme lorsque vous disposez de la connexion, il fermera la connexion automatiquement – FakeCaleb

2

Vous voulez utiliser le modèle jetable pour assurer que tout est fermé et bien placé:

var query = "select * from ValidId where [email protected]"; 

using (var conn = new System.Data.SqlClient.SqlConnection(usingConnectionString)) 
using (var command = new System.Data.SqlClient.SqlCommand(query, conn)) 
{ 
    command.Parameters.Add("@id", SqlDbType.Int).Value = Id; 
    conn.Open; 

    using (var reader = command.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      string Test = reader["Id"].ToString(); 
     } 
    } 

    command.Parameters.Clear(); 
} 

Vous n'avez pas besoin de vérifier l'état de connexion; il va fermer quand il est disposé. Une chose à noter: il est recommandé de spécifier explicitement vos types de données de paramètre. J'ai supposé SqlDbType.Int dans votre cas, mais vous pouvez le changer pour ce qu'il est réellement.

Autre chose à noter: vous ne voulez pas trop faire à l'intérieur du lecteur en boucle. Vous voulez construire votre collection ou autre et sortir de là. Plus votre connexion est courte, mieux c'est. En effet, vous risquez de conserver un verrou de lecture sur certaines lignes de la base de données, ce qui peut affecter les autres utilisateurs et leurs applications.

+1

La connexion doit être ouvert manuellement sauf si vous utilisez la méthode Fill() sur l'adaptateur de données qui s'ouvre automatiquement (et se ferme) pour vous. Dans quoi utilisez-vous l'adaptateur dans votre exemple? Il semble être inutilisé? –

+1

@DanDef - Oui, j'ai adapté un extrait qui utilise un adaptateur de données au lecteur de données pour cette question; ma faute. Je ne savais pas ExecuteReader n'ouvre pas la connexion, bon à savoir. –

+0

@ rory.ap Y a-t-il un effet de Using Statement sur la performance? Je veux dire que si j'utiliser Using Statement, mon application sera plus rapide? –