2017-10-07 62 views

回答

0

插入多的ItemID就沒有問題。問題是,你想如何獲得ItemIds到你的存儲過程。有可能使用XML或用逗號分隔的列表,但這兩個選項都不是真正的「推薦」,因爲它使事情變得複雜。最好的解決方案是在應用程序中解決這個問題,而不是數據庫邏輯。

0

是的,有一種鮮爲人知的方式將列表上載爲單個存儲過程參數,並使其在沒有多次調用的情況下工作。需要一些設置。

首先,你必須定義,它可以包含你的列表中的SQL類型:

CREATE TYPE dbo.MyList 
AS TABLE 
(
    ID VarChar(50) 
); 

然後,寫一個接受這種類型作爲輸入參數的存儲過程:

CREATE PROCEDURE dbo.InsertOrderItems 
    @OrderID int, @ItemList AS dbo.MyList READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO [dbo][Orders] 
    SELECT @OrderID 

    INSERT INTO [dbo].[OrderItems] 
    SELECT @OrderID, ID FROM @ItemList 
END 

我們將你的數據綁定到C#端的存儲過程。要綁定它,你必須存儲在DataTable第一的數據,這是比較容易的:

var table = new DataTable(); 
table.Columns.Add("ID", typeof(string)); 
foreach (var itemID item in order.Items) 
{ 
    table.Rows.Add(itemID); 
} 

然後提交表格的存儲過程,像這樣:

var cmd = new SqlCommand() 
    { 
     CommandType = CommandType.StoredProcedure, 
     CommandText = "InsertOrderItems", 
     Connection = myConnection 
    }; 
cmd.Parameters.Add(new SqlParameter("@OrderID", order.ID); 
cmd.Parameters.Add(new SqlParameter("@ItemList", SqlDbType.Structured) 
    { 
     TypeName = "dbo.MyList", 
     Value = table 
    }); 
cmd.ExecuteNonQuery(); 
相關問題