在 C# 中将多个参数化变量添加到数据库中

Posted

技术标签:

【中文标题】在 C# 中将多个参数化变量添加到数据库中【英文标题】:Adding multiple parameterized variables to a database in c# 【发布时间】:2015-11-05 01:31:36 【问题描述】:

我想对这里做些类似的事情:How do I insert multiple rows WITHOUT repeating the "INSERT INTO dbo.Blah" part of the statement? 除了在一个查询中执行此操作(比几十个更快)之外,我还希望将其参数化,因为输入来自网络。

目前我有

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();

这有点迟钝(请注意,实际示例有更多的列,但这会使事情变得更加混乱)。

【问题讨论】:

我有一个疯狂的解决方案,但你不会喜欢它......假设你真的有大量的物品要一次插入它是值得的...... 【参考方案1】:

由于您使用的是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();
    

【讨论】:

哇,这很优雅你得到了我的赞成票......而且它一直都在那里,我不知道...... :(【参考方案2】:

您可以使用 SQL 语法:

INSERT INTO YOUR_TABLE (dataColumn) VALUES (data1),(data2),(data3)

因此,循环遍历您想要插入的行并将“,(datax)”附加到您的查询中,并添加相应的参数。 也许有帮助。

【讨论】:

问题是一次插入一列对吗?但我的专栏不止 1 列,还是有办法解决这个问题? 这不是问题,问题是您必须动态构建值列表,并且还必须动态构建参数列表,否则会有 sql 注入的风险。 @AdrianSalazar 这是一个完全有效的 tsql 语法。自己试试吧。 @AdrianSalazar 每个人都可以犯错。你也是:-)。 @Thijser 在链接中有一个循环,每次都使用单个参数执行查询。但是,在循环中创建参数列表并非不可能,事实上,如果您没有在 sql server 上创建类型或过程的权限,我认为它甚至可能是一个很好的解决方案。

以上是关于在 C# 中将多个参数化变量添加到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中将更新参数添加到 SQLDataSource

如何使用 C# 以编程方式复制 MS SQL 2000 数据库?

如何在c#中将数据添加到集合列表中[重复]

在 C# 中将 2 个本地字符串 [] 添加到单个数组中

怎样在spss中将数值型变量转换成分类变量,比如将年龄转换成年龄段,并记为1,2,3等类

如何在 C# 代码中将嵌入式数据源添加到 RDL?