Ошибка при обновлении gridviewUpdating asp.net с обновлением временной метки

#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