 <p>I dont know if this is a good method with parameters, but it works well The method receives a list of "ParamDbList"(Collection of ParamDB) and insert rows every 1000 registers or 1900 parameters(limit of 2000). Just adapt this for your drive</p> <pre><code> public bool InsertBatch(System.Collections.Generic.List&lt;ParamDbLIST&gt; dados, string tabela) { if (dados.Count == 0) return true; string campos = ""; dados[0].ForEach(delegate(ParamDB p) { campos += (campos == "" ? "" : ", ") + "@" + p.sNOME + "#N#"; }); bool resultado = true; //Insere de 999 a 999, que é o máximo q o sql server permite por vez //Maximo de 2000 parametros int k = 0; while (k &lt; dados.Count) { this.sql = new StringBuilder(); List&lt;String&gt; vals = new List&lt;string&gt;(); ParamDbLIST parametros_insert = new ParamDbLIST(); int c_sqls = 0; int c_parametros = 0; while (k &lt; dados.Count &amp;&amp; c_sqls &lt; 1000 &amp;&amp; c_parametros &lt; 1900) { c_sqls++; vals.Add("(" + campos.Replace("#N#", c_sqls.ToString()) + ")"); foreach (ParamDB p in dados[k]) { p.sNOME += c_sqls.ToString(); parametros_insert.Add(p); c_parametros++; } k++; } this.sql.Append("INSERT INTO " + tabela + "(" + campos.Replace("#N#", String.Empty).Replace("@", String.Empty) + ") VALUES " + String.Join(",", vals)); resultado = resultado &amp;&amp; this.RunSQL(sql.ToString(), parametros_insert); } return resultado; } public class ParamDbLIST : System.Collections.ObjectModel.Collection&lt;ParamDB&gt; {/*I have other stuff here, but this will work*/} public class ParamDB { public string sNOME { get; set; } public Object sVALOR { get; set; }} </code></pre> <p>Remember the method INSERT INTO tbl_name (a,b,c) VALUES (1,2,3), (4,5,6), (7,8,9); has a limit of 1000 rows per command.</p> <p>I think a good thing to do here would be to use transaction(for secure)</p> <p>The method you should change is RunSQL</p> <p>If this method can be optimized, please let me know</p>