Beanmeister Ответов: 1

Получить результаты из команды SQL SUM в VB


Я пытаюсь заставить SQL-сервер выполнять суммирование поля, а не мой VB-код. Этот первый сегмент кода отлично подходит для меня. Второй бросает исключение на жирный/подчеркнутый текст. Я не могу понять, что в результате должен искать dbReader.

Спасибо,

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

' Sum up the material costs
            cmd = "SELECT WOBOM_AMATCST FROM WOBOM WHERE WOBOM_WOPRE='" + wopre + "' AND WOBOM_WOSUF='" + wosuf + "'"
            dbcmd.CommandText = cmd
            dbcmd.Connection = nconn
            dbReader = dbcmd.ExecuteReader()
            If dbReader.HasRows Then
                While (dbReader.Read)
                    MatlCost = MatlCost + dbReader("WOBOM_AMATCST")
                End While
            End If




cmd = "SELECT SUM(WOBOM_AMATCST) FROM WOBOM WHERE WOBOM_WOPRE='" + wopre + "' AND WOBOM_WOSUF='" + wosuf + "'"
            dbcmd.CommandText = cmd
            dbcmd.Connection = nconn
            dbReader = dbcmd.ExecuteReader()
            If dbReader.HasRows Then
                While (dbReader.Read)
                    MatlCost = MatlCost + dbReader("WOBOM_AMATCST")
                End While
            End If

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

dbcmd.CommandText = "SELECT SUM(WOBOM_AMATCST) FROM WOBOM WHERE WOBOM_WOPRE = @wopre AND WOBOM_WOSUF = @wosuf"
dbcmd.Parameters.AddWithValue("@wopre", wopre)
dbcmd.Parameters.AddWithValue("@wosuf", wosuf)

1 Ответов

Рейтинг:
4

Richard Deeming

Используйте параметры для удаления SQL-инъекция[^] уязвимость из вашего кода.

Вы также не можете ссылаться на поле по имени, если запрос не указывает имя для этого поля.

dbcmd.CommandText = "SELECT SUM(WOBOM_AMATCST) FROM WOBOM WHERE WOBOM_WOPRE = @wopre AND WOBOM_WOSUF = @wosuf"
dbcmd.Parameters.AddWithValue("@wopre", wopre)
dbcmd.Parameters.AddWithValue("@wosuf", wosuf)

dbcmd.Connection = nconn
dbReader = dbcmd.ExecuteReader()
While (dbReader.Read)
    MatlCost = MatlCost + dbReader(0)
End While

NB: Не храните объекты connection, command и data reader в полях уровня класса. Вместо этого создайте их, когда это необходимо, и оберните их в Using блоки, чтобы убедиться, что они правильно утилизированы, когда вы закончите с ними.
Использование Инструкции - Visual Basic | Microsoft Docs[^]


Beanmeister

Прежде всего, спасибо за помощь и образование. Однако, когда я выполняю этот VB-код, параметры, похоже, не вставляются. Я получаю ошибку при выполнении команды ExecutedReader, говоря, что команда SQL не распознает @wopre, а не мою фактическую переменную.

Richard Deeming

Используете ли вы OleDbCommand а не SqlCommand?

Для OLEDB вам может понадобиться использовать ? вместо имен параметров в тексте команды:

dbcmd.CommandText = "SELECT SUM(WOBOM_AMATCST) FROM WOBOM WHERE WOBOM_WOPRE = ? AND WOBOM_WOSUF = ?"
dbcmd.Parameters.AddWithValue("@wopre", wopre)
dbcmd.Parameters.AddWithValue("@wosuf", wosuf)

Beanmeister

На самом деле я использую всепроникающий SQL. Это? отлично работает. Еще раз спасибо за образование.

Beanmeister

Поэтому я столкнулся с дополнительной проблемой, вероятно, из-за отсутствия у меня знаний о параметризованном запросе. Приведенная выше логика находится внутри цикла, и wopre и wosuf изменяют каждый цикл. Однако результаты показывают, что значения в commandtext не изменяются.

Мысли?

Richard Deeming

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

dbcmd.CommandText = "SELECT SUM(WOBOM_AMATCST) FROM WOBOM WHERE WOBOM_WOPRE = ? AND WOBOM_WOSUF = ?"
dbcmd.Parameters.Clear()
dbcmd.Parameters.AddWithValue("@wopre", wopre)
dbcmd.Parameters.AddWithValue("@wosuf", wosuf)