Sql OleDbDataReader表示正在读取的表中没有数据(VB.NET)

Sql OleDbDataReader表示正在读取的表中没有数据(VB.NET),sql,database,vb.net,oledb,ms-access-2010,Sql,Database,Vb.net,Oledb,Ms Access 2010,我的OleDb access数据库连接正确地计算了数据库中一个表中的行(条目)数,但是当使用for循环读取其中一个字段的每个实例时,我得到一个错误,即当使用databaseReader获取表中第一个条目的用户名(教师id/学生id)时,databaseReader(1)实例中没有数据 错误: System.Data.dll中发生“System.InvalidOperationException”类型的未处理异常 其他信息:行/列不存在数据。 (顺便说一句,我知道还没有密码验证) 导入系统数据 导

我的OleDb access数据库连接正确地计算了数据库中一个表中的行(条目)数,但是当使用for循环读取其中一个字段的每个实例时,我得到一个错误,即当使用databaseReader获取表中第一个条目的用户名(教师id/学生id)时,databaseReader(1)实例中没有数据

错误:
System.Data.dll中发生“System.InvalidOperationException”类型的未处理异常 其他信息:行/列不存在数据。

(顺便说一句,我知道还没有密码验证)

导入系统数据
导入System.Data.OleDb
公共类登录表单
Const databaseLocation As String=“C:\Users\Patrick\Documents”
Private Sub OK_Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理OK按钮。单击
Dim enteredUsername As String=UsernameTextBox.Text
Dim enteredPassword作为String=PasswordTextBox.Text
登录(enteredUsername、enteredPassword)
端接头
Private Sub Cancel_Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理Cancel按钮。单击
我
端接头
子登录(ByRef用户名作为字符串,ByRef密码作为字符串)
Dim IsUserName验证为布尔值
'这是管理员的用户名和密码,不应显示给任何其他用户
如果username=“adminentry”和password=“iamanadmin”,则
MenuForm.Show()
我
如果结束
isUsernameVerified=验证用户名和密码(用户名、密码)
如果isUsernameVerified=True,则
MenuForm.Show()
我
其他的
LoginComboBox.Text=“未找到用户名或密码”
如果结束
端接头
函数VerifyUserName和Password(ByRef UserName验证为字符串,ByRef passwordForVerification验证为字符串)
'此字符串告诉连接数据库所在的位置以及要使用的提供程序
Const connectionString作为字符串=(“Provider=Microsoft.ACE.OLEDB.12.0;数据源=”&databaseLocation&“\ProjectDatabase.accdb”)
将sqlQuery设置为字符串
验证为布尔值
'需要数据库连接才能验证用户名和密码输入
使用ConnectionDatabase作为新的OLEDB连接(connectionString)
Dim numberOfEntries为整数
'打开数据库连接
connectionDatabase.Open()
如果LoginComboBox.SelectedItem=“员工登录”,则
'计算员工ID数量的sql代码'
sqlQuery=“从教师表中选择COUNT(*)作为sqlQuery”
其他的
'用于计算学生ID数量的sql代码'
sqlQuery=“从学生表中选择COUNT(*)作为sqlQuery”
如果结束
Dim getNumberOfEntriesCommand作为新的OleDbCommand(sqlQuery,ConnectionDatabase)
'执行sql代码计数
numberOfEntries=getNumberOfEntriesCommand.ExecuteScalar
如果LoginComboBox.SelectedItem=“员工登录”,则
'获取员工ID的sql代码'
sqlQuery=“从教师表中选择教师id”
其他的
'获取学生ID的sql代码'
sqlQuery=“从学生表中选择学生id”
如果结束
Dim loginVerificationCommand作为新的OleDbCommand(sqlQuery、ConnectionDatabase)
'执行验证sql代码
Dim databaseReader作为OleDbDataReader=loginVerificationCommand.ExecuteReader()
对于i=1到numberOfEntries
如果databaseReader(i)=用于验证的用户名,则
已验证=正确
如果结束
下一个
终端使用
如果验证=真,则
返回真值
其他的
返回错误
如果结束
端函数
末级

对于数据读取器来说,这是错误的型号。数据读取器公开当前行,并允许您在这些行中移动
databaseReader(i)
将引用当前行中的字段i,而不是代码认为的行i

使用数据读取器的标准方法是

Do While databaseReader.Read
'对当前行执行某些操作
如果databaseReader(0)=用于验证的用户名,则
已验证=正确
出口回路
如果结束
环
数据库阅读器,关闭
(我没有使用VB.Net,如果我的语法有误,我深表歉意)

您最好构建包含要搜索的值的查询。例如:

从teacher\u表中选择teacher\u id=?

您需要了解参数绑定以利用此功能。

非常有用,dw,您的语法几乎正确。:)非常感谢!