2010-06-20 8 views
10

Est-ce possible en utilisant une instruction using C# SQL?L'instruction C# using, SQL et SqlConnection

private static void CreateCommand(string queryString, 
    string connectionString) 
{ 
    using (SqlConnection connection = new SqlConnection(
       connectionString)) 
    { 
     SqlCommand command = new SqlCommand(queryString, connection); 
     command.Connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
} 

Que se passe-t-il s'il y a une erreur lors de l'ouverture de la connexion?

L'instruction à l'aide est d'essayer et enfin
Aucune prise

Donc, si je surprends en dehors des supports à l'aide des prises sera rattraper l'erreur d'ouverture connexion?

Si non, comment implémenter cela en utilisant l'instruction using indiquée ci-dessus?

+0

TIAS (.........) – zerkms

Répondre

13

Il est possible de le faire en C# (je vois aussi que le code est exactement indiqué dans MSDN http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx). Toutefois, si vous devez être sur la défensive et, par exemple log des exceptions possibles qui pourraient aider le dépannage dans un environnement de production, vous pouvez utiliser cette approche:

private static void CreateCommand(string queryString, 
string connectionString) 
{ 
    using (SqlConnection connection = new SqlConnection(
      connectionString)) 
    { 
     try 
     { 
      SqlCommand command = new SqlCommand(queryString, connection); 
      command.Connection.Open(); 
      command.ExecuteNonQuery(); 
     } 
     catch (InvalidOperationException) 
     { 
      //log and/or rethrow or ignore 
     } 
     catch (SqlException) 
     { 
      //log and/or rethrow or ignore 
     } 
     catch (ArgumentException) 
     { 
      //log and/or rethrow or ignore 
     } 
    } 
} 
+0

MERCI, et oui son exact au code msdn, apprenez ... – user287745

5

Si vous voulez attraper une erreur, vous devez tout emballer dans le bloc try - catch. Les blocs using garantissent simplement que les ressources non gérées sont éliminées et ne peuvent pas gérer les exceptions.

En outre, SqlCommand implémente IDisposable, donc je suggère de mettre cela dans un bloc using ainsi.

1

Oui, vous pouvez mettre le bloc using dans un bloc try et le catch suivant attraperez des erreurs liées au bloc try.

2

Il suffit de l'écrire explicitement:

SqlConnection connection = new SqlConnection(connectionString); 
try 
{ 
    using (SqlCommand command = new SqlCommand(queryString, connection)) 
    { 
     command.Connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
} 
catch (Exception e) 
{ 
    // ...handle, rethrow. Also, you might want to catch 
    // more specific exceptions... 
} 
finally 
{ 
    connection.Close(); 
} 
+0

Comment pas? C'est ce que l'utilisation de SqlConnection dans un bloc utilisant finirait par appeler. –

+0

un problème de logique ai-je raison? une prise se produit alors fine prise manipulée et enfin fonctionne. mais qu'en est-il si l'erreur ne se produit pas? connection open-work done-using ferme implicitement la connexion et tente ensuite de fermer la connexion fermée! ERREUR ..... DROIT? – user287745

+0

Non. Dans les deux cas (en utilisant "using", et en l'écrivant explicitement), le bloc finally sera appelé. Résultat: SqlConnection.Close() est appelé. –

0

Ajouter un index unique à la base de données pour les champs et attraper l'erreur .

Ne réinstallez pas la connexion SQL pour chaque ligne. L'ouverture et la fermeture d'une connexion nécessitent beaucoup de ressources. Essayez quelque chose comme ceci:

protected void btn_insert_Click(object sender, EventArgs e) 
{ 
    string connStr = "your connection string"; 
    SqlCommand cmd; 

    using (SqlConnection con = new SqlConnection(connStr)) 
    { 
     con.Open(); 
     foreach (GridViewRow g1 in GridView1.Rows) 
     { 
      try 
      { 
       cmd = new SqlCommand("command text", con); 
       cmd.ExecuteNonQuery(); 
      } 
      catch (SqlException sqlEx) 
      { 
       //Ignore the relevant Sql exception for violating a sql unique index 
      } 
     } 
    } 
} 
Questions connexes