【问题标题】:Update Set command works in Access but not in Visual Studio with @parameters更新集命令在 Access 中有效,但在带有 @parameters 的 Visual Studio 中无效
【发布时间】: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 值保持不变。

My tblJuiceStock table

【问题讨论】:

  • 我认为 OleDbConnection 需要 ? 用于 Sql 字符串中的参数而不是命名的参数
  • 我读到了,我在我的应用程序的其他几个 oledb 命令中使用了命名参数,它工作正常。例如,if(!matchfound) 包含一个使用命名参数的 oledb 命令,并且该查询工作正常。
  • 我对声明表示歉意。当我对 MsSql 使用 OleDb 时,它会抱怨。我承认我从未针对 MsAccess 尝试过

标签: c# sql ms-access


【解决方案1】:

经过一段时间的混乱,答案很简单。 OLEDB 确实可以使用命名参数,但您必须声明它们,如果您不声明它们,它们会使用参数定位来匹配它们。

我的问题是,在我的查询字符串中,我首先添加了@newquantity,然后添加了@flavourID,而在添加参数时,我首先添加了@flavourID,然后添加了@newquantity。

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多