繁体   English   中英

从C#批量更新SQL Server

[英]Bulk Update in SQL Server from C#

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

我已经看到其他答案,其中Bulk插入到temp然后更新..但是该更新有一个语句,在这里我需要根据Excel数据更新DB中的记录,为此我必须循环每个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注入)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM