SqlDataReader - это элемент чтения данных только для пересылки.Ошибка возникает потому, что вы дважды вызываете функцию чтения READ;один раз как true, чтобы увеличить до 1, и второй раз, чтобы получить false, чтобы выпасть из оператора while.Поскольку вы больше не входите в оператор WHILE, читатель должен был прочитать конец набора результатов, поэтому у вас нет данных для чтения.
Обратите внимание на измененный код ниже:
Dim connString As String = ConfigurationManager.ConnectionStrings("connectionstring").ConnectionString
Dim count As Integer = 0
Dim userType as string = ""
Using conn As New SqlConnection(connString)
conn.Open()
Using Comm as SqlCommand = conn.CreateCommand
comm.commandText = "SELECT username, Password, type FROM Users WHERE username = @UserName AND Password = @Pwd; "
comm.parameters.AddWithValue("@Username", TextBox1.Text)
comm.parameters.AddWithValue("@Password", Textbox2.text)
Dim reader As SqlDataReader
reader = comm.ExecuteReader
If reader IsNot Nothing Then
If reader.HasRows() Then
While reader.read
count = count + 1
If Not reader.IsDbNull(2) Then userType = reader(2).ToString
End While
End If
If Not reader.IsClosed Then reader.close
reader = Nothing
End If
End Using
End Using
If count = 1 Then
MessageBox.Show("username and password are correct")
Form2.Show()
Form2.Label1.Text = Me.TextBox1.Text
Form2.Label2.Text = userType
ElseIf count > 1 Then
MessageBox.Show("username and password are duplicated")
Else
MessageBox.Show("username and password are wrong")
End If
Прежде всего, SQLParameters - ваш друг.Изучите их.Это самый простой способ борьбы с SQL-инъекцией при использовании классов SqlClient.
Во-вторых, обратите внимание, что я выполняю фактический поиск данных из считывателя внутри цикла WHILE.Это гарантирует, что у меня есть реальные данные для чтения.
В-третьих, обратите внимание на операторы USING для объектов SqlConnection и SqlCommand.Это помогает при сборке мусора, а также имеет несколько других преимуществ.
Наконец, обратите внимание на проверки, которые я выполняю на SqlDataReader, прежде чем я попытаюсь получить к нему доступ.Подобные вещи могут предотвратить появление другой ошибки, если вы не вернули никаких результатов.