如何在 SQL C# 中增加一个整数

3

我正在制作一个投票系统。我遇到了一个问题,无法给每个被投票的候选人添加计数(每次候选人被投票时都会增加)。

我的投票按钮代码是:

    sc.Open();
        try
        {
            cmd = new SqlCommand("UPDATE TableVote SET Vcount=Vcount+1 WHERE id=@count", sc);

            cmd.Parameters.AddWithValue("@count", TxtPresID.Text);

            int res = cmd.ExecuteNonQuery();
            if (res > 0)
            {
                MessageBox.Show(TxtPresID.Text.ToString() + " Saved!");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            sc.Close();
        }

我的表格如下:

my sql

Vcount 的结果是 NULL。我做错了什么?还是我的 SQL 语句不正确?

null


尝试使用 Vcount=ISNULL(Vcount,0)+1 - D Stanley
2
不允许将Null值传递给Vcount函数。 - Alexandre Rondeau
2
不允许出现“NULL”。没有任何反对票的东西会有一个投票数为0,而不是“null”! - Arran
你所说的“result”是指表格中的内容,还是你试图将新的投票计数返回给用户? - D Stanley
7个回答

4

看起来你的 VcountNULL。正如其他人所指出的,你应该将该列默认值设置为 0,或者可以执行以下操作:

UPDATE TableVote SET Vcount=ISNULL(Vcount, 0) + 1 WHERE id=@count

3

Vcount的默认值设置为0。它不应该是一个空列。

以下是查询语句

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}

ALTER TABLE TableVote 
ADD Vcount int NOT NULL 
CONSTRAINT  tablevote_vcount_default DEFAULT 0

另一种选择是检查Vcount是否为NULL。
UPDATE TableVote SET Vcount=ISNULL(Vcount, 0) + 1 WHERE id=@count

每个表中的列名必须是唯一的。在表“TableVote”中指定了列名“Vcount”超过一次。 - Lyndon Broz Tonelete

3

每次更新计数行可能会导致不可预测的后果,特别是在同时收到两个投票时。

更好的方法是创建一张"votes"表,然后为每个投票插入一行,包括候选人ID、投票者ID和投票日期。这还意味着您可以获得不同投票者的历史数据,并且可以轻松更改投票结果。


这是一个非常好的观点,所以我会点个赞,但它并没有回答问题。 - crthompson
它并没有回答问题,但我认为这是一个非常有效的观点。发现得好。+1 - unlimit

2

Learn that

Null + 1 = Null

如果添加1时您的Vcount为null,那么它将始终为null。
Vcount必须是非空的,并且它的默认值必须为0。因此,当您将1添加到0时,它会给出正确的结果。


1
您也可以更改您的SQL语句,如果VCOUNT列为空,则使用零:
"UPDATE TableVote SET Vcount=ISNULL(Vcount, 0)+1 WHERE id=@count"

如果您无法更改数据库架构为非空并设置默认值,则此功能特别有用。


1

如果我没错的话,为什么不直接使用您的主键呢?

UPDATE TableVote SET Vcount= max(id)  WHERE id=@count

或者

如果一些ID被删除,而您不想保留记录或计算已删除的投票,则

  UPDATE TableVote SET Vcount= COUNT(id)  WHERE id=@count

1

Vcount必须具有默认值0并且不能为空,因为它是Int字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接