C# C中的数量控制

C# C中的数量控制,c#,c#-4.0,C#,C# 4.0,pstrjds,根据您提供的代码,我正在尝试实现该代码以及您几天前提供的msdn链接。我不知道如何把它放在一起,但我看到一条消息,变量名'@ID'已经声明。变量名在查询批处理或存储过程中必须是唯一的。我是否需要创建存储过程?我能不能假设我的ID也正确,你解释了多少次?非常感谢。 在这里输入代码 cs.Open(); int remainingStock = 0; string Query = "SELECT StockA SET QTY = @QT

pstrjds,根据您提供的代码,我正在尝试实现该代码以及您几天前提供的msdn链接。我不知道如何把它放在一起,但我看到一条消息,变量名'@ID'已经声明。变量名在查询批处理或存储过程中必须是唯一的。我是否需要创建存储过程?我能不能假设我的ID也正确,你解释了多少次?非常感谢。 在这里输入代码

        cs.Open();
        int remainingStock = 0;
        string Query = "SELECT StockA SET QTY = @QTY " + "WHERE ID = @ID;";
           SqlCommand cmd = new SqlCommand(Query, cs);
            cmd.Parameters.Add("@ID", SqlDbType.Int);
            cmd.Parameters["@ID"].Value = 1;
            cmd.Parameters.AddWithValue("@ID", Query);
            try
            {
                if (remainingStock == 1)
                {
                    lbqty.Text = "Not enough stocks.";
                }
                else
                {
                    cmd.CommandText = "UPDATE StockA SET QTY = QTY-1   
                    WHERE ID=1";
                    int rowsUpdated = cmd.ExecuteNonQuery();
                    remainingStock--;
                    string remaining = "Remaining stocks: " +  
                    remainingStock.ToString();
                    txQty.Text = remaining;
                    lbqty.Text = remaining;
                    DGA.Update(); //this is DataGridView
                }
                Int32 rowsAffected = cmd.ExecuteNonQuery();
                Console.WriteLine("RowsAffected: {0}", rowsAffected);

            }
            catch (Exception ex)
            {
               MessageBox.Show(ex.Message);
            }
            cs.Close();

    }

你的申请流程应该如下

protected void Button1_Click(object sender, EventArgs e)
    {
        SqlConnection c = new SqlConnection("Data Source=.; Integrated Security=SSPI; Initial Catalog=FA");


        SqlCommand cmd = new SqlCommand();
        cmd.Connection = c;
        c.Open();

        // get remaining stocks
        cmd.CommandText = "SELECT Qty from TEST WHERE Id=1";
        int ret = Convert.ToInt32(cmd.ExecuteScalar().ToString());

        if (ret == 0)
        {
            Label1.Text = "Not enough stocks.";
        }
        else 
        {
            cmd.CommandText = "UPDATE TEST SET Qty = Qty-1 WHERE Id=1";
            cmd.ExecuteNonQuery();

            if (ret == 2)
            {
                Label1.Text = "Re-order. Remaining stocks: 1";
            }
            else
            {
                Label1.Text = "Remaining stocks: " + (ret-1).ToString();
            }
        }


        c.Close();
    }

我认为这是你的问题-你在处理时做了ret-1,然后

txtQty.Text = "Remaining stocks: " + (ret - 1).ToString();
lbqty.Text = "Remaining stocks: " + (ret - 1).ToString();
这表明少了一项。试着做:

txtQty.Text = "Remaining stocks: " + ret.ToString();
lbqty.Text = "Remaining stocks: " + ret.ToString();

我能看到的第一件事是,这是不对的

 if (ret == 1)
        {
            lbqty.Text = "Re-order. Remaining stocks: 1";
            dgUpdate();
        }
        else
应该是

 if (ret - 1  == 1)
        {
            lbqty.Text = "Re-order. Remaining stocks: 1";
            dgUpdate();
        }
        else

因为当您读取的值为1时,您将其减小为0

问题在于您没有检查ret==-1的情况。将第二个if语句更改为ifret<1应该可以解决您的问题


另外,直接在cmd.ExecuteNonQuery行之后;添加ret-;将ret变量与数据库中当前的值同步。

再次阅读您的问题后,我更确信我发布的评论实际上是问题所在。你在问题中说你的数量没有下降。如果查看行中的返回值:

cmd.ExecuteNonQuery();
在您的else语句中,我相信您将得到一个值0。这表示没有更新的记录。我相信这个问题正与你的疑问有关。如果使用LINQPad或Sql Management studio等实用工具连接到数据库,并运行代码中列出的查询,我想您会发现它没有更新任何内容。我高度怀疑您的库存没有存储在名为tblContacts的表中。这就是为什么您不能从中选择数量,也不能更新其中的数量

编辑: 本来打算一开始就提到这一点,但后来却偏离了方向,忘了添加它。我会将您的SqlCommand放在using语句中。SqlCommand对象是一次性的,因此最好将一次性对象放在using语句中,或者放在某种可以清理它们的try/finally模式中

其他编辑-重新构造代码:

    cs.Open();
    int remainingStock = 0;
    string Query = "SELECT QTY from tblInventory WHERE ID=19";
    using(SqlCommand cmd = new SqlCommand(Query, cs))
    {
        var result = cmd.ExecuteScaler();
        if (result != null)
        {
            string str = result.ToString();
            if (!string.isNullOrWhiteSpace(str))
            {
                // NOTE: It would probably be safer to use int.TryParse here
                remainingStock = Convert.ToInt32(cmd);
            }

            if (remainingStock == 0)
            {
                lbqty.Text = "Not enough stocks.";
            }
            else
            {
                cmd.CommandText = "UPDATE tblInventory SET QTY = QTY-1 WHERE ID=19";
                int rowsUpdated = cmd.ExecuteNonQuery();
                remainingStock--;

                if (remainingStock == 1)
                {
                    lbqty.Text = "Re-order. Remaining stocks: 1";
                }
                else
                {
                    string remaining = "Remaining stocks: " + remainingCount.ToString();
                    txtQty.Text = remaining;
                    lbqty.Text = remaining;
                }
            }
        }
        else
            lbqty.Text = "No stock for contact";
        }

        dgUpdate();
    }
    cs.Close();

卡迪尔-请你看看我的第一个帖子。我使用了你的代码,但它没有正常工作。Kadir-很抱歉,它没有正常工作。我在上面对joshperry.Migol有一些补充意见-它不起作用。库存水平不会降低。但输出消息表示-1。为什么库存水平没有降低呢?乔什·佩里——恐怕这并不能解决问题。我不断收到的信息:剩余库存:1。单击btQty时,else语句不应该降低库存水平吗?如果可能,什么是替代方案?@user您的更新查询正在减少您的库存。其他的只是显示。您需要附加调试器并查看ExecuteScalar调用的返回值。根据您的代码,如果返回的是空字符串,则将ret设置为-1。当ret为-1时,原始代码将标签设置为-2。如果没有数据库和其他代码,那么很难进行诊断。我假设你得到的是一个空字符串,为什么你得到的是一个空字符串是另一回事,这就是调试器的作用。Pstrids-哦,我明白了。我会尝试一下,我会尽快告诉你我的进展。谢谢。@user有什么更新吗?您是否检查了访问的表是否正确?我仍然相当有信心这是你的问题。尤其是你评论说你的库存水平没有下降。这是您正在运行的查询的函数,而不是UI update.Pstrids-很抱歉延迟,是的,我有一个更新。我只有一张桌子,tblContacts。我收到以下错误…NullReferenceException未处理对象引用未设置为对象的实例。对于行字符串str=cmd.ExecuteScalar.ToString;因此,将对象转换为字符串也不能解决问题?有什么建议吗?我更新了代码,你需要检查ExecuteScalar的结果。它返回为null,这意味着查询返回的是一个空记录集。这就是为什么您的数据没有被更新,没有相关记录。我仍然收到相同的错误消息,行为…string str=result.ToString;我把这两个问题合并起来了。如果您需要澄清,请编辑您的问题,不要打开新问题。谢谢。您不需要AddWithValue行,如果要使用AddWithValue,请删除该行Add@ID,SqlDbType.Int和参数[@ID].Value=1,并将其替换为AddWithValue@ID1.