The C# using statement, SQL, and SqlConnection

Isto é possível usando uma instrução C# SQL?

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();
    }
}
E se houver um erro ao abrir a ligação?

a declaração de utilização é tentar e finalmente
Nenhuma captura

Então, se eu apanhar fora dos parêntesis usados, a captura irá apanhar o erro de abertura da ligação?

Caso contrário, como implementar isto usando a declaração a acima apresentada?

Author: Peter Mortensen, 2010-06-20

5 answers

É possível fazer isso em C# (vejo também que o código é exatamente o mostrado no MSDN http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx). No entanto, se você precisa ficar na defensiva e, por exemplo, registo de potenciais exceções, o que ajudaria a solução de problemas em um ambiente de produção, você pode aproveitar esta abordagem:

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
        }
    }
}
 16
Author: Kevin Le - Khnle, 2010-06-20 12:02:53
Se quiser apanhar algum erro, terá de embrulhar tudo em try - catch block. using os blocos asseguram simplesmente que os recursos não geridos são eliminados, não conseguem lidar com excepções.

Também,SqlCommand implementa IDisposable, Então eu sugiro colocar isso em um bloco using também.

 5
Author: David Neale, 2010-06-20 11:48:19
Escreve-O explicitamente.
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();
}
 2
Author: Willem van Rumpt, 2010-06-20 11:49:30

Sim, pode colocar o bloco {[[0]} num bloco try, e o seguinte catch irá detectar quaisquer erros relacionados com o bloco try.

 1
Author: Femaref, 2010-06-20 11:48:46

Adicione um índice único à base de dados para os campos e apanhe o erro.

NÃO reinicie a ligação SQL para cada linha. Abrir e fechar uma conexão é um recurso intensivo. Tente algo assim:

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
            }
        }
    }
}
 0
Author: Michael, 2016-07-01 11:19:24