Sto cercando di fare qualcosa di simile a questo punto: Come inserisco più righe SENZA ripetere la parte “INSERT INTO dbo.Blah” dell’istruzione? eccetto che oltre a fare questo in una query (più veloce di diverse decine) voglio anche farlo parametrizzato dato che l’input proviene dal web.
Attualmente ho
foreach(string data in Scraper){ SqlConnection conn = new SqlConnection(WebConfigurationManager.AppSettings["ConnectionInfo"].ToString()); string query = "INSERT INTO DATABASE('web',@data)"; SqlCommand sqlCommand= new SqlCommand(query, conn); sqlCommand.Parameters.AddWithValue("@data", data); Command.executeNonQuery(); conn.close(); }
Il che è un po ‘lento (si noti che il vero esempio ha molte più colonne ma che renderebbe le cose più confuse).
Poiché stai utilizzando c#
e sql server 2008
, puoi utilizzare un parametro con valori di tabella per inserire più righe nel tuo database. Ecco una breve descrizione su come fare questo:
Innanzitutto, è necessario creare un tipo di tabella definito dall’utente:
CREATE TYPE MyTableType AS TABLE ( Col1 int, Col2 varchar(20) ) GO
Quindi, è necessario creare una stored procedure che accetti questo tipo di tabella come parametro
CREATE PROCEDURE MyProcedure ( @MyTable dbo.MyTableType READONLY -- NOTE: table valued parameters must be Readonly! ) AS INSERT INTO MyTable (Col1, Col2) SELECT Col1, Col2 FROM @MyTable GO
Infine, esegui questa stored procedure dal tuo codice c #:
DataTable dt = new DataTable(); dt.Columns.Add("Col1", typeof(int)); dt.Columns.Add("Col2", typeof(string)); // Fill your data table here using (SqlConnection con = new SqlConnection("ConnectionString")) { SqlCommand cmd = new SqlCommand("MyProcedure", con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@MyTable", SqlDbType.Structured).Value = dt; con.Open(); cmd.ExecuteNonQuery(); con.Close(); }
È ansible utilizzare la syntax SQL:
INSERT INTO YOUR_TABLE (dataColumn) VALUES (data1),(data2),(data3)
Quindi fai un loop sulle tue righe che vuoi inserire e aggiungi “, (datax)” alla tua query e aggiungi anche il parametro corrispondente. Forse aiuta.