为什么 DataGridView 不更新数据库?

Why wont DataGridView Update Database?

我有一个 DataGridView,其中填充了我数据库中的数据集。我试图在 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();
    }  
}

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

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

其他一些注意事项

  • 您不需要 DataSet。一个DataTable就够了。
  • 当您通过将 SqlDataAdapter 传递给构造函数来创建 SqlCommandBuilder 时,所有插入、更新和删除命令都会自动生成,您不需要自己做任何事情,所以 GetUpdateCommand() 没有必要。
  • 调用EndCurrentEdit cause the changes which you made on an IEditableObject被保存到基础数据源。 DataRowView 是网格行后面的对象是一个 IEditableObject,您应该调用货币管理器的 EndCurrentEdit,这会导致 DataRowViewEndEdit 被调用并提交更改基础 DataRow 并结束编辑会话。
  • 如果您将网格绑定到 BindingSource,调用 BindingSourceEndEdit 将执行相同的操作。
  • 保存数据后,无需手动调用AcceptChanges
  • 您需要在代码中添加异常处理。

因为你在使用 SqlCommandBuilder,我已经很久没有使用它了,我正在寻找更多信息,但我相信你只能更新一个 table,没有连接,并且必须定义唯一键,否则您可能需要手动生成更新语句。

reference