#c# #.net #asp.net #sql #sql-server
#c# #.net #asp.net #sql #sql-server
Вопрос:
Я выполняю обновление данных на SQL Server в ASP.Net.
и у меня есть только файл cs, без файла aspx / ascx, поэтому я не буду использовать здесь элемент управления SqlDataSource.
Ниже приведен мой код:
string connStr = ConfigurationManager.ConnectionStrings["XXConnString"].ConnectionString;
SqlConnection conn = new SqlConnection(connStr);
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
string query = @"exec dbo.XX_Insert_Announcement @AnnID ='" id
"', @AnnTitle ='" title
"', @AnnSubmitDateTime ='" startDate
"', @AnnProcessDateTime ='" endDate "'";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.ExecuteNonQuery();
conn.Close();
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
Я думаю, что мой код недостаточно хорош для обработки ошибок, если выполнение запроса завершилось неудачно, ошибка не выдается, и код продолжает выполняться без обновления базы данных.
Возможно, эту проблему может решить использование инструкции Using, кода, как показано ниже:
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
пожалуйста, прокомментируйте и посоветуйте, какая практика является наилучшей.
заранее благодарю вас.
Ответ №1:
Ваш второй подход лучше, но было бы лучше, если бы вы использовали Parameterized query for better prevention from a SQL Injection Attack
.
using (SqlConnection connection = new SqlConnection(connectionString))
{
using(SqlCommand command = connection.GetCommand(queryString, CommandType.Text))
{
command.Parameters.Add(new SqlParameter("AnnID", id));
command.Parameters.Add(new SqlParameter("AnnTitle", title));
............
..............
command.Connection.Open();
command.ExecuteNonQuery();
}
}
Комментарии:
1. exec dbo. XX_Insert_Announcement выглядит как вызов хранимой процедуры, поэтому я бы изменил CommandType. Введите текст в CommandType. StoredProcedure