0

所以我正在制作一个投票程序,但我现在被卡住了。我已经寻找解决方案,并且我已经精确地遵循了它们,但仍然没有结果。

基本上,我想从 Visual Basic 访问中计算每个特定记录的总出现次数。

例如,我有 1 号候选人由 3 人投票,而候选人 2 由 7 人投票,我想在文本框中显示此投票结果,但不知何故,它总是显示错误的数字

所以这是我的代码:

Dim TotalVotes As Integer
myCommand = New OleDbCommand("SELECT CandidateNumber, COUNT (*) FROM Student_Voting GROUP BY CandidateNumber", dbconn)
TotalVotes = myCommand.ExecuteScalar
NovTextBox.Text = TotalVotes

myCommand.Dispose()
myReader.Close()

这里的查询给出了第一个候选人编号的结果,而不是所选候选人编号的总票数:

SELECT CandidateNumber, COUNT (*) FROM Student_Voting GROUP BY CandidateNumber

我也试过这个,但结果仍然错误:

SELECT COUNT(CandidateNumber) AS NoVotes FROM Student_Voting GROUP BY CandidateNumber

我不知道这里有什么问题,它应该很简单,但是。

如果有人可以提供帮助,我将不胜感激。

提前致谢

4

1 回答 1

1

首先,如果您有多个候选人,您正在运行的初始查询将返回多个记录。ExecuteScaler 仅返回第一行的第一列。

问题是,你想要所有的记录还是只想要一个人的记录?如果你只想要一个人的记录,你需要在你的 sql 语句中添加一个 WHERE 子句来指定那个候选人。

如果你想要所有的记录,它看起来像这样:

    Using myCommand = New OleDbCommand("SELECT CandidateNumber, COUNT (*) AS CountValue FROM Student_Voting GROUP BY CandidateNumber", dbconn)
        Using dr = myCommand.ExecuteReader
            ' Loops over all the canidate counts one by one.
            While dr.Read
                Dim totalVotes As Integer = CInt(dr("CountValue"))
                Dim candidateNumber As String = dr("CandidateNumber")
            End While
        End Using
    End Using

如果你只想要一条记录,那么你可以使用 ExecuteScaler 像这样:

    Using myCommand = New OleDbCommand("SELECT COUNT (*) AS CountValue FROM Student_Voting WHERE CandidateNumber = @CandidateNumber GROUP BY CandidateNumber", dbconn)
        myCommand.Parameters.Add("@CandidateNumber", OleDbType.VarChar).Value = "1"
        Dim totalVotes = CInt(myCommand.ExecuteScalar)
    End Using

我不知道您数据库中的实际类型,因此您需要调整 OleDbType 以适应您的表设置,也许还有一些演员表。

于 2018-12-19T16:10:56.733 回答