Vad jag har gjort tidigare är att utföra en bulkinsert från data till en temporär tabell och sedan använda ett kommando eller en lagrad procedur för att uppdatera data som relaterar till den temporära tabellen med destinationstabellen. Temp-tabellen är ett extra steg, men du kan få en prestandaökning med bulkinsert och massiv uppdatering om antalet rader är stort, jämfört med att uppdatera data rad för rad.
Exempel:
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();
}
}
}
}
Observera att en enda anslutning används för att utföra hela operationen, för att kunna använda temptabellen i varje steg, eftersom omfattningen av temptabellen är per anslutning.