У меня есть элемент управления, который при обратной передаче сохраняет результаты формы обратно в базу данных. Он заполняет значения для сохранения путем итерации по строке запроса. Итак, для следующего оператора SQL (значительно упрощенного для обсуждения) ...
UPDATE MyTable
SET MyVal1 = @val1,
MyVal2 = @val2
WHERE @id = @id
... циклически перебирает ключи строки запроса:
For Each Key As String In Request.QueryString.Keys
Command.Parameters.AddWithValue("@" & Key, Request.QueryString(Key))
Next
ОДНАКО, сейчас я сталкиваюсь с ситуацией, когда при определенных обстоятельствах некоторые из этих переменных могут отсутствовать в строке запроса. Если я не передаю val2 в строке запроса, я получаю сообщение об ошибке: System.Data.SqlClient.SqlException: Must declare the scalar value "@val2"
.
Пытается обнаружить пропущенное значение в операторе SQL ...
IF @val2 IS NOT NULL
UPDATE MyTable
SET MyVal1 = @val1,
MyVal2 = @val2
WHERE @id = @id
... не удалось.
Какой лучший способ атаковать это? Должен ли я анализировать блок SQL с помощью RegEx, сканируя имена переменных, которых нет в строке запроса? Или есть более элегантный способ подойти?
ОБНОВЛЕНИЕ: Обнаружение нулевых значений в коде VB отрицает цель отделения кода от его контекста. Я бы предпочел не засорять мою функцию условиями для каждой мыслимой переменной, которая может быть передана или не передана.