Fiínek Cahů Ответов: 1

Как я могу проверить, существует ли значение в базе данных


Привет, как я могу проверить, нашел ли res4 значение. Если я вставляю значение, которое не существует в textbox4, у меня есть проблема на первой строке с неправильным: дополнительная информация: операция не разрешена, если объект открыт. Что же делать не так?
cnn.ConnectionString = "driver={SQL Server};" & "server=xxx.xxx.x.x;uid=xx;pwd=xxxx+;database=xxxxx"


Что я уже пробовал:

Private Sub TextBox4_TextChanged(sender As Object, e As EventArgs) Handles TextBox4.TextChanged

        cnn.ConnectionString = "driver={SQL Server};" & "server=xxx.xxx.x.x;uid=xx;pwd=xxxx+;database=xxxxx"

        Try

            cnn.Open()
        Catch
            MsgBox("Připojení k databázi se nezdařilo.", , "Chyba")
        End Try

        ' Overeni zda pripojeni probehlo OK
        If cnn.State = 1 Then
            'Automatické vyhledání čísla dílu dle kódu operace
            Try
                If TextBox4.Text.Length = 9 Then
                    res4 = cnn.Execute("SELECT VKmenStavVC.RegCis From TabVyrCS LEFT OUTER JOIN TabKmenZbozi VKmenStavVC ON VKmenStavVC.ID=(SELECT TabStavSkladu.IDKmenZbozi FROM TabStavSkladu WHERE TabStavSkladu.ID=TabVyrCS.IDStavSkladu) LEFT OUTER JOIN TabVyrCS_EXT WITH(NOLOCK) ON TabVyrCS_EXT.ID=TabVyrCS.ID WHERE TabVyrCS.Nazev1 = '" & TextBox1.Text & "'")
                    If cnn.ExecuteScalar <> 0 Then
                        Dim registracni4 As String = res4.GetString
                        registracni4 = registracni4.Replace(vbCr, "")
                        If registracni4 = TextBox11.Text Then
                            TextBox15.Text = "OK"
                            TextBox10.Text = registracni4
                        Else
                            TextBox15.Text = "NOK"
                            MsgBox("Nesouhlasí číslo dílu s výrobní operací!", , "Chyba")
                        End If

                    Else
                        MsgBox("Hodnota nenalezena", , "Chyba")
                    End If
                End If
            Catch
                cnn.Close()
                MsgBox("Napojení do tabulky se nezdařilo", , "Chyba")
                TextBox4.Clear()
                Return
            End Try
        Else
            cnn.Close()
        End If
    End Sub

1 Ответов

Рейтинг:
1

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")
Конец, Если

OriginalGriff

Вы читали что-нибудь из того, что я сказал?

[no name]

Да, конечно :)