Wat ik eerder heb gedaan, is een bulkinvoeging van de gegevens in een tijdelijke tabel uitvoeren en vervolgens een opdracht of opgeslagen procedure gebruiken om de gegevens met betrekking tot de tijdelijke tabel bij te werken met de bestemmingstabel. De tijdelijke tabel is een extra stap, maar u kunt prestatiewinst behalen met het bulksgewijs invoegen en massaal bijwerken als het aantal rijen groot is, vergeleken met het rij voor rij bijwerken van de gegevens.
Voorbeeld:
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();
}
}
}
}
Merk op dat een enkele verbinding wordt gebruikt om de hele bewerking uit te voeren, om de tijdelijke tabel in elke stap te kunnen gebruiken, omdat de reikwijdte van de tijdelijke tabel per verbinding is.