我想在这里做一些类似的事情:如何插入多行而不重复语句的“ INSERT INTO dbo.Blah”部分? 除了除了要在一个查询中(快于几十个查询)执行此操作外,我还想将其参数化,因为输入来自网络。
目前我有
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(); }
这有点迟钝(请注意,实际示例中有更多的列,但这会使事情更加混乱)。
由于您正在使用c#和sql server 2008,因此可以使用表值参数向数据库中插入多行。这是有关如何执行此操作的简短说明:
c#
sql server 2008
首先,您需要创建一个用户定义的表类型:
CREATE TYPE MyTableType AS TABLE ( Col1 int, Col2 varchar(20) ) GO
然后,您需要创建一个存储过程,该存储过程将接受此表类型作为参数
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
最后,从您的C#代码执行以下存储过程:
DataTable dt = new DataTable(); dt.Columns.Add("Col1", typeof(int)); dt.Columns.Add("Col2", typeof(string)); // Fill your data table here using (var con = new SqlConnection("ConnectionString")) { using(var cmd = new SqlCommand("MyProcedure", con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@MyTable", SqlDbType.Structured).Value = dt; con.Open(); cmd.ExecuteNonQuery(); } }