使用DataTables合并数据库

时间:2012-12-03 11:03:38

标签: c# .net sql datatable

我有以下代码,它应该用远程代码覆盖本地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);
}

2 个答案:

答案 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语句,该语句可以使用源查询中的行更新目标表,使用每个行的值决定要执行的操作(更新,插入,删除)。或者,您可以编写一个多语句脚本来删除旧行并在事务中插入新行