查询“必须声明标量变量”
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
,你可以这样做INSERT
和 SELECT
在同一命令中,只需调用 ExecuteScalar
。
它实际上并不会受到伤害,但是将您的调用结果转换为ExecuteScalar
作为Integer
类型然后将其分配给Long
变量到底有什么意义?这只是表明缺乏思想。
是的,这是一个问号 (?),我正在迁移一个项目,它可以工作
@jmcilhinney 通过 Access 及其 OleDb 提供程序,您可以使用命名参数(SELECT
、INSERT
等)。名称只是被忽略,唯一考虑的当然是位置,与将参数添加到命令的顺序有关。
【参考方案1】:
我不确定您为什么要使用OleDb
而不是SqlClient
连接到SQL Server,但是,如果您要这样做,我认为不支持命名参数。您需要在 SQL 代码中使用泛型参数占位符:
strsql = "INSERT INTO TAB (nameD) VALUES (?)"
【讨论】:
是的,这是一个问号 (?),我正在迁移一个项目,它可以工作以上是关于查询“必须声明标量变量”的主要内容,如果未能解决你的问题,请参考以下文章