Не удалось прочитать, когда нет данных - PullRequest
0 голосов
/ 21 октября 2018

у меня есть этот код ,, его работа (вид).

Dim connString As String = ConfigurationManager.ConnectionStrings("connectionstring").ConnectionString
    Dim conn As New SqlConnection(connString)
    conn.Open()
    Dim comm As New SqlCommand("SELECT username, Password,type   FROM users WHERE username='" & TextBox1.Text & "' AND Password='" & TextBox2.Text & "'", conn)
    Dim reader As SqlDataReader
    reader = comm.ExecuteReader

    Dim count As Integer
    count = 0
    While reader.Read
        count = count + 1
    End While
    If count = 1 Then
        MessageBox.Show("username and password are correct")


        Form2.Show()


        Form2.Label1.Text = Me.TextBox1.Text
        Form2.Label2.Text = reader(2).ToString
    ElseIf count > 1 Then
            MessageBox.Show("username and password are duplicated")
        Else
            MessageBox.Show("username and password are wrong")

    End If

я получаю ошибку с этой строкой:

Form2.Label2.Text = reader(2).ToString
and error is "Invalid attempt to read when no data is present"

почему он говорит "нет данных"

У меня есть все данные в базе данных?

Может кто-нибудь помочь мне исправить этот код?спасибо ..

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вы не должны использовать цикл вообще.Не должно быть способа, чтобы вы могли получить более одной записи, так какой же будет цикл?Вы должны использовать оператор If, и это все:

If reader.Read() Then
    'There was a match and you can get the data from reader here.
Else
    'There was no match.
End If

Если возможно иметь две записи с одним и тем же именем пользователя, значит, что-то не так с вашим дизайном базы данных и вашим приложением.Этот столбец должен быть уникальным, и ваше приложение должно проверять существующую запись, когда кто-то пытается зарегистрироваться.

0 голосов
/ 21 октября 2018

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, прежде чем я попытаюсь получить к нему доступ.Подобные вещи могут предотвратить появление другой ошибки, если вы не вернули никаких результатов.

...