1

これは私の最初の投稿です。

データアクセス層として機能するWCFサービスを備えたMVC3でプログラムを作成しています。私のDALでは、ある種の「バッチ」挿入と更新を行う必要があります。特に、たとえば注文の場合、1つの注文に複数のアイテムがあり、複数の支払い方法などがあるとします。したがって、新しい注文を挿入すると、その注文に関連するすべてのアイテムを挿入する必要があります。

したがって、私が探しているのは、いくつかのストアドプロシージャを実行できる、より良い方法と実行可能な方法です。たとえば、注文を挿入するプロシージャ、アイテムを挿入するプロシージャなどです。

テーブルOrderとは、( fk)、(fk)、、。を持つ3番目のItemテーブルとリンクされています。Order_Itemsorder_iditem_idqtyprice

コマンドテキストを変更し、トランザクションで非クエリを実行することで複数のコマンドを実行できることはわかっていますが、テキストコマンドをハードコーディングする代わりにストアドプロシージャを実行したいです。または、コマンドテキストを次のように作成してプロシージャを実行できます。

cmd.CommandText = 'exec sp_insert_order @order_number @order_date ...'
cmd.ExecuteNonQuery();

次に、アイテムをループします

foreach (string s in insert_items)
{
    cmd.CommandText = s;
    cmd.ExecuteNonQuery();
}

これらすべてをトランザクション内で実行してからコミットします。しかし、これがこれほどクリーンな方法であるとは思いません。誰かが意見を共有してください。

4

3 に答える 3

4

ストアドプロシージャを使用している場合は、呼び出し方法を変更する必要があります。このアプローチを使用することをお勧めします。

// define your stored procedure name, and the type 
cmd.CommandText = 'dbo.sp_insert_order';
cmd.CommandType = CommandType.StoredProcedure;

// define and fill your parameters
cmd.Parameters.Add("@order_number", SqlDbType.Int).Value = order_nr;
cmd.Parameters.Add("@order_date", SqlDbType.DateTime).Value = ......;

cmd.ExecuteNonQuery();

基本的に、呼び出すストアドプロシージャごとにこれを行う必要があり、問題なくすべてを1つのトランザクションにラップできます。

using(SqlConnection connection = new SqlConnection("your-connection-string-here"))
{
   SqlTransaction transaction = connection.BeginTransaction();

   try
   {
        // call all stored procuedures here - remember to assign the 
        // transaction to the SqlCommand!!
         ....

        transaction.Commit();
    }
    catch(Exception exc) 
    {
       transaction.Rollback();
    }        
}
于 2012-02-03T22:22:09.947 に答える
0

メソッドのTransactionScope属性を使用して、すべての作業をトランザクションプロシージャまたはテキストで囲むことができます

于 2012-02-03T22:20:39.633 に答える
0

また、WCFに組み込まれているトランザクション伝播機能にも興味があるかもしれません。これは、WCFへの各Webサービス呼び出しが自動的にトランザクションを作成し、コミットまたはロールバックするように構成できます。基本的には、サービスメソッド呼び出し全体をトランザクションにラップします。

ここに良いMSDNの記事があります

これは少し高度なトピックであり、必要なものにはやり過ぎかもしれませんが、覚えておくべきことがあります。

于 2012-02-04T01:13:37.463 に答える