【发布时间】:2019-03-15 15:13:23
【问题描述】:
我一直在为我工作的公司做一个个人项目,以控制库存水平以练习我的 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 中运行良好。另外,使用断点,我发现参数设置了正确的值,分配给它们的变量是在另一个方法中获得的,所有方法都在提交按钮事件中调用。
但是,TblJuiceStock 中的 Quantity 值保持不变。
【问题讨论】:
-
我认为 OleDbConnection 需要
?用于 Sql 字符串中的参数而不是命名的参数 -
我读到了,我在我的应用程序的其他几个 oledb 命令中使用了命名参数,它工作正常。例如,if(!matchfound) 包含一个使用命名参数的 oledb 命令,并且该查询工作正常。
-
我对声明表示歉意。当我对 MsSql 使用 OleDb 时,它会抱怨。我承认我从未针对 MsAccess 尝试过