在 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 变量)和 adParamOutputadParamInputOutput 并明确定义它们存在问题.

我发现让输出参数起作用的唯一方法是使用 .Parameters.Refresh;一旦我这样做了,它就可以正常工作(并且 returns 正确)。

请务必在执行前清除它们(将输出设置为空),否则您将取回之前缓存的结果(这会让您陷入困境)。