在SqlParameter中使用保留字时出错“必须声明标量变量”

时间:2011-11-15 16:39:16

标签: .net sql-server ado.net reserved-words

我们正在将数据库后端从Access迁移到SQL Server。

其中一个字段名称为Key。现在Keya reserved word in both Access and SQL Server因此,Access中的解决方法始终是在字段名称周围添加方括号。

连接到Access时,我们为每个OleDBParameter生成了OleDBCommand个集合。在运行时检查命令的CommandText它会读取类似UPDATE Foo SET [Key]=? WHERE etc的内容,因为记住OleDB / Access没有命名参数,只有?。这一切都很好。

快进到今天并使用SQL Server,我们对SqlCommandSQLParameter做了类似的事情。因此,在运行时,CommandText读取类似UPDATE Foo SET [Key]=@Key WHERE etc的内容,因为SQL不喜欢旧的问号,我们必须开始使用命名参数。

麻烦是这个命令的应用程序阻塞,说:

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

只有字段名称为Key的表才会受到影响。其他所有东西都在迁移到SQL后幸存下来,其他表(没有字段名的保留字)也没问题。

我理解其中一个解决方案是避免使用保留字作为字段名称,但我希望得到一个答案,让我们可以像以前一样使用保留字。

2 个答案:

答案 0 :(得分:2)

我不认为错误与Key是一个关键字有什么关系。它希望你告诉它@Key的价值是什么。

所以你有了命令,然后你定义了参数:

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

我经常遇到这个错误,因为我忘了实际定义参数。

答案 1 :(得分:0)

排序。我们有一些代码从参数列表中自动生成CommandText。如果参数是保留字,则CommandText需要在字段名称周围加上方括号,但参数本身不能包含任何括号。

当然,在Access和OleDB的旧时代,它只是:

... SET [Key]=?

这很好。

我们更新的SQLClient代码正在生成:

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

或者(如果我们删除括号):

... SET Key=@Key

这两者都不起作用,因为我们需要的东西(感谢@D ..)是:

... SET [Key]=@Key

看起来我们的CommandText自动生成器代码需要进行一些重新设计。或者我们清除所有保留的词。