2014-07-08 124 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

相關問題