在这种情况下,我正在处理两个gridviews(gvSnacks和gvSnackCart)。 gvSnacks包含一个固定的项目列表,其中包含一个模板按钮列,用于将项目“添加”到gvSnackCart。
foreach开始发挥作用,因为我想确保该物品尚未放入购物车。如果用户选择了两次项目,我想执行sql命令并使该项目的gvSnackCart数量增加1(而不是生成新记录)。
如果记录不在gvSnackCart中,则foreach应该一直循环到默认值并插入它。
这是要插入的SQL命令
string sqlInsert = "INSERT INTO ShoppingCart…
([shopperID], [itemName], [itemType], [quantityOrdered], [unitPrice])…
VALUES (@shopperID, @itemName, @itemType, @quantityOrdered, @unitPrice)";
myCommand.Parameters.Add("@shopperID", System.Data.SqlDbType.NVarChar).Value = txtCurrentUser.Text;
myCommand.Parameters.Add("@itemName", System.Data.SqlDbType.NVarChar).Value = snackDescription;
myCommand.Parameters.Add("@itemType", System.Data.SqlDbType.NVarChar).Value = "snack";
myCommand.Parameters.Add("@quantityOrdered", System.Data.SqlDbType.Int).Value = 1;
myCommand.Parameters.Add("@unitPrice", System.Data.SqlDbType.Money).Value = snackPrice;`
SqlCommand myCommand = new SqlCommand(sqlInsert, myConnection);`
现在我从gvSnacks获取所选项目的名称,并与gvSnackCart中存在的每个项目进行比较
// Retrieve item's name
int index = Convert.ToInt32(e.CommandArgument);
GridViewRow row = gvSnacks.Rows[index];
string snackDescription = row.Cells[2].Text.ToString();
// Checks for duplicate snack listing
int duplicate = 0;
foreach (GridViewRow gvRowSnack in gvSnackCart.Rows)
{
if (gvRowSnack.Cells[1].Text.ToString() == snackDescription)
{
duplicate = 1;
}
switch (duplicate)
{
case 0:
break;
case 1:
//This is the case where it's a duplicate
//and will be a command to update the record
break;
default:
try
{
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
}
catch (Exception ex)
{
lblError.Visible = true;
lblError.Text = "There was an error while adding the records" + "<br />" + ex.Message;
}
break;
}
}
gvSnackCart是数据绑定的,应该使用新项目进行更新,除非它在进行更新时重复。但由于某种原因,它无法运作。我没有在运行时收到错误。我已经测试了带有标签的读/写,所以我知道我正在从gvSnacks中检索项目名称。我也在检查数据库表,它没有显示任何添加的记录。什么看似不对?
答案 0 :(得分:2)
使用LINQ可以省去很多麻烦:
foreach (var snacks in gvSnackCart.Rows.GroupBy(snack => snack.Cells[1].Text.ToString()))
{
var p = myCommand.Parameters;
// I'm largely guessing at these, but hopefully you get the idea.
p.Add("@shopperID" , SqlDbType.NVarChar).Value = txtCurrentUser.Text;
p.Add("@itemName" , SqlDbType.NVarChar).Value = snacks.Key;
p.Add("@itemType" , SqlDbType.NVarChar).Value = /* ??? */;
p.Add("@quantityOrdered", SqlDbType.Int ).Value = snacks.Count();
p.Add("@unitPrice" , SqlDbType.Money ).Value = snacks.Sum(r => r.SnackPrice);
…
}