2016-04-28 8 views
0

このコードと同じ機能を実行するストアドプロシージャを作成する方法はありますか?ストアドプロシージャを作成して複数行をC#から更新する方法

string sql = "Update Product set ProductName='" + Product.Name + "' where ProductId=" + Product.Id + ""; 

foreach (var item in Product.pros) 
{ 
    sql += "Update ProductProperties set PropertyValue ='" + item.PropertyValue + "' where PropertyId =" + item.PropertyId + " and ProductId =" + Product.Id + ""; 
} 

db.Database.ExecuteSqlCommand(sql); 
+2

多分、ストアドプロシージャについて読んでいますか?これはとても基本的なように見えますが、それは本書のほぼ1ページ目です。 – DavidG

+1

"このコードを翻訳する"は、スタックオーバーフローの適切な "質問"ではありません。 – Blorgbeard

+0

Blorgbeard、私のコードで私はコレクション内のすべてのアイテムの更新ステートメントを作るためにループスルーしました。私の質問は、私はストアドプロシージャと同じことをすることができます...私の混乱は、ストアドプロシージャとループを作成する方法です....ありがとう – Lucy

答えて

1

希望するものは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にそのパラメータを追加し、それを実行します。

関連する問題