我之前所做的是将数据从大容量插入临时表中,然后使用命令或存储过程更新与临时表和目标表相关的数据。临时表是一个额外的步骤,但是与逐行更新数据相比,如果行数很大,则批量插入和大规模更新可以提高性能。
例:
public static void UpdateData<T>(List<T> list,string TableName){ DataTable dt = new DataTable("MyTable"); dt = ConvertToDataTable(list); using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SchoolSoulDataEntitiesForReport"].ConnectionString)) { using (SqlCommand command = new SqlCommand("", conn)) { try { conn.Open(); //Creating temp table on database command.CommandText = "CREATE TABLE #TmpTable(...)"; command.ExecuteNonQuery(); //Bulk insert into temp table using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn)) { bulkcopy.BulkCopyTimeout = 660; bulkcopy.DestinationTableName = "#TmpTable"; bulkcopy.WriteToServer(dt); bulkcopy.Close(); } // Updating destination table, and dropping temp table command.CommandTimeout = 300; command.CommandText = "UPDATE T SET ... FROM " + TableName + " T INNER JOIN #TmpTable Temp ON ...; DROP TABLE #TmpTable;"; command.ExecuteNonQuery(); } catch (Exception ex) { // Handle exception properly } finally { conn.Close(); } } }}请注意,由于临时表的范围是针对每个连接的,因此单个连接用于执行整个操作,以便能够在每个步骤中使用临时表。



