如何使用 Datagridview 绑定源 C# 更新 SQL Server 数据库

本文关键字:更新 SQL Server 数据库 何使用 Datagridview 绑定 | 更新日期: 2023-09-27 18:30:27

我正在用 C# 编写一个 Winforms 应用程序,使用户能够使用 datagridview 编辑和更新数据库。

问题是,我无法正常工作。我唯一设法实现的是更新 datagridview 显示的内容,但是当我进入数据库表时,数据没有变化。我已经搜索了很多讨论这个问题的网站,但没有一个对我有用。

到目前为止,我尝试过的事情:

  • 将数据库绑定到 DataGridView
  • Copy to Output Directory属性更改为Copy if newer
  • 使用带有或不带有任何更新查询的dataAdapter.Update((DataTable)bindingSource1.DataSource)执行。
  • 在不dataAdapter.update(...)的情况下执行更新查询。

这是我的代码:

public Form1()
{
    InitializeComponent();
    GetData("SELECT * FROM Table1");
}
void GetData(string selectCommand)
{
    SqlConnection conn = new SqlConnection(Properties.Settings.Default.NewDBTESTConnectionString);
    dataAdapter = new SqlDataAdapter(selectCommand, conn);
    commandBuilder = new SqlCommandBuilder(dataAdapter);
    table = new DataTable();
    dataAdapter.Fill(table);
    bindingSource1.DataSource = table;
    dataGridView1.DataSource = bindingSource1;
}
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
        dataAdapter.Update((DataTable)bindingSource1.DataSource);    
}

如何使用 Datagridview 绑定源 C# 更新 SQL Server 数据库

如果不调用bindingSource1.EndEdit基础 DataTable 不会看到任何更改,因此 Update 命令没有任何要更新的内容。

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    bindingSource1.EndEdit();
    DataTable dt = (DataTable)bindingSource1.DataSource;
    // Just for test.... Try this with or without the EndEdit....
    DataTable changedTable = dt.GetChanges();
    Console.WriteLine(changedTable.Rows.Count);
    int rowsUpdated = da.Update(dt);    
    Console.WriteLine(rowsUpdated);
}

您可以使用保存或更新按钮来执行代码,如下所示:

bindingSource1.EndEdit();
DataTable dt = (DataTable)bindingSource1.DataSource;   
dataAdaper.Update(dt);    

您将保存所做的所有更改,但是如果您先对 datagridview 列进行排序,然后更改数据,然后运行上面的保存代码,您将错过一条记录,在排序之前,排在前面的第一条记录。要修复它,您必须对其进行排序然后保存它们。最好的方法是,如果您知道要对哪一列进行排序,则需要在将数据加载到 datagridview 时对其进行排序。

庄佳

您需要在 CellEndEdit 事件中重新创建整个 SqlDataAdapter。

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        SqlConnection conn = new SqlConnection(connectionString);
        var dataAdapter = new SqlDataAdapter("select * from [table]", conn);
        var commandBuilder = new SqlCommandBuilder(dataAdapter);
        dataAdapter.UpdateCommand = new SqlCommandBuilder(dataAdapter).GetUpdateCommand();            
        bindingSource1.EndEdit();
        dataAdapter.Update((DataTable)bindingSource1.DataSource);
    }