2017-10-07 13 views

Répondre

0

Insertion de plusieurs ItemID serait pas un problème. La question est, comment vous souhaitez obtenir les ItemIds à votre procédure stockée. Il y a la possibilité d'utiliser XML ou une liste séparée par des virgules, mais les deux options ne sont pas vraiment "recommandées" car cela complique les choses. La meilleure solution serait de résoudre cela dans l'application et non dans la logique de la base de données.

0

Oui, il existe un moyen peu connu de télécharger une liste en tant que paramètre de procédure stockée unique et de le faire fonctionner sans appels multiples. Il y a un peu d'installation nécessaire.

D'abord, vous devez définir un type SQL qui peut contenir votre liste:

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

Ensuite, écrire une procédure stockée qui accepte ce type comme paramètre d'entrée:

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 

maintenant à liez vos données à la procédure stockée à partir de la fin de C#. Pour lier, vous devez stocker les données dans un premier DataTable, ce qui est relativement facile:

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

ensuite soumettre la table à la procédure stockée comme ceci:

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