Faktiskt, som du har det skrivet, kommer ditt första alternativ att vara snabbare.
-
Ditt andra exempel har ett problem. Du gör sql =+ sql + etc. Detta kommer att göra att ett nytt strängobjekt skapas för varje iteration av loopen. (Kolla in StringBuilder-klassen). Tekniskt sett kommer du också att skapa ett nytt strängobjekt i första hand, men skillnaden är att det inte behöver kopiera all information från det tidigare strängalternativet.
-
Som du har det inställt, kommer SQL Server att behöva utvärdera en massiv fråga när du äntligen skickar den, vilket definitivt kommer att ta lite tid att ta reda på vad den ska göra. Jag bör säga att detta beror på hur stort antal insatser du behöver göra. Om n är litet kommer du förmodligen att klara dig, men när det växer kommer ditt problem bara att bli värre.
Bulkinserts är snabbare än enskilda på grund av hur SQL-server hanterar batchtransaktioner. Om du ska infoga data från C# bör du ta det första tillvägagångssättet och slå in säg var 500:e infogning i en transaktion och begå den, sedan göra nästa 500 och så vidare. Detta har också fördelen att om en batch misslyckas kan du fånga dem och ta reda på vad som gick fel och sätta in just dem igen. Det finns andra sätt att göra det på, men det skulle definitivt vara en förbättring jämfört med de två exemplen som ges.
var iCounter = 0;
foreach (Employee item in employees)
{
if (iCounter == 0)
{
cmd.BeginTransaction;
}
string sql = @"INSERT INTO Mytable (id, name, salary)
values ('@id', '@name', '@salary')";
// replace @par with values
cmd.CommandText = sql; // cmd is IDbCommand
cmd.ExecuteNonQuery();
iCounter ++;
if(iCounter >= 500)
{
cmd.CommitTransaction;
iCounter = 0;
}
}
if(iCounter > 0)
cmd.CommitTransaction;