c#DataSet未更新回数据库

时间:2014-10-07 11:59:59

标签: c# database ms-access dataset oledb

我试图通过OleDb使用Access数据库。我需要:

  • 从数据库获取数据到数据集
  • 更改数据集中的数据
  • 将此数据集更新回数据库。

完成前两项任务。但是我无法将更改的数据集更新回数据库。我没有看到任何错误,也没有例外。数据集中的数据已正确更改(fruits.WriteXml写入正确的结果),但数据库中的数据不会更改。

为什么数据库中的数据没有改变?

谢谢。

重现它: (数据库文件:https://drive.google.com/open?id=0ByImDaWMXaHAUGRIbTNLT0dHU0k&authuser=0

private void button1_Click(object sender, EventArgs e)
{
        updateDb();
}

private void updateDb()
{
    String connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\\local_workspaces\\visualstudio10\\FruitShop\\Database2.accdb;User Id=;Password=;";
    DataSet fruits = new DataSet();

    OleDbConnection connection = new OleDbConnection(connectionString);
    OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM fruits", connection);

    adapter.Fill(fruits);
    MessageBox.Show("Current value: " +fruits.Tables[0].Rows[0]["quantity"].ToString());

    //setting new value
    fruits.Tables[0].Rows[0]["quantity"] = 1111;
    fruits.AcceptChanges();

    OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(adapter);
    adapter.UpdateCommand = commandBuilder.GetUpdateCommand();
    adapter.Update(fruits);

    MessageBox.Show("New value: " + fruits.Tables[0].Rows[0]["quantity"].ToString());

    connection.Close();
}

修改

代码改编自此示例:http://msdn.microsoft.com/en-us/library/at8a576f(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2 最初的例子对我来说也不起作用。

可以因为Access数据库吗? (我现在无法尝试其他数据库)

溶液

感谢您的帮助。为了使它工作,需要更改数据集并仅更新这些更改,否则它不起作用(对我而言)。

DataSet changes = fruits.GetChanges();
if (changes != null)
{
    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
    adapter.UpdateCommand = builder.GetUpdateCommand();

    adapter.Update(changes);
    fruits.AcceptChanges();
}

2 个答案:

答案 0 :(得分:0)

从它的外观来看,你没有指定一个与你的适配器一起使用的更新命令(这将是一个sql update语句)。 如果您想使用oledb方法,则需要执行以下操作:https://stackoverflow.com/questions/26235498/c-sharp-dataset-not-updated-back-to-the-database

或者,您应该能够生成一个数据集,为您创建所有必需的表适配器。 这应该有所帮助:http://msdn.microsoft.com/en-us/library/ms171919.aspx

答案 1 :(得分:0)

ONE 小傻错......

你必须设置......

<强> fruits.AcceptChanges();

...前

fruits.Tables [0] .Rows [0] [“quantity”] = 1111;

然后剩下的代码将是......

        fruits.AcceptChanges();
        fruits.Tables[0].Rows[0]["quantity"] =1111;

        MessageBox.Show(ds.Tables[0].Rows[0]["quantity"].ToString());
        DataSet changes = ds.GetChanges();
        if (changes != null)
        {
            OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
            adapter.UpdateCommand = builder.GetUpdateCommand();
            adapter.Update(changes);
            fruits.AcceptChanges();
            MessageBox.Show("New value: " + ds.Tables[0].Rows[0]["quantity"]);
        }
        connection.Close();