我试图通过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();
}
答案 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();