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

时间:2014-11-02 13:21:04

标签: c# ado.net

在下面的代码中,我在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(tab)我也尝试过adapter.Update(ds),但没有什么新东西。

这是我的表。 http://i.imgur.com/VZ7HYK6.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发生。在我看来,它没有任何意义。

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

1 个答案:

答案 0 :(得分:0)

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

所以你的代码工作正常,但你的项目配置会对你的支票造成严重破坏

只需将您的媒体资源更改为Do Not CopyCopy if Newer

即可