为什么DataAdapter.Update什么都不更新

本文关键字:更新 什么 DataAdapter Update 为什么 | 更新日期: 2023-09-27 18:28:51

在下面的代码中,我在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();

而不是适配器。更新(选项卡)我也尝试了适配器。更新(ds),但没有任何新内容。

这是我的桌子。https://i.stack.imgur.com/vhWFO.png

INSERT、UPDATE和DELETE命令由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。在我看来,这没问题。

至于主键,我的表里有一个。

为什么DataAdapter.Update什么都不更新

这是一个非常常见的场景。在项目项之间列出了数据库文件,并且将属性Copy To output Directory设置为Copy Always
这意味着,每次启动调试会话时,Visual Studio都会将MDF文件从项目位置复制到BIN''debug文件夹(或x86和RELEASE变体),覆盖那里的文件
当然,这个副本没有在上一次运行中添加最新的记录。

所以你的代码工作正常,但你的项目配置严重破坏了你的检查

只需将您的属性更改为Do Not CopyCopy if Newer