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[
^]