希望するものはtable valued parameterです。私たちは、コンマで区切られた文字列を手続きに渡し、分割して複数の手続き呼び出しを行う必要がないように、あるいはXMLを渡すような、本当に面倒な作業をしていました。これは2008年に出てきました。データベースで
あなたがタイプ宣言します:(。ただ、データ型を構成する/推測)
CREATE TYPE ProductUpdateTableType AS TABLE
(productId int, propertyId int, propertyValue varchar(20));
を
次に、あなたはこのようにパラメータを使用するストアドプロシージャに:
CREATE PROCEDURE UpdateProducts
@productUpdates ProductUpdateTableType READONLY
AS
UPDATE products set propertyValue = updates.propertyValue
FROM
ProductProperties product
JOIN @productUpdates updates
on product.productId = updates.productId
and product.propertyId = updates.propertyId
パラメータはテーブルのように使用しています。
C#側では、DataTable
を作成し、テーブルの種類に一致する列を追加する必要があります。次に、個々の値を含む行を追加します。あなたがProductUpdateParameter
のインスタンスを作成して、必要な数の項目を追加する方法
public class ProductUpdateParameter : DataTable
{
public ProductUpdateParameter()
{
Columns.Add("productId", typeof (int));
Columns.Add("propertyId", typeof (int));
Columns.Add("propertyValue", typeof (string));
Columns[2].MaxLength = 20;
}
public void AddProductUpdate(int productId, int propertyId, string propertyValue)
{
Rows.Add(productId, propertyId, propertyValue);
}
}
:私は通常、このようなクラスを作成します。 はその後、あなたのプロシージャを呼び出すとき、あなたはこのようにそれを行うだろう:
var updateParameter = new SqlParameter("@productUpdates", SqlDbType.Structured);
updateParameter.TypeName = "dbo.ProductUpdateTableType";
updateParameter.Value = [your data table]
次に、あなたのSqlCommand
にそのパラメータを追加し、それを実行します。
多分、ストアドプロシージャについて読んでいますか?これはとても基本的なように見えますが、それは本書のほぼ1ページ目です。 – DavidG
"このコードを翻訳する"は、スタックオーバーフローの適切な "質問"ではありません。 – Blorgbeard
Blorgbeard、私のコードで私はコレクション内のすべてのアイテムの更新ステートメントを作るためにループスルーしました。私の質問は、私はストアドプロシージャと同じことをすることができます...私の混乱は、ストアドプロシージャとループを作成する方法です....ありがとう – Lucy