从C#进行SQL Server的批量更新

3
我需要从C#更新SQL Server表中的多个记录。以下是我必须遵循的步骤和代码。 代码可以运行,但是该过程所需的时间比预期要长得多。 我需要一种快速的方法来更新10000条记录,不确定批量复制是否适用于更新。 我已经看到了其他答案,其中有批量插入到临时表然后进行更新。 但是那里的更新只有一个语句,在这里我需要根据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();
}

你的SQL Server版本是什么?看起来除了一些Tsql关键字像MERGE之外,似乎没有什么用处。 - Drag and Drop
2
可能是C#中的批量更新的重复问题。 - Drag and Drop
你说:“但是那个更新只有一个语句”,这是错误的,它是基于另一个表格的更新,而不是单行更新。如果你在SQL临时表中使用了Excel中的N列,更新将会更容易。 - Drag and Drop
使用类似以下代码的语句:var tempData = dt.AsEnumerable().Select (row => new { col1 = row.Field<string>("ColumnName"), col2 = row.Field<string>("ColumnName"), conditionID = row.Field<decimal>("ColumnName") }).ToList();,您可以将其插入到临时表中,并简单地执行以下操作:UPDATE DestinationTable SET ( DestinationTable.Column = TempTable.Column, ... ) FROM DestinationTable Dest INNER JOIN TempTable Temp ON TempTable.SomethingID = Temp.ID WHERE DestinationTable.Other condition - Drag and Drop
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
1

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

换句话说,您可以像这样使用CommandText创建单个命令:

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

话虽如此,您应该对所有数据值使用参数(以确保不会发生SQL注入)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,