如何使用 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);
}
如果不调用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);
}