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();
        }

我的桌子是

我的 sql

结果Vcount只是NULL..

无效的

我究竟做错了什么?还是我的 Sql 语句正确?

4

7 回答 7

4

看起来你VcountNULL。正如其他人指出的那样,您应该将该列设为默认值,0或者您可以这样做

UPDATE TableVote SET Vcount=ISNULL(Vcount, 0) + 1 WHERE id=@count
于 2013-10-28T16:01:41.133 回答
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
于 2013-10-28T16:01:03.293 回答
3

您不应该每次都更新计数行。如果您同时收到 2 张选票,则可能会产生不可预知的后果。

更好的方法是创建一个“votes”表,然后为每张选票插入一行,包括候选人 ID、选民 ID 和投票日期。也意味着您可以拥有不同选民的历史数据,并且您可以在需要时轻松更改投票。

于 2013-10-28T16:04:10.820 回答
2

了解一下

Null + 1 = Null

所以你的 Vcount 加 1 时总是为空
。Vcount 不能为空,并且它的默认值必须是 0。然后当你将 1 加到 0 时,它会给你很好的结果。

于 2013-10-28T15:59:52.170 回答
1

您还可以更改您的 SQL 语句,以便在 VCOUNT-Column 为空时使用零:

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

如果您无法将数据库架构更改为 Not-Null 并具有默认值,这将特别有用。

于 2013-10-28T16:02:44.213 回答
1

Vcount 必须有一个默认的 0 值,并且 Not Null,因为是一个 Int 字段。

于 2013-10-28T16:03:48.613 回答
1

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

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

或者

如果某些 id 被删除并且您不想保留记录或计算已删除的选票,那么

  UPDATE TableVote SET Vcount= COUNT(id)  WHERE id=@count
于 2013-10-28T16:24:31.967 回答