最近我写了个程序,利用command对象调用存储过程,
在传参数时遇到问题,首次append 参数没问题,调用存储过程,执行成功,
但是想给这个command对象参数集合重新添加参数,然后调用其他存储过程
却没有办法清除原来的参数,我是这样清除的:
    if cmd.parameters.count<>0 then
              cmd.parameters.refresh
    end if
看了MSDN后只知道这么写,却没有任何作用,结果当然是调用存储过程是出错
请赐教!!!!谢谢

解决方案 »

  1.   

    是否要先关闭cmd所打开的结果集?
      

  2.   

    '不要用appand的方法来处理存储过程参数,只用refresh就行了.    Dim iCmd As ADODB.Command
        Dim iRe As ADODB.Recordset
        Dim count1&, count2&, count3&, count4&
        
        Set iCmd = New ADODB.Command
        With iCmd
            .ActiveConnection = iConc   'iConc是数据库连接字符串
            .CommandType = 4            '类型为存储过程adCmdStoredProc
            
            .CommandText = "p_qry"      '调用的存储过程名
            .Parameters.Refresh
            .Parameters("@userid ") = 12
            
            '得到输出参数的结果
            .Execute
            count1 = .Parameters("@count1")
            count2 = .Parameters("@count2")
            count3 = .Parameters("@count3")
            count4 = .Parameters("@count4")
            
            '得到记录集的输出结果
            Set iRe = .Execute
        End With
      

  3.   

    我想你的command对象是定义成一个全局的,这样的话你每次运行时它没有清空里面原有的
    parameter对象又append新的parameter对象,当然再一次运行时会说指定的参数太多,
    你试着把command对象定义成一个局部的试一下
      

  4.   

    不能清除只能进行重新赋值或者释放后重新建立Append 和 CreateParameter 方法范例
    该范例使用 Append 和 CreateParameter 方法执行具有输入参数的存储过程。Public Sub AppendX()   Dim cnn1 As ADODB.Connection
       Dim cmdByRoyalty As ADODB.Command
       Dim prmByRoyalty As ADODB.Parameter
       Dim rstByRoyalty As ADODB.Recordset
       Dim rstAuthors As ADODB.Recordset
       Dim intRoyalty As Integer
       Dim strAuthorID As String
       Dim strCnn As String   ' 打开连接。
       Set cnn1 = New ADODB.Connection
       strCnn = "Provider=sqloledb;" & _
          "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
       cnn1.Open strCnn
       cnn1.CursorLocation = adUseClient
          
       ' 使用一个参数打开命令对象。
       Set cmdByRoyalty = New ADODB.Command
       cmdByRoyalty.CommandText = "byroyalty"
       cmdByRoyalty.CommandType = adCmdStoredProc
       
       ' 获取参数值并追加参数。
       intRoyalty = Trim(InputBox("Enter royalty:"))
       Set prmByRoyalty = cmdByRoyalty.CreateParameter("percentage", _
          adInteger, adParamInput)
       cmdByRoyalty.Parameters.Append prmByRoyalty
       prmByRoyalty.Value = intRoyalty   ' 通过执行命令创建记录集。
       Set cmdByRoyalty.ActiveConnection = cnn1
       Set rstByRoyalty = cmdByRoyalty.Execute
       
       ' 打开 Authors 表以获取作者姓名进行显示。
       Set rstAuthors = New ADODB.Recordset
       rstAuthors.Open "authors", cnn1, , , adCmdTable
       
       ' 打印记录集中的当前数据,从 Authors 表中添加作者姓名。
       Debug.Print "Authors with " & intRoyalty & " percent royalty"
       Do While Not rstByRoyalty.EOF
          strAuthorID = rstByRoyalty!au_id
          Debug.Print "   " & rstByRoyalty!au_id & ", ";
          rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
          Debug.Print rstAuthors!au_fname & " " & rstAuthors!au_lname
          rstByRoyalty.MoveNext
       Loop   rstByRoyalty.Close
       rstAuthors.Close
       cnn1.CloseEnd Sub
      

  5.   

    我就是想用一个模块级的command对象,我需要工程里反复使用它,如果我每次都重新定义那太多了,我的想法是能够把parameters的参数清空就应该可以使用了,觉的这也是行的同的
    refresh方法就是起这个作用,
      

  6.   

    我解决了,原来这样就可以了
    dim i as integer
    for i=cmd.parameters.count-1 to 0 step -1
             cmd.parameters.delete(i)
    next
      

  7.   

    http://expert.csdn.net/Expert/topic/2960/2960933.xml?temp=.6431543