首页 > 解决方案 > 从 C# 在 SQL Server 中批量更新

问题描述

我必须从 C# 更新 SQL Server 表中的多条记录。以下是我必须遵循的步骤,下面是代码。该代码正在运行,但该过程花费的时间比预期的要长得多。我需要一种快速更新 10000 条记录的方法,不确定批量复制是否适用于更新。

我已经看到其他答案有批量插入临时然后更新..但是该更新有一个语句,在这里我需要根据 Excel 数据更新数据库中的记录,为此我必须循环每个 excel 记录。所以我怎样才能实现更快的更新。

1)读取Excel数据并将数据复制到数据表中

string strDirectory = string. Empty;
strDirectory = System.IO.Directory.GetCurrentDirectory() + "\\" + "Filename.xlsx";
string Connection String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + strDirectory + "; Extended Properties = \"Excel 12.0;HDR=YES;IMEX=1\"";
using (OleDbConnection conn = new OleDbConnection(Connection String))
{    
    conn.Open();

    DataTable schemaTable = conn.GetOleDbSchemaTableOleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

    DataRow schemaRow = schemaTable. Rows[0];
    string sheet = schemaRow["TABLE_NAME"].ToString();
    string query = "SELECT * FROM [" + sheet + "]";
    OleDbDataAdapter daexcel = new OleDbDataAdapter(query, conn);
    daexcel.Fill(dt);
    conn.Close();
}

2)在更新到表之前对数据表数据进行一些操作。

string strsqlst = string. Empty;
using (SqlConnection sqlConn = new SqlConnection(Connectionstring))
{
    sqlConn.Open();
    SqlCommand cmd;

    StringBuilder sb = new StringBuilder();
    sb.AppendLine("DataTable content:");
    foreach (DataRow row in dt.Rows)
    {
        if (row.ItemArray[0].ToString() == "")
            break;

        strsqlst = "Update  table Set col1= " + row.ItemArray[4].ToString() + "  ,col2= " + row.ItemArray[5].ToString() + " where <Condition>'";

        cmd = new SqlCommand(strsqlst, sqlConn);

        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();         
    }
    sqlConn.Close();
}

标签: c#bulkupdate

解决方案


SqlCommand 可以是整个 SQL批处理,并且不限于单个语句。因此,您可以创建一个包含 10,000 条 UPDATE 语句的大批量,或者将其分成例如 20 批,每批 500 条。

换句话说,您可以使用 CommandText 创建单个命令,如下所示:

UPDATE [T] SET Col1='Value1', Col2='Value2' WHERE [Id] = 1;
...
UPDATE [T] SET Col1='Value999', Col2='Value1000' WHERE [Id] = 500;

也就是说,您应该为所有数据值使用参数(以确保 SQL 注入是不可能的)。

如果您想处理任何错误(由于无效数据导致更新失败),您将需要一些更复杂的东西。


推荐阅读