【问题标题】:Why DataAdapter.Update() does not update the database为什么 DataAdapter.Update() 不更新数据库
【发布时间】:2020-07-25 22:13:41
【问题描述】:

我的表单中有一个 DataGridView,我有一个保存按钮。 DataAdapter 和DataSet 都是自动生成的。 我想使用 DataAdapter.Update() 来更新我的数据库,但是当我在 .mdf 中打开表或再次生成解决方案时更新 DataGridView 后似乎没有任何变化。

我知道有人问过这个问题并阅读了一些帖子,试图找到解决方案但它不起作用。

  1. 我已将 .mdf 文件属性“复制到输出目录”设置为“如果较新则复制”
  2. 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");
            }

        }
    }
}

【问题讨论】:

    标签: c# sql-server winforms datagridview ado.net


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 1970-01-01
      • 2012-04-04
      • 2016-12-12
      • 2015-07-21
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      相关资源
      最近更新 更多