Member 13187018 Ответов: 3

Как исправить этот код, чтобы вывести все элементы из базы данных ?


Dim btnsender As Button = sender
           Dim lbl As String = btnsender.Name
            Try
                da = New SqlDataAdapter("Select Item_id, Item_menu_description From tbl_item where Item_Cat = " & lbl & "", cn)
                da.Fill(dt1)

                keycount = -1
                For Each btn As Button In FlowLayoutPanel2.Controls()
                    keycount += 1
                    btn.Text = dt1.Rows(keycount)(1).ToString
                   ' btn.Tag = dt1.Rows(keycount)(0).ToString
                Next
            Catch ex As Exception
            Finally
                cn.Close()
                da = Nothing
                dt1.Clear()
            End Try


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

I have 5 buttons named : btn1,btn2,btn3,btn4,btn5 and i trying to bring all of the Item_menu_description to the buttons 
The table in database : Item_id,Item_menu_description,Item_Cat,btnName
    Item_id | Item_menu_description | Item_Cat | btnName
-----------------------------------------------------------
       1          keyboard            computer     btn3
       2          Mouse               computer     btn1
       3          screens             computer     btn4

I want the Item_menu_description to appear on the same names as the buttons in the database, for example the 'keyboard' appears on the button Named 'btn3' and 'Mouse' appears on the button Named 'btn1'


Please help me discover the error in the code

Thank you so much

Richard MacCutchan

"У меня есть 5 кнопок с именами: btn1 , btn2,btn3,btn4,btn5"
Это действительно ленивое Программирование; вы должны дать всем своим элементам управления осмысленные имена, чтобы любой, кто занимается поддержкой вашего кода, мог получить представление о том, для чего они предназначены.

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

Member 13187018

Спасибо тебе, Ричард, за совет, но есть ли у тебя решение этой проблемы ?

Richard MacCutchan

- Какая проблема? Вы не описали, в чем на самом деле заключается проблема. Я также замечаю, что вы ловите исключения, но затем игнорируете их - еще одна плохая практика.

Richard MacCutchan

Может быть, вы попробуете задать правильный вопрос?

3 Ответов

Рейтинг:
6

Member 13187018

Thank god
Problem solved, thanks for everyone who helped me solve the code problem
Thanks to all



<pre>    dt1.Clear()
        Try
            da = New SqlDataAdapter("SELECT Item_id, Item_menu_description, btnName FROM tbl_item WHERE Item_Cat = '" & 1 & "'", cn)
            For Each btn As Button In FlowLayoutPanel2.Controls()
                Dim foundRows() As DataRow
                da.Fill(dt1)
                foundRows = dt1.Select("btnName = '" & btn.Name & "'")
                If foundRows.Length > 0 Then
                    keycount += 1
                    btn.Text = foundRows(0).Item("Item_menu_description").ToString
                End If
            Next
        Catch ex As Exception
        Finally
            cn.Close()
            da = Nothing
            dt1.Clear()
        End Try


Рейтинг:
2

an0ther1

Есть несколько способов исправить это, самый простой-упорядочить ваши результаты

da = New SqlDataAdapter("Select Item_id, Item_menu_description From tbl_item where Item_Cat = '" & lbl & "' order by btnName", cn)

Вы столкнетесь с проблемами, если у вас есть более 9 кнопок и вы используете btn1 для btn10 в качестве их имен - запрос будет сортировать результаты по текстовому значению, следовательно, btn10 будет предшествовать btn2 в результирующем наборе.
В качестве альтернативы можно сделать следующим образом;
' Edit Query to include the btnName field
da = New SqlDataAdapter("SELECT Item_id, Item_menu_description, btnName FROM tbl_item WHERE Item_Cat = '" & lbl & "'")
For Each btn As Button In FlowLayoutPanel2.Controls()
    Dim foundRows() AS DataRow 
    ' Locate the specific row
    foundRows = dt1.Select("btnName = '" & btn.Name & "'")
    If foundRows.Length > 0 Then
        btn.Text = dt1.Rows(keycount)(1).ToString
        ' btn.Tag = dt1.Rows(keycount)(0).ToString
    End If
Next


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

с уважением


Member 13187018

- Благодарю вас, Сэр, я не хотел оскорбить Мистера Ричарда, но в его ответе прозвучали оскорбления и презрение.
В любом случае я приношу свои извинения и удалил свои комментарии
Большое спасибо

an0ther1

Никаких проблем, просто пытаюсь помочь.
Если это ответ на ваш вопрос пожалуйста примите его как решение

с уважением

Member 13187018

Большое спасибо но код работает не очень хорошо
Я думаю, что он нуждается в некоторой модификации
Пожалуйста, если у вас есть время, чтобы изменить его

спасибо еще раз

Рейтинг:
0

Patrice T

da = New SqlDataAdapter("Select Item_id, Item_menu_description From tbl_item where Item_Cat = " & lbl & "", cn)

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь уязвимости под названием "SQL injection", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользователь вводит имя типа "Брайан О'Коннер", это может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL Injection-руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL-OWASP[^]


Member 13187018

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

Большое вам спасибо за совет

Richard Deeming

Хранимые процедуры обеспечивают нулевую защиту от SQL-инъекций, если вы не используете правильно параметризованные запросы!

da = New SqlDataAdapter("Select Item_id, Item_menu_description From tbl_item where Item_Cat = @Item_Cat", cn)
da.SelectCommand.Parameters.AddWithValue("@Item_Cat", lbl)

Member 13187018

Большое вам спасибо, Мистер Ричард Диминг, я постараюсь узнать больше о защите от SQL-инъекций .