c#DataSet未更新回数据库
本文关键字:数据库 更新 c#DataSet | 更新日期: 2023-09-27 18:25:44
我正试图通过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();
}
从外观上看,您还没有指定用于适配器的更新命令(这将是一条sql更新语句)。如果您想使用oledb方法,您需要执行以下操作:https://stackoverflow.com/questions/26235498/c-sharp-dataset-not-updated-back-to-the-database
或者,您应该能够生成一个数据集,为您创建所有必要的表适配器。这应该有助于:http://msdn.microsoft.com/en-us/library/ms171919.aspx
好吧,有一个愚蠢的小错误。。
您必须设置。。。
水果。AcceptChanges()
之前。。。
水果。表格[0]。行[0]["数量"]=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();