Comando di inserimento C # SQL

Qualcuno può dirmi che i seguenti 2 modi di inserire record creano prestazioni migliori?

Caso 1

SqlCommand cmd = new SqlCommand(); for (int i = 0; i < 10000; i++) { cmd = new SqlCommand("insert into test(id, name) value('" + i + "', '" + i + "')"); cmd.ExecuteNonQuery(); } 

Caso 2

 string sql = null; for (int i = 0; i < 10000; i++) { sql += "insert into test(id, name) value('" + i + "', '" + i + "')"; } SqlCommand cmd = new SqlCommand(sql, conn); cmd.ExecuteNonQuery(); 

Prima di tutto: STOP concatenando insieme il codice SQL !! Questo è un invito agli hacker di tutto il mondo ad attaccarti con l’iniezione SQL! Utilizza invece le query parametrizzate !

Vorrei usare questa soluzione: creare un singolo SqlCommand con una query parametrizzata ed eseguire quello:

 string stmt = "INSERT INTO dbo.Test(id, name) VALUES(@ID, @Name)"; SqlCommand cmd = new SqlCommand(smt, _connection); cmd.Parameters.Add("@ID", SqlDbType.Int); cmd.Parameters.Add("@Name", SqlDbType.VarChar, 100); for (int i = 0; i < 10000; i++) { cmd.Parameters["@ID"].Value = i; cmd.Parameters["@Name"].Value = i.ToString(); cmd.ExecuteNonQuery(); } 

oppure usa SqlBulkCopy , specialmente se stai inserendo più di 10.000 file.

Il secondo approccio sembra più veloce del # 1 perché si inviano i comandi INSERT in una sola volta. Nel primo c’è un round trip sul server SQL per ogni ExecuteNonQuery.

Ma dovresti provare il comando di inserimento in blocco : BULK INSERT (Transact-SQL) , suppongo che otterrai prestazioni migliori rispetto a qualsiasi delle opzioni che hai fornito.

[]’S

Va notato esattamente che così com’è, nessuno dei due casi funzionerà.

Il caso n. 1 richiede una connessione da specificare.

Il caso n. 2 richiede che termini le tue istruzioni con un punto e virgola per poter eseguire più comandi, in questo modo:

 string sql = null; for (int i = 0; i < 10000; i++) { sql += "insert into test(id, name) value('" + i + "', '" + i + "');"; } SqlCommand cmd = new SqlCommand(sql, conn); cmd.ExecuteNonQuery(); 

In definitiva, il modo migliore sarebbe per te testarlo da solo su diverse migliaia di righe. La mia ipotesi sarebbe che il caso n. 2 sarebbe meglio per le prestazioni perché non solo richiederebbe l'impostazione di un solo object SqlCommand , ma colpirebbe il database una sola volta.

Non penso che il secondo funzionerà.

Esiste tuttavia una syntax in SQL Server 2008 per l’ inserimento di più righe in una singola istruzione INSERT e penso che sarà più veloce di entrambe le opzioni proposte:

 INSERT INTO test (id, name) VALUES ('1', 'foo'), ('2', 'bar'), ('3', 'baz') -- etc... 

Tuttavia, se si desidera ottenere prestazioni elevate, è consigliabile utilizzare la class SqlBulkCopy .

Il secondo è probabilmente più veloce, perché si finisce con un singolo roundtrip. Entrambi sono ugualmente terribili, perché non si usano query parametrizzate .