计算vb.net中访问的特定记录

时间:2018-12-19 15:52:50

标签: vb.net visual-studio ms-access visual-programming

因此,我正在制定投票程序,但我现在陷入困境。 我一直在寻找解决方案,但我一直在精确地跟踪它们,但仍然没有结果。

基本上,我想通过Visual Basic访问来统计每个特定记录的总出现次数。

例如,我的候选人编号1由三人投票,候选人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

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

如果有人能帮助我,我将非常感谢。

预先感谢

1 个答案:

答案 0 :(得分: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以适合表设置以及某些类型转换。