1

我的 SQL 代码从列表中将 10,000 条记录插入到表中。如果记录已经存在,它会更新一些字段。

目前它需要超过 10 分钟并且超时,除非我限制要处理的记录数。我的代码中有什么可以解决这个问题的吗?

   foreach(RMSResponse rmsObj in rmsList) {
        try {
            string connectionString = @"server=localhost\sqlexpress;" + "Trusted_Connection=yes;" + "database=MyDB; " + "connection timeout=30";

            SqlConnection conn = new SqlConnection(connectionString);
            conn.Open();

            string str = "";
            str += "SELECT * ";
            str += "FROM RMSResponse ";
            str += "WHERE LeadID = @RecruitID";
            int LeadID;
            Boolean IsPositive = true;

            SqlCommand selectCommand = new SqlCommand(str, conn);
            selectCommand.CommandType = CommandType.Text;
            selectCommand.Parameters.Add(new SqlParameter("@RecruitID", rmsObj.RecruitID));
            SqlDataReader sqlDataReader = selectCommand.ExecuteReader();
            bool hasRows = sqlDataReader.HasRows;

            while (sqlDataReader.Read()) {
                LeadID = sqlDataReader.GetInt32(1);
                IsPositive = sqlDataReader.GetBoolean(2);
                IsPositive = (IsPositive == true) ? false : true;
                Console.WriteLine("Lead ID: " + LeadID + " IsPositive: " + IsPositive);
            }

            sqlDataReader.Close();

            if (hasRows) {
                SqlCommand updateCommand = new SqlCommand("UPDATE RMSResponse set IsPositive=@IsPositive, OptOutDate=@OptOutDate where LeadID=@LeadID", conn);
                updateCommand.Parameters.AddWithValue("@LeadID", rmsObj.RecruitID);
                updateCommand.Parameters.AddWithValue("@IsPositive", IsPositive);
                updateCommand.Parameters.AddWithValue("@OptOutDate", DateTime.Now);
                updateCommand.ExecuteNonQuery();
                sqlDataReader.Close();
            }

            if (!hasRows) {
                SqlCommand insertCommand = new SqlCommand("INSERT INTO RMSResponse (LeadID, IsPositive, ReceivedDate) " + "VALUES(@LeadID, @IsPositive, @ReceivedDate)", conn);
                insertCommand.Parameters.AddWithValue("@LeadID", rmsObj.RecruitID);
                insertCommand.Parameters.AddWithValue("@IsPositive", true);
                insertCommand.Parameters.AddWithValue("@ReceivedDate", DateTime.Now);
                int rows = insertCommand.ExecuteNonQuery();
            }
        } catch (SqlException ex) {
            Console.WriteLine(ex.Message);
        }
    }
4

2 回答 2

2

您可以将更新移动到 SQL - 您所做的只是将 OptOutDate 设置为今天。您可以将潜在客户 ID 列表传递给批量更新语句。

要插入记录,您可以批量插入到临时表中,然后执行 SQL 以插入表中尚未存在的 ID 的数据。

您的 C# 中没有太多逻辑,因此将数据拉出然后将其放回会使其不必要地变慢。


如果您不想继续下去,那么其他提示包括:

  • 在循环外打开一个连接
  • 在循环外创建一个 SqlCommand 对象并通过重置参数重用它
  • 将您的选择 SQL 更改为仅选择您需要的列,而不是 *
于 2012-07-11T08:11:44.670 回答
2

一个简单的更新或插入语句永远不会花费 10 分钟。

SqlServer 是一个非常好的数据库。

在表 RMSResponse 上的 LeadID 上创建索引。

如果你的 foreach 循环了很多记录,一定要考虑存储过程,存储过程会减少很多时间。

如果要更新或插入(UPSERT),请查看SqlServer 2008 中添加的合并命令。

于 2012-07-11T08:13:22.847 回答