c# - 从 C# 在 SQL Server 中批量更新

标签 c# bulkupdate

我必须从 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();
}

最佳答案

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 注入(inject))。

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

关于c# - 从 C# 在 SQL Server 中批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52270513/

相关文章:

c# - 有序数据结构,允许有效删除重复项

c# - 从上一页检索数据

node.js - Mongo 批量更新 - 哪些成功(匹配和修改)哪些没有?

c# - 如何创建弱引用事件处理程序?

c# - 如何在放大的图像上绘图?

c# - 带有子控件的 UserControl 传递到 UserControl 中的 Repeater

使用 forEach 的 MongoDB 批量更新效率

elasticsearch - Elasticsearch:如果批量更新之一失败怎么办?

c# - PostgreSQL : 42883: operator does not exist: information_schema. sql_identifier + 未知