【问题标题】:reducing stock by one on selection在选择时减少库存
【发布时间】:2013-12-22 05:19:58
【问题描述】:

我正在尝试通过使用 on select 命令来选择电影,一旦选择就在标签中打印标题.. 效果很好。

下一部分是选定的电影将在单击按钮时从数据库库存中减 1。这就是我认为我感到困惑的地方,在单击按钮之前它不会显示任何错误。

更新查询的 C# 代码

protected void Button2_Click(object sender, EventArgs e)
{

    var myquery = string.Format("UPDATE DVD SET Stock = Stock - 1");
    da.InsertCommand = new OleDbCommand("INSERT INTO DVD (Stock) VALUES (@MessageLabel)", conn);
    {
        da.InsertCommand.Parameters.AddWithValue("@Stock", MessageLabel.Text);

        conn.Open();
            da.InsertCommand.ExecuteNonQuery();
            using (OleDbCommand cmd = new OleDbCommand(myquery, conn))
            cmd.ExecuteNonQuery();
        conn.Close();
        conn.Dispose();
    }
}

选择事件的先前代码

public void Latest_DVD()
{
    {
        using (OleDbDataAdapter dataquer = new OleDbDataAdapter("SELECT Title,Category,Director,Stock,Year FROM DVD ", conn))
        {
            dataquer.Fill(dt);
        }
    }
    DG_Latest.ShowHeader = true;
    DG_Latest.DataSource = dt;
    DG_Latest.DataBind();
    conn.Close();
    conn.Dispose();
}

protected void Latest_DVD_SelectedIndexChanged(Object sender, EventArgs e)
{
    GridViewRow row = DG_Latest.SelectedRow;
    MessageLabel.Text = "You selected to rent " + row.Cells[1].Text + ".";
}

所以我认为我的查询错误,可能也无法从标签中检索更新,但也许 on 选择了它自己...我不确定。

它显示的错误是

Data type mismatch in criteria expression.

连接打开后

【问题讨论】:

  • 您不认为告诉我们错误是什么会有帮助吗?
  • 当然是您的权利,它显示标准表达式中的数据类型不匹配。在 da.InsertCommand.ExecuteNonQuery() 上;我整理一下我的问题
  • 您确定要在 Stock 列中插入“您选择租借电影 A”吗?
  • 那是我不确定的,我需要点击按钮将库存减少一个。

标签: c# asp.net sql visual-studio-2012 insert-update


【解决方案1】:

正如@afzalulh 所说,删除插入部分。并将 myquery 字符串更改为:

var myquery = string.Format("UPDATE DVD SET Stock = Stock - 1 WHERE Title = @Title");
var row = DB_Latest.SelectedRow;
var title = row.Cells[0].Text;
var cmd = new OleDbCommand(myquery, conn);
cmd.Parameters.AddWithValue("@Title", title);

这样,您只需更新所选 DVD 标题的 Stock。如果不添加 WHERE 子句,查询将减少所有 DVD 的库存。

【讨论】:

  • 谢谢,我如何更改查询以减少选择的一张 DVD 而不是全部?
  • 我的回答告诉你怎么做。将现有代码中的 var myquery = ... 替换为我的答案中的代码。
  • 您为什么建议某人在他们的应用程序中构建 SQL 注入漏洞?
  • 谢谢你,我已经让它工作了,@DanielMann 谢谢你,我会阻止注射。
  • @DanielMann 使用参数更新了我的答案以防止 sql 注入。
【解决方案2】:

您要更新库存,无需插入。我相信这就是你想要的:

protected void Button2_Click(object sender, EventArgs e)
{

    var myquery = string.Format("UPDATE DVD SET Stock = Stock - 1");
    conn.Open();
    using (OleDbCommand cmd = new OleDbCommand(myquery, conn))
        cmd.ExecuteNonQuery();
    conn.Close();
    conn.Dispose();
}

编辑: myquery 应包括 WHERE,正如 har07 所建议的那样。否则它会将所有 DVD 的库存减少 1。

【讨论】:

  • 谢谢@afzalulh,应该删除打开的连接,因为它似乎正在干扰
  • 嗯,你的工作,但没有 where 所以它会删除所有,当我尝试包括它不起作用的地方时
猜你喜欢
  • 2014-01-25
  • 2013-12-29
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
相关资源
最近更新 更多