2014-07-08 93 views
10

如何使用C#将数组变量传递给SQL Server存储过程并将数组值插入整行中?将数组传递给SQL Server存储过程

在此先感谢。

SQL Server表:

ID | Product | Description 
------------------------------- 
8A3H | Soda | 600ml bottle 

C#阵列:

string[] info = new string[] {"7J9P", "Soda", "2000ml bottle"}; 

SQL Server存储过程:

ALTER PROC INSERT 
    (@INFO_ARRAY ARRAY) 
AS 
BEGIN 
    INSERT INTO Products VALUES (@INFO_ARRAY) 
END 
+2

是否有任何理由,为什么你不能只使用多个参数或者你只是寻找一个快捷方式? –

+4

这可能有帮助 - http://stackoverflow.com/questions/11102358/how-to-pass-an-array-into-a-sql-server-stored-procedure?rq=1 –

+0

只是看一个快捷方式。 @DStanley – user3658439

回答

18

在SQL Server 2008和更高

创建SQL Server中的类型,像这样:

CREATE TYPE dbo.ProductArray 
AS TABLE 
(
    ID INT, 
    Product NVARCHAR(50), 
    Description NVARCHAR(255) 
); 

改变在SQL Server的过程:

ALTER PROC INSERT_SP 
@INFO_ARRAY AS dbo.ProductArray READONLY 
AS 
BEGIN 
    INSERT INTO Products SELECT * FROM @INFO_ARRAY 
END 

然后,你需要创建值的DataTable对象在C#中传递:

DataTable dt = new DataTable(); 
//Add Columns 
dt.Columns.Add("ID"); 
dt.Columns.Add("Product"); 
dt.Columns.Add("Description"); 
//Add rows 
dt.Rows.Add("7J9P", "Soda", "2000ml bottle"); 

using (conn) 
{ 
    SqlCommand cmd = new SqlCommand("dbo.INSERT_SP", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    SqlParameter dtparam = cmd.Parameters.AddWithValue("@INFO_ARRAY", dt); 
    dtparam.SqlDbType = SqlDbType.Structured; 
} 
+0

这看起来几乎与答案相同在我上面发布的链接中。你自己写了这个,还是你改变了这个答案? –

+0

我基于我在这里发现的一篇文章,基于我几周前写的代码编写了这个代码:[link](http://www.codeproject.com/Questions/631284/How-to-pass-an-array- SQL SERVER-stored-pro) – kerbasaurus

+0

我在存储过程中出现错误:“必须声明一个标量变量”@INFO_ARRAY“”@kerbasaurus – user3658439

2

这里是一种简单的例子:

我已经一直在搜索如何将任何数组传递到SQL Server的所有示例和答案,直到我发现这个linK,下面是我如何将它应用到我的项目中:

- 以下代码将获取数组参数,并插入 --array的值到另一个表

Create Procedure Proc1 



@INFO_ARRAY ARRAY nvarchar(max) //this is the array your going to pass from C# code 

AS 

    declare @xml xml 

    set @xml = N'<root><r>' + replace(@INFO_ARRAY,',','</r><r>') + '</r></root>' 

    Insert into Products 
    select 
    t.value('.','varchar(max)') 


    from @xml.nodes('//root/r') as a(t) 
END 

希望你喜欢它

+0

已投票,但应该在评论中添加“ARRAY”? – Panzercrisis

相关问题