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
Caso contrário, como implementar isto usando a declaração a acima apresentada?
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
}
}
}
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.
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();
}
Sim, pode colocar o bloco {[[0]} num bloco try
, e o seguinte catch
irá detectar quaisquer erros relacionados com o bloco try
.
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
}
}
}
}