2010-06-20 25 views
10

¿Es esto posible usando una sentencia using C# SQL?La sentencia C# using, SQL y 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(); 
    } 
} 

¿Qué sucede si se produce un error al abrir la conexión?

La instrucción using es tratar y finalmente
No hay trampa

Así que si cojo fuera de los soportes se utilizan la captura coger la conexión de error al abrir?

De lo contrario, ¿cómo implementar esto con el uso de la declaración using que se muestra arriba?

+0

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

Respuesta

13

Es posible hacerlo en C# (también veo que el código se muestra exactamente en MSDN http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx). Sin embargo, si tiene que estar a la defensiva y, por ejemplo registrar posibles excepciones que ayuden a la solución de problemas en un entorno de producción, se puede tomar este enfoque:

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

MUCHAS GRACIAS, y sí, su código exacto para msdn, estoy aprendiendo ... – user287745

5

Si desea detectar cualquier error, deberá envolver todo en try - catch bloque. Los bloques using simplemente aseguran que los recursos no gestionados se eliminen, no pueden manejar excepciones.

Además, SqlCommand implementa IDisposable, por lo que sugeriría poner eso en un bloque using también.

1

Sí, se puede poner el bloque en un bloque usingtry, y la siguiente catch presionen ningún error relacionado con el bloque try.

2

Sólo tiene que escribir a cabo de manera explícita:

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

¿Cómo no? Es lo que usaría SqlConnection en un bloque de uso terminaría llamando. –

+0

algún problema de lógica ¿estoy en lo correcto? se produce una captura, luego se maneja la captura fina y finalmente funciona. pero ¿qué ocurre si no ocurre el error? conexión open-work done-using cierra la conexión implícitamente y finalmente también intenta cerrar la conexión cerrada. ERROR ..... ¿DERECHO? – user287745

+0

No. En ambos casos (usando "usar" y escribirlo explícitamente) se llamará al bloque finally. Como resultado, se llama a SqlConnection.Close(). –

0

Agregar un índice único a la base de datos para los campos y detectar el error .

No reinstale la conexión de SQL para cada fila. Abrir y cerrar una conexión requiere muchos recursos. Intente algo como esto:

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 
      } 
     } 
    } 
} 
Cuestiones relacionadas