Ошибка «Необходимо объявить скалярную переменную» при использовании зарезервированного слова в SqlParameter - PullRequest
0 голосов
/ 15 ноября 2011

Мы переносим серверную часть базы данных из Access в SQL Server.

Одно из имен полей - Key. Теперь Key является зарезервированным словом в Access и SQL Server , поэтому обходной путь в Access всегда заключался в том, чтобы заключить квадратные скобки вокруг имени поля.

При подключении к Access мы генерировали коллекцию OleDBParameter для каждого OleDBCommand. Проверка команды CommandText во время выполнения выдает что-то вроде UPDATE Foo SET [Key]=? WHERE etc, потому что помните, что OleDB / Access не имеет именованных параметров, только ?. Это было все в порядке.

Перенесемся в наше время и, используя SQL Server, мы делаем то же самое с SqlCommand и SQLParameter. Итак, во время выполнения CommandText читает что-то вроде UPDATE Foo SET [Key]=@Key WHERE etc, потому что SQL не нравится старый знак вопроса, и мы должны начать использовать именованные параметры.

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

Incorrect syntax near 'varchar'. Must declare the scalar variable "@Key"

Это касается только таблицы с именем поля Key. Все остальное пережило миграцию на SQL, и с другими таблицами (без зарезервированных слов для имен полей) все в порядке.

Я понимаю, что одно из решений состоит в том, чтобы избежать использования зарезервированного слова в качестве имени поля, но я надеюсь на ответ, который позволит нам обойти зарезервированное слово, как мы всегда привыкли.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Не думаю, что ошибка связана с ключевым словом. Он хочет, чтобы вы сказали ему, каково значение @Key.

Итак, у вас есть команда, а затем вы определяете параметр:

Dim cmd As New Sqlcommand("Update Foo SET [Key]=@Key", connection)
cmd.Parameters.AddWithValue("@Key", SomeValue)
cmd.ExecuteNonQuery()

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

0 голосов
/ 15 ноября 2011

Сортировка. У нас был какой-то код, который автоматически генерировал CommandText из списка параметров. Если параметр является зарезервированным словом, то CommandText должен иметь квадратные скобки вокруг имени поля, но сам параметр не может иметь никаких скобок.

Конечно, в старые добрые времена Access и OleDB это было просто:

... SET [Key]=?

что было хорошо.

Наш обновленный код SQLClient генерировал либо:

... SET [Key]=@[Key]

или иначе (если мы сняли скобки):

... SET Key=@Key

ничего из этого не сработает, поскольку нам нужно (спасибо @D ..):

... SET [Key]=@Key

Похоже, наш код автоматического генератора CommandText нуждается в некоторой доработке. Либо это, либо мы очищаем все зарезервированные слова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...