2014-10-07 2 views
0

Я пытаюсь работать с базой данных 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(); 
} 
+0

Вы когда-либо открыв соединение? –

+0

да, даже если я использую подключение.open(), то же поведение. Данные находятся в наборе данных, но не обновляются в базе данных. –

+0

Вы могли решить вашу проблему? –

ответ

0

С его внешностью вы не указали команду обновления (это будет инструкция обновления 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

+0

Я вижу 'adapter.UpdateCommand' - не так ли? –

+0

спасибо, я проверю. Я был убежден, что OleDbCommandBuilder сделает это для меня автоматически. –

+0

@OverMind Вам необходимо предоставить UpdateCommand инструкцию sql, в которой указывается, какая таблица и значения будут обновляться. См. Первую ссылку, которую я предоставил. Это покажет вам, как это сделать. –

0

Ну есть ONE маленькая глупая ошибка ..

Вы должны установить ...

fruits.AcceptChanges();

раньше ...

fruits.Tables [0] .Rows [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(); 
Смежные вопросы