2017-10-07 59 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(); 
相关问题