【发布时间】:2021-08-06 05:48:35
【问题描述】:
我已将 DataGridView 绑定到 .Net 5.0 WinForms 项目中的 SQL Server 表。显示数据效果很好。
我想在移到 DataGridView 中的另一行后立即更新数据库的版本。但我还没有找到一种方法来做到这一点。 here 提出的解决方案似乎不适用于 OleDbDataAdapter。 Update 方法不接受 DataRow。 DOCS 中的示例需要我尽量避免的 DataSet。其他示例使用按钮来保存更改。
数据是这样加载的:
var dataAdapter = new OleDbDataAdapter(sqlQueryString, connString);
var dataTable = new DataTable();
dataAdapter.Fill(dataTable); // fill data table from SQL server
var bindingSource = new BindingSource();
bindingSource.PositionChanged += new System.EventHandler(bindingSource_PositionChanged);
bindingSource.DataSource = dataTable; // connect binding source to data table
dataGridView.DataSource = bindingSource; // connect DataGridView to binding source
对于更新,我终于尝试了这个:
private void bindingSource_PositionChanged(object sender, EventArgs e)
{
DataRow dataRow = ((DataRowView)((BindingSource)sender).Current).Row;
if (dataRow.RowState == DataRowState.Modified) // this is successful
{
dataAdapter.Update(dataRow); // compile error
}
}
我得到编译错误
无法从“System.Data.DataRow”转换为“System.Data.DataRow[]”。
感谢任何提示。
【问题讨论】:
-
您的数据库提供者对象非常强大。如果您在表单级别声明它们以便它们持久存在,您可以配置它们以便您只需
Update()DataAdapter 并应用所有待处理的更改。也无需一次跟踪移动和更新 1 行 - 数据表可以存储许多不同的更改。 -
DataAdapter.Update 不能有 DataRow 类型的参数。您需要传递一个 DataRow 数组,因此只需更改为 dataAdapter.Update(new [] {dataRow});
-
附带说明,请考虑使用
SqlClient托管驱动程序而不是OleDb。 -
@Ňɏssa 实际上,我已经在包含 DataGridView 的 UserControl 中声明了它们。我刚刚将这些线路拼凑在一起,因此我不需要发布整个解决方案。我不想将其移至表单级别。 UserControl 应该是自治的。
-
@Steve 这可能是方向 - 谢谢。我已将该行作为唯一元素分配给一个数组,并将该数组传递给 Update。它运行没有错误,但不更新数据库。当我移回已编辑的行时,我收到错误消息:“在传递带有修改行的 DataRow 集合时,更新需要有效的 UpdateCommand。”有什么建议吗?
标签: c# sql-server winforms datagridview oledb