Ошибка Необходимо объявить скалярную переменную при использовании зарезервированного слова в SqlParameter

Мы переносим серверную часть базы данных с 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, и другие таблицы (без зарезервированных слов для имен полей) в порядке.

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


person hawbsl    schedule 15.11.2011    source источник
comment
Не могли бы вы опубликовать блок кода, который вы используете для команды и ее привязки параметров? Было бы здорово увидеть ваш код, чтобы мы могли определить, является ли @Key необъявленной переменной / параметром или что с этим заполнителем значения ничего не связано.   -  person Nonym    schedule 15.11.2011


Ответы (2)


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

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

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

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

person Jay    schedule 15.11.2011
comment
вы правы, это работает ... ммм, но я не знаю, почему моя более длинная версия (без использования AddWithValue) не ... видит мою правку. Я буду продолжать попытки понять это - person hawbsl; 15.11.2011
comment
у вас нет символа @ в имени параметра, также вы не добавляли его в параметры команд. - person Jay; 15.11.2011
comment
опять же, вы правы: упрощая, чтобы скопировать в stackoverflow, я пропустил добавление его в параметры команды. это не проблема оригинала. все еще смотрю на это. - person hawbsl; 15.11.2011
comment
Находится ли @ в той части вашего обычного кода, куда вы его добавляете? заменив это: p = New SqlParameter (Key, SqlDbType.VarChar) на p = New SqlParameter (@Key, SqlDbType.VarChar) - person Jay; 15.11.2011

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

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

... SET [Key]=?

что было нормально.

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

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

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

... SET Key=@Key

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

... SET [Key]=@Key

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

person hawbsl    schedule 15.11.2011