在 MS Access 中使用 adLongVarChar 时无法设置参数大小
Cannot set Parameter size when using adLongVarChar in MS Access
我有一个函数可以调用 SQL 服务器数据库以 return 一个 String
值。以前,预期的字符串值相当短,但由于字符长度有时会超过 255,我已将 table 中的 SQL 字段类型更改为 nvarchar(MAX)
。
在项目中,我将代码更改为使用adLongVarChar
而不是adVarChar
,并且需要指定长度。由于没有长度,我知道对于输入参数,-1
是要使用的正确长度。但是,当使用它作为输出参数时,我收到 运行-Time Error 3708 - 'Parameter object is improperly defined. Inconsistent or incomplete information was provided.'
构造参数的正确语法是什么?
代码如下:
Public Function getStatus() As String
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sp As ADODB.Command
Dim rp1 As ADODB.Parameter
Dim rp2 As ADODB.Parameter
'// Data declarations
Set db = New ADODB.Connection
Set rs = New ADODB.Recordset
Set sp = New ADODB.Command
Set rp1 = sp.CreateParameter("@ksActive", adBoolean, adParamOutput)
Set rp2 = sp.CreateParameter("@ksMsg", adLongVarChar, adParamOutput, -1)
'// Data connection initialisation
db.Open dbString
With sp
.ActiveConnection = db
.CommandText = "dbo.TestProcedureName"
.CommandType = adCmdStoredProc
.Parameters.Append rp1 '// This works fine
.Parameters.Append rp2 '// Error occurs here
.Execute
End With
getStatus = rp2.Value
End Function
TL/DR: 在 MS Access ADODB 中使用 .Parameters.Refresh
和 .NamedParameters = True
定义输出 (return) 参数。
我刚遇到这个问题,也遇到了同样的问题。我在 MSDN "What is the ADO DataType for nVarchAR(max)" 上找到了提示。无论出于何种原因,您必须为 Access ADO 中的长值参数包含一个初始值和长度(至少在 Access VBA 中)。我发现添加 NULL
可以很好地满足它,尤其是当您稍后为存储的命令设置值时。
注意:这仅适用于输入值(如此处所示,不能这样定义输出)
' Note: only works for output params.
Set rp2 = sp.CreateParameter("@ksMsg", adLongVarChar, adParamInput, -1, NULL)
输出参数定义:
使用 OP 的名称:
Public Function getStatus() As String
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sp As ADODB.Command
Dim rp1 As ADODB.Parameter
Dim rp2 As ADODB.Parameter
'// Data declarations
Set db = New ADODB.Connection
Set rs = New ADODB.Recordset
Set sp = New ADODB.Command
'// Data connection initialisation
db.Open dbString
Dim sp As ADODB.Command
With sp
.ActiveConnection = db
.CommandText = "dbo.TestProcedureName"
.CommandType = adCmdStoredProc
.Parameters.Refresh
.NamedParameters = True
Set rp1 = .Parameters("@ksActive")
Set rp2 = .Parameters("@ksMsg")
' Set outputs to null because they're cached, and if your
' second call returns nothing, you'll get the prior call's results.
rp1.Value = Null
rp2.Value = Null
.Execute
End With
getStatus = rp2.Value
End Function
您需要使用sp.Parameters.Refresh
来定义存储过程的输出参数。搜索互联网后,似乎使用 MS Access ADODB adLongVarWChar
(或任何长/宽 return 变量)和 adParamOutput
或 adParamInputOutput
并明确定义它们存在问题.
我发现让输出参数起作用的唯一方法是使用 .Parameters.Refresh
;一旦我这样做了,它就可以正常工作(并且 returns 正确)。
请务必在执行前清除它们(将输出设置为空),否则您将取回之前缓存的结果(这会让您陷入困境)。
我有一个函数可以调用 SQL 服务器数据库以 return 一个 String
值。以前,预期的字符串值相当短,但由于字符长度有时会超过 255,我已将 table 中的 SQL 字段类型更改为 nvarchar(MAX)
。
在项目中,我将代码更改为使用adLongVarChar
而不是adVarChar
,并且需要指定长度。由于没有长度,我知道对于输入参数,-1
是要使用的正确长度。但是,当使用它作为输出参数时,我收到 运行-Time Error 3708 - 'Parameter object is improperly defined. Inconsistent or incomplete information was provided.'
构造参数的正确语法是什么?
代码如下:
Public Function getStatus() As String
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sp As ADODB.Command
Dim rp1 As ADODB.Parameter
Dim rp2 As ADODB.Parameter
'// Data declarations
Set db = New ADODB.Connection
Set rs = New ADODB.Recordset
Set sp = New ADODB.Command
Set rp1 = sp.CreateParameter("@ksActive", adBoolean, adParamOutput)
Set rp2 = sp.CreateParameter("@ksMsg", adLongVarChar, adParamOutput, -1)
'// Data connection initialisation
db.Open dbString
With sp
.ActiveConnection = db
.CommandText = "dbo.TestProcedureName"
.CommandType = adCmdStoredProc
.Parameters.Append rp1 '// This works fine
.Parameters.Append rp2 '// Error occurs here
.Execute
End With
getStatus = rp2.Value
End Function
TL/DR: 在 MS Access ADODB 中使用 .Parameters.Refresh
和 .NamedParameters = True
定义输出 (return) 参数。
我刚遇到这个问题,也遇到了同样的问题。我在 MSDN "What is the ADO DataType for nVarchAR(max)" 上找到了提示。无论出于何种原因,您必须为 Access ADO 中的长值参数包含一个初始值和长度(至少在 Access VBA 中)。我发现添加 NULL
可以很好地满足它,尤其是当您稍后为存储的命令设置值时。
注意:这仅适用于输入值(如此处所示,不能这样定义输出)
' Note: only works for output params.
Set rp2 = sp.CreateParameter("@ksMsg", adLongVarChar, adParamInput, -1, NULL)
输出参数定义:
使用 OP 的名称:
Public Function getStatus() As String
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sp As ADODB.Command
Dim rp1 As ADODB.Parameter
Dim rp2 As ADODB.Parameter
'// Data declarations
Set db = New ADODB.Connection
Set rs = New ADODB.Recordset
Set sp = New ADODB.Command
'// Data connection initialisation
db.Open dbString
Dim sp As ADODB.Command
With sp
.ActiveConnection = db
.CommandText = "dbo.TestProcedureName"
.CommandType = adCmdStoredProc
.Parameters.Refresh
.NamedParameters = True
Set rp1 = .Parameters("@ksActive")
Set rp2 = .Parameters("@ksMsg")
' Set outputs to null because they're cached, and if your
' second call returns nothing, you'll get the prior call's results.
rp1.Value = Null
rp2.Value = Null
.Execute
End With
getStatus = rp2.Value
End Function
您需要使用sp.Parameters.Refresh
来定义存储过程的输出参数。搜索互联网后,似乎使用 MS Access ADODB adLongVarWChar
(或任何长/宽 return 变量)和 adParamOutput
或 adParamInputOutput
并明确定义它们存在问题.
我发现让输出参数起作用的唯一方法是使用 .Parameters.Refresh
;一旦我这样做了,它就可以正常工作(并且 returns 正确)。
请务必在执行前清除它们(将输出设置为空),否则您将取回之前缓存的结果(这会让您陷入困境)。