2010-12-06 17 views
1

同じIDのアイテムが既にデータベースに格納されているかどうかを確認したい場合は、そのアイテムの数量を更新することができます。私が をforeachループで持っているという事実は、各アイテムの数量を更新します。Foreachループの変数を使用する

私はループの外にコマンドを置いたとき、コンテキストではないので「ItemID」を使用することができませんが、とにかくこれを回避できますか?

IF EXISTSが冗長である

foreach (UserItem ItemID in (List<UserItem>)Session["UserSession"]) 
{ 
    ConclusionPage.InsertCommand = "IF EXISTS (SELECT ItemID FROM tblUserItems WHERE UserID='@CurrentUser' AND ItemID='@ItemID') UPDATE tblUserItems SET Quantity = Quantity+1 WHERE (UserID = '@CurrentUser') AND (ItemID = '@ItemID')"; 
    ConclusionPage.Insert();     
} 

答えて

1

ありがとうございました。 UPDATEステートメントは同じWHERE句を使用するため、同じ基準に一致するレコードにのみ更新を適用します。

0

DB内のすべての数量を更新するコードが実際に表示されていますか?理論的には、IF EXISTSの部分は、それが起こらないようにすべきです。

SQLコマンドをこのようなものに変更することをお勧めしますが、IF EXISTSチェックは、UPDATEでWHEREを使用してチェックを処理できるので余計です。

UPDATE tblUserItems SET Quantity = Quantity + 1 WHERE (UserID = '@CurrentUser') AND AND (ItemID = '@ItemID') 

あなたはそれが潜在的にデータベースへの不要な呼び出しの多くを引き起こす可能性と同じように、まだDBに行うために多くの仕事であるUserItemsの多くを持っている場合は、と述べました。あなたのアーキテクチャーの仕組みを知らなければ、言うことは不可能ですが、代替案を検討する価値があるかもしれません。

0

結論ページに移動したときに私がメインページと結論ページの間を移動していたときに、これが問題であるかどうかはわかりません:クオンタイトは自分自身を更新します:Sおそらくライフサイクルの問題?私はをPage_Loadでこれを持っていると私はPage_initにそれを移動しても同じ問題がある

EDIT:

私はボタンを「追加」をクリックして倍の量は、数の量が量は、例えば増加されます各ページの荷重を2ずつ増やしてください。

1

コマンド(IF EXISTS ...)が必要ないと思います。

このコードを試してみてください。

ConclusionPage.UpdateCommand.Parameters.Add(new System.Data.SqlClient.SqlParameter("@CurrentUser", System.Data.SqlDbType.Int, 0, System.Data.ParameterDirection.Input, 0, 0, "UserID", System.Data.DataRowVersion.Current, false, null, "", "", "")); 
    ConclusionPage.UpdateCommand.Parameters.Add(new System.Data.SqlClient.SqlParameter("@ItemID", System.Data.SqlDbType.Int, 0, System.Data.ParameterDirection.Input, 0, 0, "ItemID", System.Data.DataRowVersion.Current, false, null, "", "", "")); 
    ConclusionPage.CommandType = System.Data.CommandType.Text; 
    ConclusionPage.UpdateCommand = "UPDATE tblUserItems SET Quantity = Quantity+1 WHERE (UserID = @CurrentUser) AND (ItemID = '@ItemID')"; 

    foreach (UserItem ItemID in (List<UserItem>)Session["UserSession"]) 
    { 
     ConclusionPage.Parameters[0].Value = CurrentUser; 
     ConclusionPage.Parameters[1].Value = ItemID; 
     ConclusionPage.ExecuteNonQuery(); 
    }