Member 10964782 Ответов: 1

Войдите в форму in VB.NET


привет.
у меня есть этот код, его работа (вид).
я получаю ошибку с этой строкой:
Form2.Label2.Text = reader(2).ToString

ошибка :
Invalid attempt to read when no data is present

почему он говорит "нет данных"? у меня есть все данные в базе данных?

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


What I have tried:

<pre lang="vb">
 <pre>  
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

1 Ответов

Рейтинг:
0

OriginalGriff

Что ж, да - вы это сделаете.
Позвольте мне вырвать немного кода, чтобы его было легче увидеть:

        While reader.Read
            count = count + 1
        End While
        If count = 1 Then
...
            Form2.Label2.Text = reader(2).ToString
Вы перебираете все строки, чтобы сосчитать их. Так что после петли, reader гарантированно не будет смотреть на ряд - потому что если бы он был тогда reader.Read не вернул бы фальшивку!
Так reader он не находится в строке, и если вы попытаетесь получить доступ к данным строки, там не на что смотреть! И в результате вы получаете ошибку.

Но это чрезвычайно опасный код, особенно в форме входа в систему! Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

А это значит, что вам нужно в приоритетном порядке просмотреть все свое приложение и исправить его: оставьте только одно, и ваша база данных окажется под угрозой!

Другая проблема заключается в том, как вы обрабатываете пароли, что одновременно опасно и (поскольку GDPR) может означать, что вы несете ответственность за судебное преследование за небрежное обращение с пользовательскими данными, если гражданин ЕС попытается использовать вашу систему ...
Никогда не храните пароли в открытом виде - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^] - код написан на C#, но он довольно прост, и есть онлайн-конвертеры, если вы не можете справиться: Преобразователь кода C# в VB и VB в C# – Telerik[^]