Member 13299675 Ответов: 2

Мой код не работает


привет. я написал этот код для извлечения данных из таблицы, где имя похоже на значение gridview, но цикл выполняется только один раз, пока не будет найдена вся запись.
<pre> Dim cmd As New OleDbCommand
        Dim dr As OleDbDataReader
        Dim i As Integer
        cmd.Connection = cn
        For i = 0 To grd.RowCount - 1
            cmd.CommandText = "SELECT status FROM exam_attendance WHERE rollno = " & Val(grd.Item(0, i).Value) & " AND subject = '" & cmbsubject.Text & "' AND ta_date = #" & CType(mskexamdate.Text, Date).ToString("MM/dd/yyyy") & "# AND class = '" & cmbclass.Text & "' AND medium = '" & cmbmedium.Text & "'"
            dr = cmd.ExecuteReader
        If dr.HasRows Then
            While dr.Read
                If dr.Item("status") = "PRESENT" Then
                    grd.Item(4, i).Value = True
                Else
                    grd.Item(4, i).Value = False
                End If
            End While
            End If
        Next



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

я изменил код, но он не работает

2 Ответов

Рейтинг:
2

Maciej Los

В дополнение к решению №2 by ppolymorphe[^]...

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


Ты на неверном пути! Представьте, что вашим приложением пользуются 1000 пользователей. Все они запускают приложение одновременно. Что случилось с вашей базой данных? База данных находится под DDoS-атака[^]!

Вы должны сразу же создать правильный оператор sql, который вернет правильный набор данных. Например:
SELECT t1.*, CBool(t2.[status]="PRESENT") As IsPresent
FROM Table1 As t1 INNER JOIN Table2 as t2 ON t1.PrimaryKey = t2.ForeignKey

Затем вы должны связать эти данные с DataGridView.

Приведенная выше инструкция запроса полностью легальна для MS Access database engine.

Для получения более подробной информации, пожалуйста, смотрите: Визуальное представление SQL-соединений[^]


Рейтинг:
1

Patrice T

cmd.CommandText = "SELECT status FROM exam_attendance WHERE rollno = " & Val(grd.Item(0, i).Value) & " AND subject = '" & cmbsubject.Text & "' AND ta_date = #" & CType(mskexamdate.Text, Date).ToString("MM/dd/yyyy") & "# AND class = '" & cmbclass.Text & "' AND medium = '" & cmbmedium.Text & "'"


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


Maciej Los

Хороший совет!

Patrice T

Спасибо