楼主,参数不是这样传递的你可以参考以下http://expert.csdn.net/Expert/topic/903/903782.xml?temp=.1472589

解决方案 »

  1.   

    With cpwx
    Set .ActiveConnection = Cn
    .CommandText = "{call packperson.GETperson(?,{resultset 0, fname})}"
            .CommandType = adCmdText               'adCmdText
            Set Pram = .CreateParameter("varssn", adInteger, adParamInput, ,666223333)
            .Parameters.Append Pram
    end with
      

  2.   

    还要注明一点,你在结速FORM时,先对recordset关闲,再对Command关闲。否则不能取到记录集!
      

  3.   

    fname不是游标类型,不知{resultset 0, fname}是否有错,你试试把删除,改成以下:
    .CommandText = "{call packperson.GETperson(?)}"
      

  4.   

    1、connection的provider应该改成Provider=MSDAORA.1
    2、command的写法不对,而且少了一个参数设定,应该改成如下:
    plsql = "{call packperson.GETperson(?, {resultset 1000, fname})}"
    With cpwx
        Set .ActiveConnection = Cn
        .CommandText = plsql
        .CommandType = adCmdText
        .Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9, 1)
    End With
    Set Rs.Source = cpwx.Executevarssn这个参数在包中并没有发挥作用,但是在调用的时候不能省略。以上代码在vb6/ado2.5下测试通过。
      

  5.   

    首先还是感谢各位的回答,但是,按照弱水兄的做法可以不出错的完成,但是怎么样绑定或显示记录集呢?
    如果不能绑定,那怎么把取回的数据写到网格之类的控件中呢?如果一行行的写岂不是效率太低!
    送佛送到西天,帮我帮到底吧!:)
    以下是我的command1_Click代码:
    ---------------------------------
    On Error GoTo xxxx
    Dim cpwx As New ADODB.Command
    Dim Rs   As New ADODB.Recordset
    plsql = "{call packperson.GETperson(?, {resultset 1000, fname})}"
    With cpwx
        Set .ActiveConnection = Cn
        .CommandText = plsql
        .CommandType = adCmdText
        .Parameters.Append .CreateParameter("666223333", adNumeric, adParamInput, 9, 1)
    End With
    Set Rs.Source = cpwx.Execute
    MsgBox (Rs.Fields.Count)     '这里显示为1
    MsgBox (Rs.Fields("fname").Value)  --这句话错误,显示为对象关闭时不能打开
    Set DataGrid1.DataSource = Rs.Fields("fname")  '这句话更不行了!:)
    Set DataGrid1.DataSource = Rs '这句话也不行
    DataGrid1.Refresh
    Exit Sub
    xxxx:
    msgbox(error)
    -----------------------------------------------
    '唉,到底怎么样把记录集给取出来啊!又怎么样绑定到网格中呢!我用的网格是VB自带的datagrid(oledb)
    还有,虽然按照弱水兄的提示,没有出错,但我还是搞不清那个什么
     "{call packperson.GETperson(?, {resultset 1000, fname})}"
    这个字符串为什么要这样写,猜了一下,是不是这样的原理;
    {call <包名>.<过程名>(<?这个是干什么的啊>,{resultset <返回的记录行最大数>,<记录集名>})}请各位也帮着看一看这样理解对吗?
    如果不对,那该怎么理解呢?深深的期待中...............
      

  6.   

    记录集的问题讨论过很多,faq里面就有。
      

  7.   

    能从FAQ里看明白我就不会到这里问了,老大!
      

  8.   

    Parameters.Append .CreateParameter("666223333", adNumeric, adParamInput, 9, 1)这句话还是有错,你要熟悉command的CreateParameter方法才行,
    createparameter(name,direction,type,size,value)把它改成以下
    Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9,666223333)问题二
    "{call packperson.GETperson(?, {resultset 1000, fname})}"
    ?是用在前端输入的参数而已,相当于oracle存储过程中的in
    procedure getperson(varssn  int,fname out Tfname);varssn默认为in
      

  9.   

    plsql = "{call packperson.GETperson(?, {resultset 1000, fname})}"
    With cpwx
        Set .ActiveConnection = Cn
        .CommandText = plsql
        .CommandType = adCmdText
        .Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9, 1)
    End With
    Set Rs.Source = cpwx.Execute
    MsgBox (Rs.Fields.Count)     '这里显示为1
    '下面这句话没出错,但在网格里,看不到任何东????????????
    Set DataGrid1.DataSource = Rs 
    DataGrid1.Refresh'唉,到底怎么样把记录集给取出来啊!又怎么样绑定到网格中呢!我用的网格是VB自带的datagrid(oledb)
      

  10.   

    或许不对.但你不防一试:
    将联接字符串驱动改成如下:Provider=MSDAORA.1;
      

  11.   

    或者你可以用一个编辑框来显示记录集,试多种方法可否显示,在属性方面有否漏,是否设错。
    good luck!
      

  12.   

    不行!
    另外,我的Provider已经是MSDAORA.1;
    !大家再帮忙看一看啊!
      

  13.   

    if recordset.eof then
    没有记录集!
    else
      有记录集!
    endif;
    试试看是否有记录集.
      

  14.   

    哎呀,终于出来了!
    终于出来了!谢谢你们啊!
    plsql = "{call packperson.GETperson(?, {resultset 1000, fname})}"
    With cpwx
        Set .ActiveConnection = Cn
        .CommandText = plsql
        .CommandType = adCmdText
        .Parameters.Append .CreateParameter("varssn", adNumeric, adParamInput, 9, 1)
    End With
    '改这句Set Rs.Source = cpwx.Execute为
    Set Rs = cpwx.Execute
    '正确的和错误的,就在一线之间!!!
    Set DataGrid1.DataSource = Rs 
    DataGrid1.Refresh
      

  15.   

    sorry,没有注意到你的那句
    解决一:
    Set Rs = cpwx.Execute
    解决二:
    Set Rs.Source = cpwx
    rs.open()