为啥 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 newerCopy 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# 代码会生成语法错误?

启动后如何停止执行dataAdapter.update

DataAdapter Update 方法批量更新多行

使用 C# dataAdapter.Fill() 和 dataAdapter.Update() 将表的数据从一个数据库传输到另一个数据库的同一个表

在 DataAdapter.Update/Refresh 后未设置 DataTable 标识列,使用“而不是”触发器(SqlServer 2005)

如何使用 DataAdapter.Update 方法同时更新 Access 数据库和 .NET DataSet 对象?