我有以下代码,它应该用远程用户表覆盖本地用户表。我可以看到合并工作正常,但是更新没有做任何事情(例如,DataTable有新值,但它没有将其写入LocalDb连接/数据库)-有没有一种简单的方法来完成我正在做的事情或使其工作?
var RemoteUsersTable = DbRemote.ExecuteQuery("SELECT * FROM users");
if (RemoteUsersTable.Rows.Count > 0)
{
SqlDataAdapter LocalDataAdapter = null;
var LocalUsersTable = DbLocal.ExecuteQuery("SELECT * FROM users", ref LocalDataAdapter);
LocalUsersTable.Merge(RemoteUsersTable);
LocalUsersTable.AcceptChanges();
LocalDataAdapter.Update(LocalUsersTable);
}发布于 2012-12-03 19:11:45
上述代码的问题在于,您只设置了select命令。如果你想“更新”这个表,那么你很可能需要为你的LocaDataAdapter同时使用一个"Update“和"INSERT”命令。
DataAdapter的Update方法在需要更改/添加/删除数据库表中的记录时需要这些命令。
通常情况下,您会使用特定的命令设置DataAdapter。
使用你的命令生成器,你可以尝试这样做:
var RemoteUsersTable = DbRemote.ExecuteQuery("SELECT * FROM users");
if (RemoteUsersTable.Rows.Count > 0)
{
SqlDataAdapter LocalDataAdapter = null;
var LocalUsersTable = DbLocal.ExecuteQuery("SELECT * FROM users", ref LocalDataAdapter);
LocalUsersTable.Merge(RemoteUsersTable);
LocalUsersTable.AcceptChanges();
cb.GetDeleteCommand(); // WHICH EVER YOUR COMMANDBUILDER IS CALLED.
cb.GetInsertCommand();
cb.GetUpdateCommand();
LocalDataAdapter.Update(LocalUsersTable);
}发布于 2012-12-03 19:15:13
对AcceptChanges的调用意味着LocalUsersTable中任何已更改的值都不再标记为已更改,因此无需进行任何更新。
在任何情况下,这都是一种非常丑陋、缓慢和危险的批量更新方式,而且从未使用过。以下是几个最严重的问题:
您应该在事务中使用SQL语句来做您想做的事情,而不是使用DataTables。
SQL Server具有MERGE语句,该语句可以使用源查询中的行更新目标表,并使用每个单独行的值确定要执行的操作(Update、Insert、Delete)。或者,您可以编写一个多语句脚本,用于删除旧行并将新行插入到事务中
https://stackoverflow.com/questions/13681923
复制相似问题