【问题标题】:Error "Must declare the scalar variable" when using a reserved word in a SqlParameter在 SqlParameter 中使用保留字时出现错误“必须声明标量变量”
【发布时间】:2011-12-29 16:51:45
【问题描述】:

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

其中一个字段名称是Key。现在Keya reserved word in both Access and SQL Server,所以Access 中的解决方法总是在字段名称周围加上方括号。

在连接到 Access 时,我们为每个 OleDBCommand 生成了一个 OleDBParameter 集合。在运行时检查命令的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 后,其他所有内容都幸存下来,其他表(字段名称没有保留字)都很好。

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

【问题讨论】:

  • 您能发布您用于命令及其参数绑定的代码块吗?很高兴看到您的代码,以便我们能够判断 @Key 是否是未声明的变量/参数,或者没有任何内容绑定到该值占位符..

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 你说得对……嗯,但我不知道为什么我的冗长版本(不使用AddWithValue)没有……看我的编辑。我会继续努力弄清楚
  • 您的参数名称中没有@,也没有将其添加到命令参数中。
  • 再次,你是对的:在简化以便复制到 stackoverflow 时,我已经跳过将其添加到命令的参数中。不过,这不是原版的问题。还在看。
  • @是否在您在常规代码中添加它的部分?替换这个: p = New SqlParameter("Key", SqlDbType.VarChar) 用 p = New SqlParameter("@Key", SqlDbType.VarChar)
【解决方案2】:

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

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

... SET [Key]=?

这很好。

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

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

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

... SET Key=@Key

这两个都行不通,因为我们需要(感谢@D..)是:

... SET [Key]=@Key

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多