【问题标题】:Using c# how to retrieve and update thousands of records from a SQL database efficiently使用 c# 如何有效地从 SQL 数据库中检索和更新数千条记录
【发布时间】:2013-03-13 01:49:43
【问题描述】:

流程

  1. 我正在编写一个 C# 应用程序,它需要从数据库 A 中的 SQL 表中检索 400 万条记录 (ID)。
  2. 然后我需要使用每个 ID 从数据库 B 中的另一个 SQL 表中选择一行记录。
  3. 一旦有了这一行,我就需要更新数据库 C 中的另一个 SQL 表

问题

  1. 在步骤 1 中检索和存储数据的最有效方法是什么? 一个。我应该将其加载到列表字符串中吗? 湾。你建议最初做批处理吗?

  2. 实现步骤 2 和 3 的最有效方法是什么

【问题讨论】:

  • 这3个数据库是在同一台服务器上吗?
  • 第 1 步和第 3 步在同一个服务器上不同的数据库(数据库 A 和 C)。 2 在单独的数据库服务器上
  • c# 应用程序在做什么?
  • 正是我所解释的

标签: c# sql


【解决方案1】:

要检索 4M 条记录,您需要使用 SqlDataReader - 它一次只将一行数据加载到内存中。

var cn = new SqlConnection("some connection string");
var cmd = new SqlCommand("SELECT ID FROM SomeTable", cn);
var reader = cmd.ExecuteReader();

while (reader.Read())
{
    var id = reader.GetInt32(0);

    // an so on
}

reader.Close();
reader.Dispose();
cn.Close();

现在,为了处理二和三,我将利用 DataTable 来获取您需要检索的行,然后在第三个数据库上利用 SqlCommand。这意味着在reader.Read() 中,您可以通过用SqlDataAdapter 填充DataTable 并针对SqlCommandUPDATE 语句发出ExecNonQuery 来获得所需的一行。

上面的另一种写法,也更安全一点,是使用using 语句:

using (SqlDataReader reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        var id = reader.GetInt32(0);

        // an so on
    }
}

这将消除对:

reader.Close();
reader.Dispose();

因此,如果您愿意,您也可以为 SqlConnection 发出该邮件。

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2018-11-21
      相关资源
      最近更新 更多