表单中有一个DataGridView,并且有一个保存按钮。 DataAdapter和DataSet都是自动生成的。 我想使用DataAdapter.Update()更新数据库,但是当我在.mdf中打开表或再次生成解决方案时,更新了DataGridView之后,似乎没有任何改变。
我知道有人问过这个问题,并阅读了一些帖子,试图找到解决方案,但这没用。
代码示例
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");
}
}
}
}
答案 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 newer
或Copy Never
(在这种情况下,请添加脚本以将文件复制到bin \ debug文件夹(如果不存在)。并且不要过多地关注资源管理器中原始的.mdf
。
其他说明:
myTableTableAdapter.Adapter.UpdateCommand = sqlCommandBuilder.GetUpdateCommand();
之类的行不是必需的。
与DataAdapter关联时,如果DbCommandBuilder为空引用,则它们会自动生成DataAdapter的InsertCommand,UpdateCommand和DeleteCommand属性。如果属性的命令已经存在,则使用现有命令。 MSDN
我需要在致电BindingSource.EndEdit()
this.Validate();