我希望能够检查一下具有相同ID的项目是否已经放入数据库中,如果是,那么更新该项目的数量,但是由于我有这个事实 这在foreach循环中会更新每个项目的数量。
当我将Command放在循环之外时,我无法使用'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();
}
答案 0 :(得分:1)
IF EXISTS
是多余的。由于UPDATE语句使用相同的WHERE
子句,因此它仅将更新应用于符合相同条件的记录。
答案 1 :(得分: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();
}
答案 2 :(得分:0)
您是否真的看到代码更新了数据库中的所有数量?理论上,IF EXISTS部分应该防止这种情况发生。
虽然我建议您将SQL命令更改为类似的内容,但IF EXISTS检查是多余的,因为您可以在UPDATE上使用WHERE来处理检查。
UPDATE tblUserItems SET Quantity = Quantity + 1 WHERE (UserID = '@CurrentUser') AND AND (ItemID = '@ItemID')
话虽如此,如果你有很多UserItems仍然需要DB做很多工作,因为它可能会触发大量不必要的数据库调用。如果不了解您的架构的细节,就不可能说,但可能值得一看另类。
答案 3 :(得分:0)
我不确定这是不是问题,当我在主页和结论页面之间移动时,当我移到结论页面时,数量会更新自己:S那么也许它可能是生命周期问题?我在Page_Load中有这个,我把它移到了Page_init,仍然有同样的问题
编辑:
我点击“添加”按钮的次数是数量增加的数量,例如在每次页面加载时单击两次数量增量两次