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