首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用DataTables合并数据库

使用DataTables合并数据库
EN

Stack Overflow用户
提问于 2012-12-03 19:03:38
回答 2查看 1.3K关注 0票数 0

我有以下代码,它应该用远程用户表覆盖本地用户表。我可以看到合并工作正常,但是更新没有做任何事情(例如,DataTable有新值,但它没有将其写入LocalDb连接/数据库)-有没有一种简单的方法来完成我正在做的事情或使其工作?

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

发布于 2012-12-03 19:11:45

上述代码的问题在于,您只设置了select命令。如果你想“更新”这个表,那么你很可能需要为你的LocaDataAdapter同时使用一个"Update“和"INSERT”命令。

DataAdapter的Update方法在需要更改/添加/删除数据库表中的记录时需要这些命令。

通常情况下,您会使用特定的命令设置DataAdapter。

使用你的命令生成器,你可以尝试这样做:

代码语言:javascript
复制
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);
}
票数 0
EN

Stack Overflow用户

发布于 2012-12-03 19:15:13

对AcceptChanges的调用意味着LocalUsersTable中任何已更改的值都不再标记为已更改,因此无需进行任何更新。

在任何情况下,这都是一种非常丑陋、缓慢和危险的批量更新方式,而且从未使用过。以下是几个最严重的问题:

  • 您可以将所有数据从两台服务器拉到客户端,然后再将所有数据发送回其中一台服务器。这会浪费所有计算机的带宽和处理时间,因此速度极慢。
  • 您从每个表中检索所有列,如果有架构更改,这将导致更新失败。

您应该在事务中使用SQL语句来做您想做的事情,而不是使用DataTables。

SQL Server具有MERGE语句,该语句可以使用源查询中的行更新目标表,并使用每个单独行的值确定要执行的操作(Update、Insert、Delete)。或者,您可以编写一个多语句脚本,用于删除旧行并将新行插入到事务中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13681923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档