@W3bbo:For what it's worth. Using Sql2005 on my dev machine (so no network involved).

Using your method, but within a transaction, it inserts 15,000 records in 3s.

            var start = DateTime.Now;
            using (SqlConnection con = GetConnection())
            {
                var tran = con.BeginTransaction();
                SqlCommand cmd = con.CreateCommand();
                cmd.Transaction = tran;
                cmd.CommandText = "insert into test (value) values (@value)";
                cmd.Parameters.Add("@value", SqlDbType.Int);

                foreach (int r in recordsToInsert)
                {
                    cmd.Parameters["@value"].Value = r;
                    cmd.ExecuteNonQuery();
                }
                tran.Commit();
            }
            var end = DateTime.Now;
            tbOutput.Text = string.Format("Elapsed time {0}", (end - start));

 

Using a stored procedure and batching all 15,000 inserts into one command, about 0.4s

            var start = DateTime.Now;
            using (SqlConnection con = GetConnection())
            {
                var tran = con.BeginTransaction();
                SqlCommand cmd = con.CreateCommand();
                cmd.Transaction = tran;
                var sb = new StringBuilder();
                foreach (int r in recordsToInsert)
                {
                    sb.AppendFormat("exec Insert_Test {0};", r);
                }
                cmd.CommandText = sb.ToString();
                cmd.ExecuteNonQuery();
                tran.Commit();
            }
            var end = DateTime.Now;
            tbOutput.Text = string.Format("Elapsed time {0}", (end - start));