为什么DataAdapter.Update()不更新数据库

时间:2020-04-13 11:01:03

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

表单中有一个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");
            }

        }
    }
}

1 个答案:

答案 0 :(得分:0)

解决了这个问题。有相同问题的人可以参考此内容。 Why saving changes to a database fails?史蒂夫(Steve)的答案对于理解此问题很有帮助。

我确实修改了我的数据库,但是当我连接数据源时,它只是再次复制,因此更新似乎失败了。

您可以手动更改连接,更改|目录|。到数据库实际所在的位置。或执行以下操作:

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关联时,如果DbCommandBuilder为空引用,则它们会自动生成DataAdapter的InsertCommand,UpdateCommand和DeleteCommand属性。如果属性的命令已经存在,则使用现有命令。 MSDN

  • 我需要在致电BindingSource.EndEdit()

  • 之前进行检查
this.Validate();