none
Параметры в конструкции WHERE, ADO.net RRS feed

  • Вопрос

  • Добрый вечер. Уже какие сутки напролет переделываю код проекта под параметрические запросы. Все отлично, но есть некоторые вопросы. Можно ли указать название таблицы в качестве параметра? Почему-то не заменяется `@P0` на название таблицы. Параметры в качестве знака вопроса не воспринимаются, поэтому я использую @P* с порядковым номером. 

     Dim Cmd As New OleDb.OleDbCommand("UPDATE `" & TableName & "` SET " & tmpQueryData & " WHERE " & tmpQueryData2, Cnn)
            For i = 0 To Parameters.Length - 1
                Cmd.Parameters.AddWithValue("@P" & i, Parameters(i))
            Next
    Cmd.ExecuteNonQuery()
    Второй вопрос. Почему после конструкции WHERE если указать любой параметр, например, `Код`=@P1, а в параметры передать число, то будет ругаться исключениями на малое количество параметров в запросе?
    17 февраля 2021 г. 20:45

Ответы

  • >В общем не работает. 

    Единственное, что на приведенном скриншоте кажется странным - это DbType: Byte, учитывая что вы пытаетесь передать значение 2434, которое выходит за допустимый диапазон для типа byte.

    • Помечено в качестве ответа Siompc 18 февраля 2021 г. 11:35
    18 февраля 2021 г. 11:11

Все ответы

  • >Можно ли указать название таблицы в качестве параметра?

    Нет. Параметры для данных, не для идентификаторов.

    >Почему после конструкции WHERE если указать любой параметр, например, `Код`=@P1, а в параметры передать число, то будет ругаться исключениями на малое количество параметров в запросе?

    Если ругается на малое количество параметров, значит у вас мало параметров, либо с синтаксисом запроса что-то не так, благодаря чему параметр не воспринимается как параметр. В приведенном коде я вижу как минимум одну ошибку - Cmd.Parameters.AddWithValue("@P" & i, Parameters(i)) - имя параметра здесь должно передаваться без начального символа @.

    18 февраля 2021 г. 3:26
  • Так. То есть в тексте запроса писать символ, а при добавлении нет. Так?

    Текст запроса - "UPDATE `Таблица` SET `Значение`=@P0 WHERE `Код`=@P1"

    А в параметры добавлять так - Cmd.Parameters.AddWithValue("P" & i, Parameters(i))

    Проверю отпишусь.

    18 февраля 2021 г. 10:08
  • В общем не работает. Строка запроса - "UPDATE `Данные` SET `Процент заполнения`=@P0 WHERE `Код`=@P1"

    Два параметра есть 85 и 2434

    Ошибка - необходимо 2 параметра. Стоит только вручную прописать `Код`=2434 и все работает. Что не так?

    18 февраля 2021 г. 10:25
  • Я ошибся, работает и с начальным @ в AddWithValue, и без него. И, кстати, неименованные параметры ("?") также вполне работают. У вас проблема в чем-то другом. Проверьте, работает ли аналогичный запрос с константой вместо параметра. Подозреваю тут банальную ошибку, типа случайной замены латинской буквы на одинаковую по виду русскую, или что-то в этом роде. 
    18 февраля 2021 г. 10:46
  • >В общем не работает. 

    Единственное, что на приведенном скриншоте кажется странным - это DbType: Byte, учитывая что вы пытаетесь передать значение 2434, которое выходит за допустимый диапазон для типа byte.

    • Помечено в качестве ответа Siompc 18 февраля 2021 г. 11:35
    18 февраля 2021 г. 11:11
  • Все, кажется получилось :) Да, проблема в типе была, только вот во втором типе int64 (Long). Я думал поле `Код` типа длинное целое это как раз оно. А в итоге в такие поля сохраняются только тип Integer
    18 февраля 2021 г. 11:34
  • Я бы хотел отблагодарить за постоянную помощь. Не нашел ваших данных. Напишите мне на почту пожалуйста

    Плюсов / принятых ответов / словесного спасибо достаточно. Нет необходимости связываться по посторонним каналам ради дополнительной благодарности. 
    18 февраля 2021 г. 11:47
  • Хорошо. Спасибо большое
    18 февраля 2021 г. 12:07