OriginalGriff
Здесь так много плохого ...
1) не разделяйте соединение, создавайте их заново каждый раз, когда вы хотите их использовать, и поместите конструкцию в Using
блок таким образом автоматически закрывается и утилизируется в конце. То же самое относится и к командным объектам
2) Никогда не делайте этого! Никогда не объединяйте строки для построения команды 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.
Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?
И делать это по логину? Это действительно глупо...
3) хранение паролей в виде обычного текста? Ах милый... Когда-нибудь посмотрите правила GDPR. Никогда не храните пароли в открытом виде - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать:
Хранение паролей: как это сделать.[
^] - код написан на C#, но он довольно понятен.
4) Почему вы выполняете одну и ту же команду дважды? Один раз, чтобы получить данные, и один раз, чтобы получить счет?
5) Сделайте себе одолжение и прекратите использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам нужно будет изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo", - и ваш код станет легче читать, более самодокументируемым, легче поддерживать - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...
6) подумайте о своих пользователях: вы хотите, чтобы перед вами была страница, полная элементов управления?у вас есть по крайней мере 15 текстовых полей там!
[no name]
И как вы можете отредактировать этот сложный запрос? Этот запрос является функцией, но я не знаю, как я могу сделать лучше в sql.
например: как я могу отредактировать этот запрос, чтобы иметь возможность делать то, что мне нужно.:
res4 = cnn.Execute("SELECT VKmenStavVC.RegCis From TabVyrCS LEFT OUTER JOIN TabKmenZbozi VKmenStavVC ON VKmenStavVC.ID=(выберите Табставскладу.Идкмензбози из Табставскладу, где Табставскладу.ID=TabVyrCS.IDStavSkladu) левое внешнее соединение TabVyrCS_EXT с(NOLOCK) на TabVyrCS_EXT.ID=TabVyrCS.Идентификатор где TabVyrCS.Nazev1 = '" &амп; текстовое поле textbox1.Текст &ампер; "'")
Команда Dim As String = "SELECT * FROM TabVyrCS WHERE WHERE CONVERT (VARCHAR, TabVyrCS.Nazev1) = @TabVyrCS.Nazev1"
Dim CMD As New SqlCommand(команда, соединение)
'NÁZEV SLOUCE V TABULCE
CMD.параметры.AddWithValue("@TabVyrCS.Nazev1", TextBox1.Text)
Dim DA как новый SqlDataAdapter(CMD)
Дим таблицу в качестве нового объекта DataTable
Да.Заполнить(табл.)
Если таблица.строки.Тогда считайте > 0
'SLOUPEC Z TABULKY 3
TextBox2.Text = TABLE.Rows(0)(3).Метод toString()
Этикетка 1.Текст = "ZÁZNAM ÚSPĚŠNĚ VYHLEDÁN"
Этикетка 1.BackColor = Цвет.Светло-голубой
Еще
MsgBox("ZÁZNAM NENALEZEN")
Конец, Если