Я в настоящее время использую Mono на Ubuntu с MonoDevelop, работая с DataTable, сопоставляя таблицу в базе данных и пытаюсь ее обновить.Обновление MySQL возвращает затронутые строки, но фактически не обновляет базу данных
В следующем коде используется набор данных, загруженный из файла XML, который был создан из Dataset.WriteXML на другом компьютере.
try
{
if(ds.Tables.Contains(s))
{
ds.Tables[s].AcceptChanges();
foreach(DataRow dr in ds.Tables[s].Rows)
dr.SetModified(); // Setting to modified so that it updates, rather than inserts, into the database
hc.Data.Database.Update(hc.Data.DataDictionary.GetTableInfo(s), ds.Tables[s]);
}
}
catch (Exception ex)
{
Log.WriteError(ex);
}
Это код для вставки/обновления в базе данных.
public override int SQLUpdate(DataTable dt, string tableName)
{
MySqlDataAdapter da = new MySqlDataAdapter();
try
{
int rowsChanged = 0;
int tStart = Environment.TickCount;
da.SelectCommand = new MySqlCommand("SELECT * FROM " + tableName);
da.SelectCommand.Connection = connection;
MySqlCommandBuilder cb = new MySqlCommandBuilder(da);
da.UpdateCommand = cb.GetUpdateCommand();
da.DeleteCommand = cb.GetDeleteCommand();
da.InsertCommand = cb.GetInsertCommand();
da.ContinueUpdateOnError = true;
da.AcceptChangesDuringUpdate = true;
rowsChanged = da.Update(dt);
Log.WriteVerbose("Tbl={0},Rows={1},tics={2},", dt.TableName, rowsChanged, Misc.Elapsed(tStart));
return rowsChanged;
catch (Exception ex)
{
Log.WriteError("{0}", ex.Message);
return -1
}
Я пытаюсь выполнить вышеуказанный код, а rowsChanged становится 4183, количество строк, которые я редактирую. Однако, когда я использую HeidiSQL для проверки самой базы данных, она ничего не меняет.
Есть ли какой-то шаг, который мне не хватает?
Редактировать: Альтернативно, возможность перезаписывать все строки в базе данных также будет работать. Это настройка для обновления удаленных компьютеров с помощью USB-накопителей, что вынуждает их сопоставлять таблицу исходных данных.
Редактировать 2: Добавлен дополнительный образец кода, чтобы показать источник DT. DataTable предварительно заполняется в вызывающей функции, и все строки имеют DataRow.SetModified(); применяется.
Редактировать 3: Дополнительная информация. Таблица заполняется данными из файла XML. Попытка исправить в комментариях.
Редактирование 4: добавление кода вызова на всякий случай.
Благодарим за помощь.
Серверы/соединения MySQL обычно имеют параметр для того, следует ли возвращать затронутые строки или сопоставляемые строки; может быть, что эффективная настройка для этих двух сред различна. – Uueerdo
что в DT? Он заполнен в другом месте? Он просто выходит из ниоткуда в этом коде. – Plutonix
Добавлена запрашиваемая информация. – user3169698