Оператор c# using, SQL и SqlConnection
возможно ли это с помощью оператора using 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();
}
}
Что делать, если возникла ошибка при открытии соединения?
оператор using-это try and finally
Нет подвоха
Итак, если я поймаю вне использования скобок, поймает ли уловка ошибку открытия соединения?
Если нет, то как реализовать это с помощью using
оператор a, показанный выше?
5 ответов
Это можно сделать в C# (я также вижу, что код точно показан в MSDN http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx) - ... Однако, если вам нужно защищаться и, например, регистрировать потенциальные исключения, которые помогут устранить неполадки в рабочей среде, вы можете использовать следующий подход:
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
блок. using
блоки просто гарантируют, что неуправляемые ресурсы утилизированы, они не могут обрабатывать исключения.
иSqlCommand
осуществляет IDisposable
, поэтому я бы предложил поместить это в using
блок, а также.
просто пишу явно:
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();
}
Да, вы можете поставить using
блок try
блок и следующее catch
будет ловить любые ошибки, связанные с try
блок.
добавьте уникальный индекс в базу данных для полей и поймайте ошибку.
не восстанавливайте соединение SQL для каждой строки. Открытие и закрытие соединения является ресурсоемким. Попробуйте что-то вроде этого:
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
}
}
}
}