В настоящее время я использую Mono в Ubuntu с MonoDevelop, работаю с DataTable, соответствующей таблице в базе данных, и должен пытаться ее обновить.
В следующем коде используется набор данных, загруженный из XML-файла, который был создан из набора данных.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: Добавление кода вызова, на всякий случай.
Спасибо за помощь.
da.AcceptChangesDuringFill = false;
, чтобы все исходные строки воспринимались как новые. Когда я вставляю обратно в другую БД, он правильно сообщает строки, и они есть. Убедитесь, что вы смотрите на правильную БД. - person Ňɏssa Pøngjǣrdenlarp   schedule 04.08.2016