我们正在将数据库后端从Access迁移到SQL Server。
其中一个字段名称为Key
。现在Key
是a reserved word in both Access and 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后幸存下来,其他表(没有字段名的保留字)也没问题。
我理解其中一个解决方案是避免使用保留字作为字段名称,但我希望得到一个答案,让我们可以像以前一样使用保留字。
答案 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自动生成器代码需要进行一些重新设计。或者我们清除所有保留的词。