我一直在为自己的公司从事个人项目,以控制库存水平,以练习C#。
我希望我的应用程序通过tblJuiceStock搜索,找到与用户输入内容匹配的FlavourID,并通过UPDATE SET查询更新该记录的库存。
public void InsertJuiceStockWithCheck()
{
using (OleDbConnection conn = new OleDbConnection())
{
conn.ConnectionString = ConnectionString;
conn.Open();
string tblJuiceStockCheck = "SELECT FlavourID, Quantity FROM tblJuiceStock";
OleDbCommand cmdCheck = new OleDbCommand(tblJuiceStockCheck, conn);
OleDbDataAdapter daCheck = new OleDbDataAdapter(cmdCheck);
DataTable dtCheck = new DataTable();
daCheck.Fill(dtCheck);
foreach (DataRow row in dtCheck.Rows)
{
if ((int)row["FlavourID"] == fID)
{
int currentQty = (int)row["Quantity"];
int updatedQty = currentQty + qty;
string tblJuiceStockExisting = @"UPDATE tblJuiceStock
SET Quantity = @newquantity
WHERE FlavourID = @flavourID";
OleDbCommand cmdJuiceStockExisting = new OleDbCommand(tblJuiceStockExisting, conn);
cmdJuiceStockExisting.Parameters.AddWithValue("@flavourID", fID);
cmdJuiceStockExisting.Parameters.AddWithValue("@newquantity", updatedQty);
cmdJuiceStockExisting.ExecuteNonQuery();
matchFound = true;
break;
}
}
if (!matchFound)
{
string tblJuiceStockNew = "INSERT INTO tblJuiceStock (FlavourID, Quantity, MinStockPOS) VALUES (@fID, @quantity, @minstock)";
OleDbCommand cmdJuiceStockNew = new OleDbCommand(tblJuiceStockNew, conn);
cmdJuiceStockNew.Parameters.AddWithValue("@fID", fID);
cmdJuiceStockNew.Parameters.AddWithValue("@quantity", qty);
cmdJuiceStockNew.Parameters.AddWithValue("@minstock", amt);
cmdJuiceStockNew.ExecuteNonQuery();
}
}
}
请注意:当我用相同的值替换参数时,此查询在Access中工作正常。同样,使用断点,我确定参数已设置正确的值,分配给它们的变量是在另一个方法中获取的,所有方法都在Submit button事件中调用。
但是,TblJuiceStock中的“数量”值保持不变。
答案 0 :(得分:0)
经过一段时间的讨论,答案很简单。 OLEDB确实可以使用命名参数,但是必须声明它们,如果不声明它们,它们将使用参数定位来匹配它们。
我的问题是,在查询字符串中,我先使用@newquantity,然后使用@flavourID,而在添加参数时,我先添加了@flavourID,然后又添加了@newquantity。