Я пытаюсь работать с базой данных Access через OleDb. Мне нужно:C# DataSet не обновляется обратно в базу данных
- получить данные из базы данных для набора данных
- изменить данные в наборе данных
- обновление этого набора данных обратно в базу данных.
Первые две задачи выполнены. Но я не могу обновить измененный набор данных обратно в базу данных. Я не вижу никаких ошибок, никаких исключений. Данные в наборе данных правильно изменены (fruit.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();
}
Вы когда-либо открыв соединение? –
да, даже если я использую подключение.open(), то же поведение. Данные находятся в наборе данных, но не обновляются в базе данных. –
Вы могли решить вашу проблему? –