gpt4 book ai didi

c# - 1 个 sql 和 2 个不同的 sqlconnections 使用 c#

转载 作者:行者123 更新时间:2023-11-30 18:17:39 27 4
gpt4 key购买 nike

我有 2 个不同的连接位于不同的 sql 服务器、源服务器和目标服务器上。我想比较两个服务器中都存在的表,并将目标服务器表与源服务器表对齐。

SqlConnection src = (DataBaseConnection.GetSqlConnection());

SqlConnection trg = new SqlConnection(Properties.Settings.Default.IDCConnectionDEV);

src.Open();
trg.Open();

SqlCommand source = new SqlCommand("SELECT * FROM Source table", src);
SqlCommand traget = new SqlCommand("SELECT * FROM Target Table", trg);

SqlDataReader drsrc = source.ExecuteReader();
SqlDataReader drtrg = traget.ExecuteReader();

DataTable tbl1 = new DataTable();
tbl1.Load(drsrc);

DataTable tbl2 = new DataTable();
tbl2.Load(drtrg);

现在我的问题是如何运行以下查询:

(select * from Source table) except (select * from Target table)

或使用来自两个连接的表的任何其他 sql 查询。

最佳答案

您将无法跨两个不同的数据表运行 SQL 语句,因为它们位于不同的连接上。

  1. 您可以在一台服务器或另一台服务器上创建链接服务器,然后在一台服务器上运行查询,该服务器使用 SQL 连接到另一台服务器。
  2. 您可以使用 SQL 以外的其他方式在客户端执行连接。

要在客户端执行连接,如果这些表很大,请考虑使用合并连接来最小化客户端内存需求。这将添加一个 ORDER BY条款SELECT语句按主键对它们进行排序,如果您没有主键,则按一些唯一键对它们进行排序。然后,您将遍历一侧并使用 < 与另一侧的当前记录进行比较, > , 和 ==比较以检查记录是否在一个或另一个中。然后,您可以确定记录是否在源中而不是目标中,目标中是否有记录但源中没有,或者记录是否存在于两者中。考虑使用 IDataReader而不是 DataTable在这种情况下,如果表非常大,则可以避免将两个表都加载到内存中。

或者,如果表不是很大并且您有足够的 RAM 客户端,您可以使用散列连接(这很可能是 linq 解决它的方式)。这会将一侧的主键/唯一键加载到 Dictionary 中。然后测试另一方的每条记录,看它是否在 Dictionary 中.更容易编码,并且可能更快,但需要更多的内存使用。你可以使用 IDataReader而不是 DataTable以节省客户端内存,但您必须至少有一侧的连接完全在内存中(在 Dictionary 中)

最后,您可以使用 Linq 查询以类似 SQL 的方式执行客户端连接。这将是最少的代码量。您必须将其留在 DataTable 中, Linq 可能会使用 DictionaryHashset在幕后,因此您将在内存中拥有 3 个表格副本以使其正常工作。

关于c# - 1 个 sql 和 2 个不同的 sqlconnections 使用 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43068685/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com