因此,我正在制定投票程序,但我现在陷入困境。 我一直在寻找解决方案,但我一直在精确地跟踪它们,但仍然没有结果。
基本上,我想通过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
我不知道这里出了什么问题,它应该很简单,但是。
如果有人能帮助我,我将非常感谢。
预先感谢
答案 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以适合表设置以及某些类型转换。