为啥 DataAdapter.Update() 不更新数据库
Posted
技术标签:
【中文标题】为啥 DataAdapter.Update() 不更新数据库【英文标题】:Why DataAdapter.Update() does not update the database为什么 DataAdapter.Update() 不更新数据库 【发布时间】:2020-07-25 22:13:41 【问题描述】:我的表单中有一个 DataGridView,我有一个保存按钮。 DataAdapter 和DataSet 都是自动生成的。 我想使用 DataAdapter.Update() 来更新我的数据库,但是当我在 .mdf 中打开表或再次生成解决方案时更新 DataGridView 后似乎没有任何变化。
我知道有人问过这个问题并阅读了一些帖子,试图找到解决方案但它不起作用。
-
我已将 .mdf 文件属性“复制到输出目录”设置为“如果较新则复制”
BindingSource 和 BindingNavigator 工作成功。
代码示例
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace WindowsFormsApp1
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void Form1_Load(object sender, EventArgs e)
this.myTableTableAdapter.Fill(this.myDatabaseDataSet.myTable);
SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(myTableTableAdapter.Adapter);
myTableTableAdapter.Adapter.InsertCommand = sqlCommandBuilder.GetInsertCommand();
myTableTableAdapter.Adapter.DeleteCommand = sqlCommandBuilder.GetDeleteCommand();
myTableTableAdapter.Adapter.UpdateCommand = sqlCommandBuilder.GetUpdateCommand();
private void SaveSToolStripButton_Click(object sender, EventArgs e)
try
bindingSource1.EndEdit();
myTableTableAdapter.Adapter.Update(myDatabaseDataSet.myTable);
MessageBox.Show("Succeed");
catch (Exception err)
MessageBox.Show(err.Message, "Failed");
【问题讨论】:
【参考方案1】:刚刚解决了这个问题。有同样问题的朋友可以参考一下。 Why saving changes to a database fails?史蒂夫的回答对理解这个问题很有帮助。
我确实修改了我的数据库,但是当我连接数据源时,它只是再次复制,所以似乎更新失败了。
您可以手动编写连接,更改 |Directory|到您的数据库实际所在的位置。或者做这样的事情:
string dataDir = AppDomain.CurrentDomain.BaseDirectory;
if (dataDir.EndsWith(@"\bin\Debug\")
|| dataDir.EndsWith(@"\bin\Release\"))
dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
但我不建议这样做,因为它可能会在您调试时修改您的原始数据库。它应该只修改我在 bin 文件夹中的数据库,同时保持原始数据库不变。
您只需将您的.mdf
文件Copy to directory
属性设置为Copy if newer
或Copy Never
(在这种情况下,添加一个脚本以将文件复制到bin\debug 文件夹,前提是它没有不存在)。并且不要过分关注您在资源管理器中的原始.mdf
。
还有其他注意事项:
不需要像myTableTableAdapter.Adapter.UpdateCommand = sqlCommandBuilder.GetUpdateCommand();
这样的行。
当与 DataAdapter 关联时,如果 DataAdapter 的 InsertCommand、UpdateCommand 和 DeleteCommand 属性为空引用,则 DbCommandBuilder 会自动生成它们。如果某个属性的命令已经存在,则使用现有的命令。 MSDN
致电BindingSource.EndEdit()
之前需要确认一下
this.Validate();
【讨论】:
以上是关于为啥 DataAdapter.Update() 不更新数据库的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我调用 DataAdapter.Update() 时,此 C# 代码会生成语法错误?
使用 C# dataAdapter.Fill() 和 dataAdapter.Update() 将表的数据从一个数据库传输到另一个数据库的同一个表
在 DataAdapter.Update/Refresh 后未设置 DataTable 标识列,使用“而不是”触发器(SqlServer 2005)