我目前在使用MonoDevelop的Ubuntu上使用Mono,使用与数据库中的表匹配的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