为啥 DataAdapter.Update 啥也不更新?
Posted
技术标签:
【中文标题】为啥 DataAdapter.Update 啥也不更新?【英文标题】:Why does DataAdapter.Update update nothing?为什么 DataAdapter.Update 什么也不更新? 【发布时间】:2014-11-02 13:21:03 【问题描述】:在下面的代码中,我在 DataTable 中添加了一行并尝试更新数据库。结果,元素DataTable有添加的行,但是数据库中的表没有变化。
您能帮我解决问题吗?
string connstr = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|db.mdf;"
+"Integrated Security=True";
string command = "SELECT * FROM myTable";
var adapter = new SqlDataAdapter(command, connstr);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
var ds = new DataSet();
try
adapter.Fill(ds);
DataTable tab = ds.Tables[0];
var r = tab.NewRow();
r["name"] = "TestName";
r["length"] = 1;
r["Comment"] = "SomeComment";
tab.Rows.Add(r);
adapter.Update(tab);
catch (SqlException ex)
Console.WriteLine(ex.Message);
Console.Read();
我还尝试了adapter.Update(ds),而不是adapter.Update(tab),但没有什么新东西。
这是我的桌子。 http://i.imgur.com/VZ7HYK6.png
插入、更新和删除命令由我的代码中的 SqlCommandBuilder 提供。为了检查它们的正确性,我调用了构建器的属性:
builder.GetInsertCommand().CommandText;
builder.GetUpdateCommand().CommandText;
builder.GetDeleteCommand().CommandText;
有价值观
INSERT INTO [myTable] ([name], [length], [comment]) VALUES (@p1, @p2, @p3)
UPDATE [myTable] SET [name] = @p1, [length] = @p2, [comment] = @p3 WHERE (([Id] = @p4) AND ([name] = @p5) AND ([length] = @p6) AND ((@p7 = 1 AND [comment] IS NULL) OR ([comment] = @p8)))
DELETE FROM [myTable] WHERE (([Id] = @p1) AND ([name] = @p2) AND ([length] = @p3) AND ((@p4 = 1 AND [comment] IS NULL) OR ([comment] = @p5)))
据我了解,就我而言,查询 INSERT 发生。在我看来,没关系。
至于主键,我的表里有一个。
【问题讨论】:
我认为你应该在调用Update
之前设置UpdateCommand
属性
如何检查你的记录没有被插入?
你有什么异常吗?
命令 INSERT、UPDATE 和 DELETE 由 SqlCommandBuilder 定义,如最后的代码 sn-p 所示。据我了解,在我的情况下,行 adapter.Update 调用查询 INSERT,因为只是在现有表中添加了一行。它似乎有清晰和适当的形式。
您的项目文件之间是否列出了 MDF 文件?如果是,它的属性复制到输出目录是什么?
【参考方案1】:
这是一个很常见的场景。您在项目项之间列出了您的数据库文件,并且它的属性 Copy To output Directory
设置为 Copy Always
。
这意味着每次您启动调试会话时,Visual Studio 都会将您的 MDF 文件从项目位置复制到 BIN\DEBUG 文件夹(或 x86 和 RELEASE 变体),并覆盖那里存在的文件。
当然,这个副本没有在上一次运行中添加最新记录。
所以您的代码工作正常,但您的项目配置对您的检查造成了严重破坏
只需将您的属性更改为Do Not Copy
或Copy if Newer
【讨论】:
很高兴能提供帮助。现在,由于您是本网站的新用户,我建议您阅读How does accepting an answer work?以上是关于为啥 DataAdapter.Update 啥也不更新?的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我调用 DataAdapter.Update() 时,此 C# 代码会生成语法错误?
为啥当我尝试访问绑定对象的属性时 Xamarin 啥也不呈现?
使用 C# dataAdapter.Fill() 和 dataAdapter.Update() 将表的数据从一个数据库传输到另一个数据库的同一个表