0

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

字段名称之一是Key. 现在KeyAccess 和 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 后幸存下来,其他表(字段名称没有保留字)都很好。

我知道其中一种解决方案是避免使用保留字作为字段名称,但我希望得到一个答案,让我们能够像往常一样解决保留字。

4

2 回答 2

2

我认为该错误与 Key 作为关键字没有任何关系。它希望你告诉它@Key 的值是什么。

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

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

我通常会遇到该错误,因为我忘记实际定义参数。

于 2011-11-15T18:13:15.133 回答
0

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

当然,在 Access 和 OleDB 的美好|糟糕的过去,它只是:

... SET [Key]=?

这很好。

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

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

否则(如果我们删除了括号):

... SET Key=@Key

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

... SET [Key]=@Key

看起来我们的 CommandText 自动生成器代码需要重新设计。要么这样,要么我们清除所有保留字。

于 2011-11-15T19:38:07.257 回答