2014-10-03 3 views
0

У меня есть DataSet/DataTable, который я бы хотел записать в базу данных MySQL, и если какие-либо изменения в базе данных MySQL будут записывать эти изменения обратно в мой DataSet/DataTable.Синхронизировать DataTable с базой данных MySQL двумя способами

Короче:

myDataSet -> База данных MySQL (пользователь редактирует значения)

myDataSet < - MySQL базы данных (другой пользователь редактирует базу данных MySQL)

Заполнение DataSet из базы данных MySQL является сделано таким образом:

private MySqlDataAdapter mysqlDataAdapter; 
private DataSet dsTable; 
private string _tablename; 

public void ReadTable(string tablename) 
{ 
    _tablename = tablename; 
    String query = "select * from " + tablename; 

    if (dsTable == null) 
     dsTable = new DataSet(); 

    mysqlDataAdapter = new MySqlDataAdapter(query, (MySqlConnection)connection); 
    MySqlCommandBuilder commandBuilder = new MySqlCommandBuilder(mysqlDataAdapter); 

    mysqlDataAdapter.Fill(dsTable, tablename); 
} 

Обновление значений в таблице есть Row_Changed EventHandler набор для таблицы:

private void Row_Changed(object sender, DataRowChangeEventArgs e) 
{... ChangeIntegerValueInReflectedTable(...); } 

где я называю:

public void ChangeIntegerValueInReflectedTable(int rowIndex, string columnName, int newValue) 
{ 
    dsBom.Tables[0].Rows[rowIndex][columnName] = newValue; 
} 

Чтобы обновить базу данных MySQL, я использую:

public void UpdateTable() 
{ 
     mysqlDataAdapter.Update(dsTable, _tablename); 
} 

Это работает. Теперь я хотел бы обновить изменения в удаленной базе данных MySQL в моей локальной таблице. Для этого нет никакой команды, поскольку я знаю, и mysqlDataAdapter.Update не обновляет обновления в моей таблице только в локальной таблице -> базе данных MySQL.

Итак, я написал функции, которые извлекают таблицу каждые 30 секунд и сравнивают ее. Затем я записываю изменения в свой dsTable. Это работает, но в следующий раз, когда я вызываю UpdateTable(), я получаю ошибку:

Нарушение параллелизма: UpdateCommand затронул 0 ожидаемых 1 записи. System.Exception {System.Data.DBConcurrencyException}

Я не знаю почему. Я также меняю ячейки в dsTable, когда я обновляю отдельные значения из пользовательского интерфейса.

Когда я вызываю mysqlDataAdapter.Fill (dsTable, tablename), мой datagridview обновляется в бесконечном цикле.

Я застрял прямо сейчас. Есть ли хороший подход?

ответ

0

Хорошо, теперь я это понимаю.

Во-первых: когда RowState из одной строки настроен на изменение (в этом случае при установке нового значения), и я вызываю mysqlDataAdapter.Update (dsTable, _tablename); Я получаю ошибку, потому что установленное значение такое же, как в базе данных.

Во-вторых: поскольку у меня был активен Eventhandler Row_Changed, после изменения значения в моей таблице значение, которое у меня есть в базе данных MySQL, было вызвано mysqlDataAdapter.Update (dsTable, _tablename), прежде чем я смог установить RowState в неизмененный ,

Решение: Я просто устанавливаю значение bool при поиске и изменении различий на удаленном сервере MySQL. Пока это значение равно true, Row_Changed не запускает UpdateTable(). При изменении значения в моей локальной таблице (потому что он изменился на удаленном сервере) я вызываю AcceptChanges() для строки, если строка уже не изменена.Когда пользователь делает изменения в локальной таблице за это короткое время, я обновляю изменения, которые не теряются, они только локальны и не обновляются на удаленном сервере MySQL немедленно.

Смежные вопросы