2013-07-11 2 views
2

Когда я пытаюсь обновить запись в GridView, следующий код не обновляет запись, но также не вызывает никаких ошибок.Как обновить запись в Gridview

 protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     string index = GridView1.Rows[e.RowIndex].Cells[1].Text; //DwgRegID 

     SqlConnection con = new SqlConnection("Data Source=MEHDI-PC\\SQLEXPRESS;Initial Catalog=PIMS;Integrated Security=True"); 

     using (SqlCommand cmd = new SqlCommand()) 
     { 
      string sql = "UPDATE dbo.Dwg_Register SET Ref = @Ref, Dwg_Ref = @Dwg_Ref,Title = @Title, Dwg_Received_Date = @Dwg_Received_Date, Rev = @Rev, Trade = @Trade, [email protected],[email protected]_Date,[email protected]_By,[email protected]_Ref,[email protected]_To,Date_Issued = Date_Issued, Purpose = @Purpose, [email protected],[email protected]_Date where DwgRegID=N'" + index + "'"; 

      cmd.Connection = con; 
      con.Open(); 
      cmd.CommandText = sql; 

      cmd.Parameters.Add(new SqlParameter("@Ref", txtRef.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Dwg_Ref", txtDwgRef.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Title", txtTitle.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Dwg_Received_Date", txtDwgReceivedDate.Text == "" ? DBNull.Value : (object)txtDwgReceivedDate.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Rev", txtRev.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Trade", ddlTrade.Text)); 
      cmd.Parameters.Add(new SqlParameter("@type1", ddlType.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Produced_Date", txtProducedDate.Text == "" ? DBNull.Value : (object)txtProducedDate.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Produced_By", ddlProducedBy.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Submittal_Ref", txtSubmittalRef.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Issued_To", ddlIssuedTo.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Date_Issued", txtDateIssued.Text == "" ? DBNull.Value : (object)txtDateIssued.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Purpose", ddlPurpose.Text)); 
      cmd.Parameters.Add(new SqlParameter("@status1", ddlStatus.Text)); 
      cmd.Parameters.Add(new SqlParameter("@Action_Date", txtActionDate.Text == "" ? DBNull.Value : (object)txtActionDate.Text)); 
      //cmd.Parameters.Add(new SqlParameter("@DwgRegID", index)); 


      cmd.ExecuteNonQuery(); 
      if (con.State == ConnectionState.Open) 
      { 
       con.Close(); 
      } 
      GridView1.DataBind(); 
     } 

      SqlConnection con1 = new SqlConnection("Data Source= MEHDI-PC\\SQLExpress; Initial Catalog=PIMS; Integrated Security=True"); 
      string sql1 = "SELECT DwgRegID,Ref,Dwg_Ref,Title,Dwg_Received_Date,Rev,Trade,type1,Produced_Date,Produced_By,Submittal_Ref,Issued_To,Date_Issued,Purpose,status1,Action_Date from dbo.Dwg_Register"; 
      con1.Open(); 
      SqlDataAdapter da = new SqlDataAdapter(sql1,con1); 
      DataSet ds1 = new DataSet(); 
      da.Fill(ds1); 
      GridView1.DataSource = ds1; 
      GridView1.DataBind(); 
      if (con1.State == ConnectionState.Open) 
      { 
       con1.Close(); 
      } 


      GridView1.EditIndex = -1; 

      GridView1.DataBind(); 

      MultiView1.SetActiveView(ViewGrid); 

      lblUpdate.Text = "Record updated sucessfully."; 


    } 

Когда я запускаю следующий SQL запрос в SSMS:

UPDATE dbo.Dwg_Register 
SET Ref=4 
from dbo.Dwg_Register 
where DwgRegID=23 

эта команда делает значение магазина 4 в dbo.Dwg_Register. Но эта команда не хранит значения в таблице sql из GridView.

Мой EditRow код функции выглядит следующим образом:

  protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
    { 

     MultiView1.SetActiveView(ViewGrid); 

     GridView1.EditIndex = e.NewEditIndex; 

     GridView1.DataBind(); 

}

Эта функция изменяет RowEditingRowState в GridView редактировать-режим. Но когда я редактирую значение ячейки в Gridview и нажимаю кнопку обновления, чтобы сохранить новое значение в таблице Sql, функция обновления не делает этого. Этот код не вызывает ошибок. Пожалуйста, помогите мне определить, где я могу ошибиться. Спасибо.

+0

Об ошибке в SSMS: вам необходимо настроить все параметры, которые вы выполняете в коде в SSMS. В противном случае вы получите эту ошибку. Например, вы бы сделали что-то вроде 'declare @ref varchar (30)' для параметра '@ ref'. –

+1

В SSMS поместите реальные значения (а не как параметры) так, как они есть на форме, и проверьте, прошел ли запрос или дает ошибку. Я полагаю, что данные для вашего запроса плохо сформированы. – Anshuman

+0

проверьте подключение к базе данных. – ridoy

ответ

2

Выполняйте проверку ошибок перед вставкой данных.

Эта ошибка говорит вам, что txtRef.Text не имеет значения, но требуется значение.

После того, как вы завершили проверку ошибок для значения Ref, вы должны продолжить все свои другие значения.

Вы не хотите создавать беспорядок в своей базе данных.

UPDATE:

Убедитесь, что ваш GridView обновляет только правильные типы строк.

Мне не очень нравится использовать инструмент AddWithValue, потому что похоже, что он не позволяет людям понять их базу данных. Ваши методы Add(new SqlParameter( по существу делают именно это.

Например, эти две линии производят идентичные результаты:

cmd.Parameters.AddWithValue("@Ref", txtRef.Text); 

cmd.Parameters.Add(new SqlParameter("@Ref", txtRef.Text)); 

Что @Ref в вашей базе данных? Integer? varchar(50)? Очевидно, что будет большая разница в том, как база данных будет обрабатывать эти два.

Если бы это было integer, она должна действительно быть записана в виде:

cmd.Parameters.Add("@Ref", SqlDbType.Int).Value = Convert.ToInt32(txtRef.Text.Trim()); 

Если бы это было varchar(50), она должна действительно быть записана в виде:

cmd.Parameters.Add("@Ref", SqlDbType.VarChar, 50).Value = txtRef.Text.Trim(); 

Поскольку я ничего не знаю о вашей базе данных, я остался с использованием AddWithValue, но я бы настоятельно рекомендовал посмотреть на дизайн таблиц базы данных, а затем сопоставить ваш SqlParameters с тем, как они разработаны.

Я также предлагаю использовать const SQL строки подключения, так как база данных не будет меняться, пока ваша программа использует его:

private static string m_sqlConn = "Data Source=MEHDI-PC\\SQLEXPRESS;Initial Catalog=PIMS;Integrated Security=True"; 

Я также создал метод staticDbSafe в «сообщение» данные до его вставки. Этот метод позволяет вам легко направлять все ваши данные, чтобы убедиться в их безопасности. Кроме того, изменение способа позже, чтобы добавить больше функциональные возможности легко сделать, и мгновенно переводит весь код вы используете его.

private static object DbSafe(object value) { 
    if ((value != null) || (value != DBNull.Value)) { 
    string strVal = value.ToString(); 
    if (!String.IsNullOrEmpty(strVal)) { 
     return strVal.Trim(); 
    } 
    } 
    return DBNull.Value; 
} 

Там также нет никаких оснований для Вас, чтобы делать два (2) отдельный SQL объекты (SqlCommand и SqlDataAdapter) для выполнения вашей задачи.

Вот как я написал модифицированную версию:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { 
    if (GridView1.Rows[e.RowIndex].RowType == DataControlRowType.DataRow) { 
    string index = GridView1.Rows[e.RowIndex].Cells[1].Text; //DwgRegID 
    string sqlUpdate = "UPDATE dbo.Dwg_Register SET " + 
     "[email protected], [email protected]_Ref, [email protected], [email protected]_Received_Date, " + 
     "[email protected], [email protected], [email protected], [email protected]_Date, " + 
     "[email protected]_By, [email protected]_Ref, [email protected]_To, " + 
     "Date_Issued=Date_Issued, [email protected], [email protected], [email protected]_Date " + 
     "WHERE DwgRegID=N'" + index + "'"; 
    string sqlSelect = "SELECT DwgRegID, Ref, Dwg_Ref, Title, Dwg_Received_Date, Rev, Trade, type1, Produced_Date, Produced_By, Submittal_Ref, " + 
     "Issued_To, Date_Issued, Purpose, status1, Action_Date " + 
     "from dbo.Dwg_Register"; 
    var table = new DataTable(); 
    using (var cmd = new SqlCommand(sqlUpdate, new SqlConnection(m_sqlConn))) { 
     cmd.Parameters.AddWithValue("@Ref", DbSafe(txtRef.Text)); 
     cmd.Parameters.AddWithValue("@Dwg_Ref", DbSafe(txtDwgRef.Text)); 
     cmd.Parameters.AddWithValue("@Title", DbSafe(txtTitle.Text)); 
     cmd.Parameters.AddWithValue("@Dwg_Received_Date", DbSafe(txtDwgReceivedDate.Text)); 
     cmd.Parameters.AddWithValue("@Rev", DbSafe(txtRev.Text)); 
     cmd.Parameters.AddWithValue("@Trade", DbSafe(ddlTrade.Text)); 
     cmd.Parameters.AddWithValue("@type1", DbSafe(ddlType.Text)); 
     cmd.Parameters.AddWithValue("@Produced_Date", DbSafe(txtProducedDate.Text)); 
     cmd.Parameters.AddWithValue("@Produced_By", DbSafe(ddlProducedBy.Text)); 
     cmd.Parameters.AddWithValue("@Submittal_Ref", DbSafe(txtSubmittalRef.Text)); 
     cmd.Parameters.AddWithValue("@Issued_To", DbSafe(ddlIssuedTo.Text)); 
     cmd.Parameters.AddWithValue("@Date_Issued", DbSafe(txtDateIssued.Text)); 
     cmd.Parameters.AddWithValue("@Purpose", DbSafe(ddlPurpose.Text)); 
     cmd.Parameters.AddWithValue("@status1", DbSafe(ddlStatus.Text)); 
     cmd.Parameters.AddWithValue("@Action_Date", DbSafe(txtActionDate.Text)); 
     //cmd.Parameters.Add(new SqlParameter("@DwgRegID", index)); 
     try { 
     cmd.Connection.Open(); 
     cmd.ExecuteNonQuery(); 
     cmd.CommandText = sqlSelect; 
     cmd.Parameters.Clear(); 
     table.Load(cmd.ExecuteReader()); 
     } catch (SqlException err) { 
     Response.Write(err.Message); 
     } finally { 
     cmd.Connection.Close(); 
     } 
    } 
    GridView1.DataSource = table; 
    GridView1.DataBind(); 
    MultiView1.SetActiveView(ViewGrid); 
    lblUpdate.Text = "Record updated sucessfully."; 
    } 

} 

Кроме того, вы заметите, что выше я добавил try/catch/finally блок, который только попадается SqlException ошибки, то он сразу же закрывает соединение с базой данных.

Я не уверен, что делает ваш GridViewEditEventArgs и/или если он причиняет боль, поэтому я оставил его в покое.

Я надеюсь, что это поможет. Это объяснялось слишком долго.

+0

Вы правы. Я сделал отладочную контрольную точку и узнал, что txtRef.Text не имеет значения, как все остальные поля в записи. Мне интересно, почему. Я обновил свой вопрос (добавлена ​​функция «RowEditing»). Функция «RowEditing» изменяет режим «RowState» для редактирования, но моя функция обновления не может считывать из ячейки строки режима редактирования, а затем сохраняет это значение в таблице «Sql». Надеюсь, ты понимаешь мою проблему. Спасибо за ваше время и помощь. –

+0

Я добавил раздел GREAT BIG update с большим количеством объяснений. Пожалуйста, +1, если это поможет, и отметьте его, если он решает вашу проблему. – jp2code

Смежные вопросы