我有以下代码,它应该用远程代码覆盖本地Users表。我可以看到Merge工作正常,但Update没有做任何事情(即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);
}
答案 0 :(得分:0)
上述代码的问题在于您只设置了一个select命令。如果您想要“更新”表格,那么您很可能需要“更新”和“更新”。您的LocaDataAdapter
的“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);
}
答案 1 :(得分:0)
对AcceptChanges的调用意味着LocalUsersTable中的任何更改值都不再标记为已更改,因此无需更新。
无论如何,这是一种非常难看,缓慢且冒险的方式来执行大规模更新,并且从未使用过。只是一些最严重的问题:
您应该在事务中使用SQL语句来执行您想要的操作而不是使用DataTables。
SQL Server具有MERGE语句,该语句可以使用源查询中的行更新目标表,使用每个行的值决定要执行的操作(更新,插入,删除)。或者,您可以编写一个多语句脚本来删除旧行并在事务中插入新行