#c# #mysql #asp.net #sql-server
#c# #mysql #asp.net #sql-сервер
Вопрос:
У меня есть две кнопки, setIn и SetOut. У них обоих есть ОБНОВЛЕНИЕ ИМЕНИ команды (у меня есть две кнопки, так как я бы хотел, чтобы текст на кнопке отличался в зависимости от значения одного поля в строке.
У меня возникает проблема в том, что когда я запускаю инструкцию update SQL, она выдает мне ошибку. В нем говорится:
Исключение типа ‘System.Data.SqlClient.SQLException’ произошло в System.Data.dll но не был обработан в пользовательском коде
Дополнительная информация: Неправильный синтаксис рядом с ’14’.
Это означает, что существует проблема с отметкой даты и времени, с помощью которой я пытаюсь обновить строку (я делаю обновление в 14.02вечера).
Мой код страницы aspx.cs:
protected void GridView1_RowUpdating(object sender, System.Web.UI.WebControls.GridViewUpdateEventArgs e)
{
Label id = GridView1.Rows[e.RowIndex].FindControl("lbl_Index") as Label;
int rowToUpdate = Int32.Parse(id.Text);
con = new SqlConnection(cs);
int scopeValue;
con = new SqlConnection(cs);
cmd = new SqlCommand();
cmd.CommandText = "SELECT in_scope FROM " databaseName " WHERE id = '" rowToUpdate "'";
cmd.Parameters.AddWithValue("@id", rowToUpdate);
cmd.Connection = con;
try
{
con.Open();
scopeValue = Convert.ToInt32(cmd.ExecuteScalar());
//database_entries.Text = recordCount.ToString();
}
finally
{
con.Close();
}
string modifiedBy = userManagement.getWeldID();
string updateDate = DateTime.UtcNow.ToString("dd/MMM/yyyy HH:mm:ss");
{
if (scopeValue == 1)
{
// Label id = GridView1.Rows[e.RowIndex].FindControl("lbl_Index") as Label;
string sqlStatement = "";
con = new SqlConnection(cs);
// SqlCommand cmd = new SqlCommand();
sqlStatement = @"update dbo.Fair_Use_InScope_MIF_Alex_temp set in_scope = '0', modified_by = " modifiedBy ", date_updated = " updateDate " where id = '" rowToUpdate "'";
con.Open();
cmd = new SqlCommand(sqlStatement, con);
cmd.ExecuteNonQuery();
con.Close();
ShowData();
}
if (scopeValue == 0)
{
// Label id = GridView1.Rows[e.RowIndex].FindControl("lbl_Index") as Label;
string sqlStatement = "";
con = new SqlConnection(cs);
// SqlCommand cmd = new SqlCommand();
sqlStatement = @"update dbo.Fair_Use_InScope_MIF_Alex_temp set in_scope = '1', modified_by = " modifiedBy ", date_updated = " updateDate " where id = '" rowToUpdate "'";
con.Open();
cmd = new SqlCommand(sqlStatement, con);
cmd.ExecuteNonQuery();
con.Close();
ShowData();
}
}
}
Я в основном пытаюсь получить значение scopeValue (0 или 1) строки, и если вызывается команда Update, а значение scopeValue ранее было 0, теперь установите его равным 1 и наоборот. Мне также нужно обновить время, когда было внесено изменение, и кто внес изменения в эту строку. (оба они отображаются в gridview)
Любая помощь была бы очень признательна, поскольку я новичок в ASP.NET и C #, и SQL SERVER!!
Ответ №1:
Вы отправляете DateTime в виде строки (даже не заключая одинарные кавычки date_updated = '" updateDate "'
), и это всегда будет вызывать проблемы.
Лучше использовать параметры в вашем запросе. Это предотвращает внедрение SQL, улучшает читаемость, обеспечивает безопасность типов, больше не беспокоится о правильном использовании кавычек и т. Д.
string sqlStatement = "UPDATE dbo.Fair_Use_InScope_MIF_Alex_temp SET in_scope = 0, modified_by = @modifiedBy, date_updated = @updateDate WHERE (id = @rowToUpdate)";
using (SqlConnection connection = new SqlConnection(cs))
using (SqlCommand command = new SqlCommand(sqlStatement, connection))
{
command.Parameters.Add("@modifiedBy", SqlDbType.VarChar).Value = modifiedBy;
command.Parameters.Add("@updateDate", SqlDbType.DateTime).Value = DateTime.Now;
command.Parameters.Add("@rowToUpdate", SqlDbType.Int).Value = 35;
connection.Open();
command.ExecuteNonQuery();
}
Комментарии:
1. Спасибо за вашу помощь! Я больше не получаю это сообщение об ошибке! Могу ли я спросить, почему значение rowtoupdate равно 35? Спасибо!
2. Это выдуманное число для отображения 3 разных типов данных в моем примере. Вы можете изменить это на
rowToUpdate