【问题标题】:Button for updating database not working用于更新数据库的按钮不起作用
【发布时间】:2016-02-06 13:47:33
【问题描述】:

我有带表格的数据库

  • dbo.auctions : [id] [productid] [lastbider] [bidvalue] [lastbid]
  • dbo.products : [id] [name]
  • dbo.users : [id] [name] [password] [bids]

我需要编写一个程序来检查[bids] 是否大于0。

如果是,则更新[lastbid] 并将[bidvalue] 添加到其中,例如lastbid = lastbid + bidvalue[bids] 降低1,bids = bids - 1。我需要将其连接到Visual Studio 中的Button

我写了这个程序:

ALTER PROCEDURE [dbo].[usp_makebid] (
    @userid int, @auctionid int
)


 AS
DECLARE @bids int, @lastbid int
SELECT @bids = COUNT (*)
FROM users
WHERE users.id = @userid

IF @bids > 0
BEGIN
    UPDATE auctions
    SET lastbid = @lastbid + bidvalue
    WHERE id = @auctionid
        AND lastbid = @lastbid
    UPDATE users
    SET bids = @bids - 1
    WHERE bids = @bids
    END

并将其连接到Button

protected void Button1_Click(object sender, EventArgs e)
{

        using (var con = new SqlConnection(@"data source=JOVAN-PC;database=aukcija_jovan_gajic;integrated security=true"))
        {
            con.Open();
            var userid = 1;
            var auctionid = 2;


            var cmd = new SqlCommand("usp_makebid", con);
            cmd.Parameters.AddWithValue("@userid", userid);
            cmd.Parameters.AddWithValue("@auctionid", auctionid);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.ExecuteNonQuery();
            con.Close();
    }
}

但是当我点击按钮时,什么也没有发生。

主页看起来是这样的,也许这可以给你一个大概的想法:

【问题讨论】:

  • 尝试调试你的应用程序;使用 try/catch 来识别错误...
  • 如何在不传递用户 ID 和拍卖 ID 值的情况下更新您的数据库?

标签: c# asp.net visual-studio sql-server-2008 stored-procedures


【解决方案1】:

传递用户 ID 和拍卖 ID 的值,然后更新您的表格。

示例:

int userid = 456789;
int auctionid = 12345;

cmd.Parameters.AddWithValue("@userid", SqlDbType.Int).Value = userid;
cmd.Parameters.AddWithValue("@auctionid", SqlDbType.Int).Value = auctionid;

【讨论】:

【解决方案2】:

第一个问题是您将 SqlDbType.Int 枚举作为 @userid@auctionid 参数的值传递,这不是您想要做的,而是应该提供一个值。

第二个问题在您的存储过程中。

SELECT bids 
FROM users 
WHERE users.id = @userid

完全没有效果,IF @bids > 0 条件将始终为假。

猜你想得到接受users.id = @userid条件的用户数,那么你应该用

替换上面的选择
SELECT @bids = COUNT(*) 
FROM users 
WHERE users.id = @userid

您应该最终得到以下存储过程:

ALTER PROCEDURE [dbo].[usp_makebid]
(
  @userid INT ,
  @auctionid INT
)
AS 
    DECLARE @bids INT, @lastbid INT

    SELECT @bids = COUNT(*)
    FROM users
    WHERE users.id = @userid

    IF @bids > 0 
    BEGIN
        UPDATE auctions
        SET lastbid = @lastbid + bidvalue
        WHERE id = @auctionid
          AND lastbid = @lastbid

        UPDATE users
        SET bids = @bids - 1
        WHERE bids = @bids
    END

还要注意cmd.Connection = con; 行是多余的,因为Connection 已经通过SqlCommand 构造函数初始化。

试试这个方法:

protected void Button1_Click(object sender, EventArgs e)
{
    using (var con = new SqlConnection(@"data source=JOVAN-PC;database=aukcija_jovan_gajic;integrated security=true"))
    {
        con.Open();
        var userid = 1;
        var auctionid = 2;

        var cmd = new SqlCommand("usp_makebid", con);
        cmd.Parameters.AddWithValue("@userid", userid);
        cmd.Parameters.AddWithValue("@auctionid", auctionid);
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.ExecuteNonQuery();
        con.Close();
    }
}

【讨论】:

  • 我做了所有这些,但仍然没有任何反应。我更新了我的问题,也许我在Home.aspx.cs 代码中遗漏了一些东西。我猜我应该放一些代码来更新我在ListBox 中选择的字符串,但我不确定。
  • @JovanGajic 我在您更新的答案中看到以下行cmd.Parameters.AddWithValue("@userid", SqlDbType.Int); cmd.Parameters.AddWithValue("@auctionid", SqlDbType.Int);。您在测试我的答案时是否尝试删除它们?
  • 错误,我这样做了,只是忘了更新它,我更新了其他东西。我试过你的答案,但仍然没有结果。
猜你喜欢
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 2014-01-28
相关资源
最近更新 更多