为啥 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 CopyCopy if Newer

【讨论】:

很高兴能提供帮助。现在,由于您是本网站的新用户,我建议您阅读How does accepting an answer work?

以上是关于为啥 DataAdapter.Update 啥也不更新?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我调用 DataAdapter.Update() 时,此 C# 代码会生成语法错误?

为啥程序会汇编,但啥也不做?

为啥当我尝试访问绑定对象的属性时 Xamarin 啥也不呈现?

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

DataAdapter Update 方法批量更新多行

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