2010-12-06 123 views
1

我希望能够检查具有相同ID的项目是否已经放入数据库中,如果是,则更新该项目的数量,但是由于事实上,我有 这在foreach循环,它会更新每个项目的数量。使用Foreach循环中的变量

当我把命令放在循环之外时,我无法使用'ItemID',因为它不在上下文中,有没有我可以解决这个问题?

谢谢

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

IF EXISTS是多余的。由于UPDATE语句使用相同的WHERE子句,因此它只会将更新应用于符合相同条件的记录。

0

您是否真的看到代码更新数据库中的所有数量?从理论上讲,IF EXISTS部分应该防止这种情况发生。

话虽如此,我建议您将SQL命令改为这样的东西,IF EXISTS检查是多余的,因为您可以在UPDATE上使用W​​HERE来处理检查。

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

说了这么多,如果你有很多UserItems的仍然是大量的工作,为DB做,因为这将有可能引发很多数据库不必要的电话。不知道你的体系结构的来龙去脉是不可能的,但它可能值得寻找替代品。

0

我不知道是否这是问题,当我在主页面和结论页面之间移动时,当我移动到结论页面时,量子更新自己:S因此,也许它可能是生命周期问题?我有这个在Page_Load中,我搬到它Page_init,仍然有同样的问题

编辑:

的时候,我点击“添加”量按钮的数量增加例如数量点击两次数量增量,每页加载两次

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