为什么DataGridView不会更新数据库?

时间:2016-08-05 20:17:16

标签: c# sql-server winforms datagridview ado.net

我有一个DataGridView,用我的数据库中的DataSet填充。我试图在DataGridView中进行更改,并在每次按“Enter”时将这些更改应用于数据库。

我已经阅读了很多同样的问题,并研究了这个主题,但我仍然无法弄清楚为什么我不能将我的DataGridView中的更改应用到我的数据库。 (我知道以前曾经问过这个问题,但仍然无法解决这个问题。)

有谁能告诉我我做错了什么?

DataSet ds = new DataSet();
string constring = System.Configuration.ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
SqlDataAdapter da;
public ListForm()
{
    //Setting up DataGridView with data.
    InitializeComponent();
    da = new SqlDataAdapter("Select * from Contact_List", constring);

    SqlCommandBuilder cmb = new SqlCommandBuilder(da);
    da.UpdateCommand = cmb.GetUpdateCommand();
    da.Fill(ds, "Contact_List");
    dataGridView1.DataSource = ds;
    dataGridView1.DataMember = "Contact_List";
}

//Trying to update database with DataAdapter
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    using (SqlConnection con = new SqlConnection(constring))
    {
        con.Open();
        //I believe that the changes to the database should be applied here
        //Buts its not working
        da.Update(ds, "Contact_List",); 
        ds.AcceptChanges();
        con.Close();
    }  
}

2 个答案:

答案 0 :(得分:2)

在尝试保存更改之前,您应该结束当前编辑:

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    var cm = dataGridView1.BindingContext[ds, "Contact_List"];
    cm.EndCurrentEdit();
    da.Update(ds, "Contact_List");
}

其他一些说明

  • 您不需要DataSetDataTable就足够了。
  • 当您通过将SqlCommandBuilder传递给构造函数来创建SqlDataAdapter时,所有插入,更新和删除命令都将自动生成,您不需要自己做任何事情,所以{{1 }} 没有必要。
  • 调用EndCurrentEdit会导致您对IEditableObject所做的更改保存到基础数据源。 GetUpdateCommand()这是网格行后面的对象DataRowView,您应该调用货币管理器的IEditableObject,这会导致调用EndCurrentEdit EndEdit并提交更改基础DataRowView并结束编辑会话。
  • 如果您将网格绑定到DataRow,则调用BindingSource的{​​{1}}也会这样做。
  • 保存数据后,您无需手动拨打EndEdit
  • 您需要为代码添加异常处理。

答案 1 :(得分:0)

这是因为你正在使用SqlCommandBuilder,我很久没有使用它了,我正在寻找更多信息,但我相信你只能更新一个表,没有连接,并且必须有一个独特的键定义,否则您可能希望手动生成UPDATE语句。

reference

相关问题