查询“必须声明标量变量”

Posted

技术标签:

【中文标题】查询“必须声明标量变量”【英文标题】:Query "must declare scalar variable" 【发布时间】:2021-10-15 16:37:31 【问题描述】:

执行命令后,我的 vb.net 例程出现错误,出现错误:

必须声明@nameD 变量

SQL Server 中的表是:

name: TAB,
ID integer unique,
NameD varchar(50)

我不明白为什么会出现此错误。

是因为我在本地系统上使用了 OLEdb 吗?我只是将项目转换为 SQL Server 还是查询中有错误?

注意我用这些参数打开连接:

Dim strsql As String = ""
Dim strConn As String = "Provider=MSOLEDBSQL;Server=0.0.0.0;Database=****;UID=sa;PWD=***;"
Dim Conn As New OleDbConnection

这就是函数

Public Function Ins() as integer

     strsql = "INSERT INTO TAB (nameD) VALUES (@nameD)"

     Dim CMD as New OleDbCommand(strsql, Conn)

     With CMD
               .Parameters.Add("@nameD", OleDbType.VarChar).Value = "aaa"
              .ExecuteNonQuery()
     End With

     CMD = Nothing

     Dim COnt As Long
     Dim cmdC As OleDbCommand = New OleDbCommand("SELECT@@IDENTITY", Conn)
     COnt = CType(cmdC.ExecuteScalar, Integer)
     Return COnt
end function

我试过了

CMD.Parameters.AddWithValue("@nameD", "aaa")

【问题讨论】:

OleDbParameter remarks: “OLE DB.NET Framework 数据提供程序使用标有问号 (?) 的位置参数,而不是命名参数。” 我不是 100% 确定使用 OleDb 支持它(它不支持 Access,但可能是 Jet/ACE 的东西)但是,如果你使用 SqlClient,你可以这样做INSERTSELECT 在同一命令中,只需调用 ExecuteScalar 它实际上并不会受到伤害,但是将您的调用结果转换为ExecuteScalar 作为Integer 类型然后将其分配给Long 变量到底有什么意义?这只是表明缺乏思想。 是的,这是一个问号 (?),我正在迁移一个项目,它可以工作 @jmcilhinney 通过 Access 及其 OleDb 提供程序,您可以使用命名参数(SELECTINSERT 等)。名称只是被忽略,唯一考虑的当然是位置,与将参数添加到命令的顺序有关。 【参考方案1】:

我不确定您为什么要使用OleDb 而不是SqlClient 连接到SQL Server,但是,如果您要这样做,我认为不支持命名参数。您需要在 SQL 代码中使用泛型参数占位符:

strsql = "INSERT INTO TAB (nameD) VALUES (?)"

【讨论】:

是的,这是一个问号 (?),我正在迁移一个项目,它可以工作

以上是关于查询“必须声明标量变量”的主要内容,如果未能解决你的问题,请参考以下文章

使用 ODBC 连接到 SQL SERVER 时,s-s-rS 错误必须声明标量变量

必须声明标量变量“@status”“用户定义的表类型”

必须用参数声明标量变量

必须声明标量变量@Id?

表变量和错误“必须声明标量变量”

不正确的语法必须声明标量变量