我现在要写一个调用存储过程的共通方法,根据方法传入的参数中取得存储过程名称和参数及值,调用存储过程,存储过程参数类型全用varchar,现在的问题就是不清楚每个存储过程中参数的长度是多少,如果在VBA中调用,应该如何解决?
如:cmd.CreateParameter( param,adVarChar, adParamInput, 20, value)  后面的20是长度,因为每个参数的长度不一定一样,所以不好写个固定值。param和value都是通过方法传进来的 

解决方案 »

  1.   

    想了下大概可以在参数名称上打点注意,比如参数命名规则分四个部分A_B_C_D
    A:表示是第几个参数,或者参数名称;
    B:表示参数类型,类型值参见ADODB.DataTypeEnum;
    C:表示长度
    D:参数值这样可以在过程中拆分这个名称得到相应的值,下面是个示例:'模块中:Public Msg as string
    '通用的参数化查询函数
    Public Function ParamQueryDB( _
        rs As ADODB.Recordset, parStr As String, parValue() As String _
    ) As Long
    '--------------------------------------------------------------------------
    'rs:          返回的记录集
    'parStr:       sql语句或者存储过程名称(本例只讨论SQL语句)
    'parValue():   参数属性数组,结构:参数名称_类型_长度_值
    '--------------------------------------------------------------------------On Error GoTo Err_ParQuery    Dim cn As ADODB.Connection
        Dim cmd As ADODB.Command
        Dim par As ADODB.Parameter
        Dim arrPar() As String
        Dim i As Long
        
        Msg = ""
        If ConnectionDB(cn) = 0 Then        '连接数据库函数
            ParamQueryDB = -1
        Else
            Set cmd = New ADODB.Command
            cmd.ActiveConnection = cn
            cmd.CommandType = adCmdText     '本例只接受SQL参数查询
            cmd.CommandText = parStr
            
            For i = 0 To UBound(parValue)
                arrPar = Split(parValue(i), "_")
                Set par = New ADODB.Parameter
                With par
                    .Name = arrPar(0)
                    .Type = arrPar(1)
                    .Direction = 1          '本例只讨论输入参数
                    .Size = arrPar(2)
                    .Value = arrPar(3)
                End With
                cmd.Parameters.Append par
            Next
            Set rs = cmd.Execute
            If rs.EOF Then
                ParamQueryDB = 0
            Else
                ParamQueryDB = rs.RecordCount
            End If
        End If
        
    Exit_ParQuery:
        Set cmd = Nothing
        Set cn = Nothing
        Exit Function
        
    Err_ParQuery:
        Set rs = Nothing
        Msg = "< ParamQueryDB > " & Err.Description
        ParamQueryDB = -1
        Resume Exit_ParQuery
    '--------------------------------------------------------------------------
    '正常返回 1 或者 rs.RecordCount
    '无数据返回 0
    '错误返回 -1
    '--------------------------------------------------------------------------
    End Function'窗体中调用上面过程的测试代码:
    Private Sub Command2_Click()    Dim rs As ADODB.Recordset
        Dim dte As ADODB.DataTypeEnum   '类型枚举
        Dim sql As String
        Dim pValue(1) As String
        Dim n As Long
            
        'sql语句
        sql = "select * from t_dlt where id like '%'+@1+'%' and f5=@2 "
        '构造参数
        dte = adVarChar
        pValue(0) = "@1_" & dte & "_10_000"    '参数名称@1_类型adVarChar_长度10_值000
        dte = adInteger
        pValue(1) = "@2_" & dte & "_2_30"
        '调用通用的参数查询过程
        n = ParamQueryDB(rs, sql, pValue)
        If n > 0 Then
            Debug.Print rs.GetString
        ElseIf n = 0 Then
            Debug.Print rs.BOF
        Else
            Debug.Print Msg
        End If
        Set rs = Nothing
        
    End Sub
      

  2.   

    存储过程是我自己写的,但我在VBA中写的这个方法是个公用的方法,用来调用任意存储过程的,而参数的设定是通过循环实现,就算知道每个存储过程中它参数的长度,在循环中也用上不啊。
      

  3.   


    这位大哥,多谢了,你的方法过于麻烦,对我来说作用不太大,我已经想到了一个比较简单的方法。上面我也说了,是通过循环来设定参数,但可以确定每个参数都是varchar类型,所以长度就用varchar的最大长度值 8000,这样也不会和存储过程参数定的长度值相矛盾。
      

  4.   


    这位大哥,多谢了,你的方法过于麻烦,对我来说作用不太大,我已经想到了一个比较简单的方法。上面我也说了,是通过循环来设定参数,但可以确定每个参数都是varchar类型,所以长度就用varchar的最大长度值 8000,这样也不会和存储过程参数定的长度值相矛盾。