我给你我的一个执行你的类似包的vb代码,我一直在用,是可以的。
Public Function fReceiveCandImage(ByVal RemoteID As String, ByVal ResponseID As Long, ocKeyNo As String, oiFingerNo As Integer) As Boolean
        Dim rsR As New ADODB.Recordset
        Dim cmdR As ADODB.Command
        Dim Pram As ADODB.Parameter
        '//写日志
         Call WriteToSendLog("开始接收候补图象信息, ResponseID = " & ResponseID)
        On Error GoTo fReceiveCandImageErr
        '//执行以上过程
        Set cmdR = New ADODB.Command
        With cmdR
            .CommandText = "{call pkgRemote.sp_Get_CandidateImg(?,?,{resultset 0, io_cursor})}"
            .CommandType = adCmdText               'adCmdText
            Set Pram = .CreateParameter("iRemote_ID_I", adBSTR, adParamInput, , RemoteID)
            .Parameters.Append Pram
            Set Pram = .CreateParameter("iResponseID", adInteger, adParamInput, , ResponseID)
            .Parameters.Append Pram
        End With
        '//得到记录集
        rsR.CursorType = adOpenStatic
        rsR.LockType = adLockReadOnly
        Set cmdR.ActiveConnection = CNRemote    'CNRemote是一个ADO的连接
        Set rsR.Source = cmdR
        'set fExecuteOneCommand = CNRemote.Execute  '这是另一种执行方式
        rsR.Open
        '//如果没有记录集,过程执行不成功
        If rsR Is Nothing Then
             Call WriteToSendLog("读取远程remote数据库发生错误")
            fReceiveCandImage = False
            GoTo fReceiveCandImageErr
        End If
        '//如果记录集为空,没有取到数据
        If rsR.EOF Then
             Call WriteToSendLog("没有该图象供接收:ResponseID = " & ResponseID)
            fReceiveCandImage = False
            GoTo fReceiveCandImageExit
        End If
        '//函数执行成功,数据获取成功
        fReceiveCandImage = True
         Call WriteToSendLog("接收候补图像结束")
fReceiveCandImageExit:
        If rsR.Status = adStateOpen Then rsR.Close
        Set rsR = Nothing
        If Not (cmdR Is Nothing) Then Set cmdR = Nothing
        On Error GoTo 0
        Exit Function
fReceiveCandImageErr:
         Call WriteToSendLog("接收候补图像失败:" & Err.Description)
        fReceiveCandImage = False
        GoTo fReceiveCandImageExit
End Function

解决方案 »

  1.   

    这是msdn中有关返回记录集和vb调用存取过程的办法
    DROP TABLE person;CREATE TABLE person
     (ssn     NUMBER(9) PRIMARY KEY,
      fname   VARCHAR2(15),
      lname   VARCHAR2(20));INSERT INTO person VALUES(555662222,'Sam','Goodwin');INSERT INTO person VALUES(555882222,'Kent','Clark');INSERT INTO person VALUES(666223333,'Jane','Doe');COMMIT;
     /  
    Create the following package on your Oracle server:CREATE OR REPLACE PACKAGE packperson
      AS
        TYPE tssn is TABLE of  NUMBER(10)
        INDEX BY BINARY_INTEGER;
        TYPE tfname is TABLE of VARCHAR2(15)
        INDEX BY BINARY_INTEGER;
        TYPE tlname is TABLE of VARCHAR2(20)
        INDEX BY BINARY_INTEGER;    PROCEDURE allperson
                (ssn    OUT     tssn,
                 fname  OUT     tfname,
                 lname  OUT     tlname);
        PROCEDURE oneperson
            (onessn IN      NUMBER,
             ssn    OUT     tssn,
                 fname  OUT     tfname,
                 lname  OUT     tlname);
    END packperson;
    /  
    Create the following package body on your Oracle server:CREATE OR REPLACE PACKAGE BODY packperson
    ASPROCEDURE allperson
                (ssn    OUT     tssn,
                 fname  OUT     tfname,
                 lname  OUT     tlname)
    IS
        CURSOR person_cur IS
                SELECT ssn, fname, lname
                FROM person;    percount NUMBER DEFAULT 1;BEGIN
        FOR singleperson IN person_cur
        LOOP
                ssn(percount) := singleperson.ssn;
                fname(percount) := singleperson.fname;
                lname(percount) := singleperson.lname;
                percount := percount + 1;
        END LOOP;
    END;PROCEDURE oneperson
          (onessn  IN    NUMBER,
                 ssn     OUT   tssn,
                 fname   OUT   tfname,
                 lname   OUT   tlname)
    IS
     CURSOR person_cur IS
               SELECT ssn, fname, lname
               FROM person
               WHERE ssn = onessn;    percount NUMBER DEFAULT 1;BEGIN
        FOR singleperson IN person_cur
        LOOP
                ssn(percount) := singleperson.ssn;
                fname(percount) := singleperson.fname;
                lname(percount) := singleperson.lname;
                percount := percount + 1;
        END LOOP;
    END;
    END;
    /  
    Open a new project in Visual Basic 5.0 or 6.0 Enterprise edition. Form1 is created by default. 
    Place the following controls on the form:
    Control     Name             Text/Caption
    -----------------------------------------
    Button      cmdGetEveryone   Get Everyone
    Button      cmdGetOne        Get One 
    From the Tools menu, select the Options item. Click the "Default Full Module View" option and then click OK. This will allow you to view all of the code for this project. Paste the following code into your code window:Option Explicit
    Dim Cn As ADODB.Connection
    Dim CPw1 As ADODB.Command
    Dim CPw2 As ADODB.Command
    Dim Rs As ADODB.Recordset
    Dim Conn As String
    Dim QSQL As String
    Dim inputssn As LongPrivate Sub cmdGetEveryone_Click()  Set Rs.Source = CPw1  Rs.Open  While Not Rs.EOF
          MsgBox "Person data: " & Rs(0) & ", " & Rs(1) & ", " & Rs(2)
          Rs.MoveNext
      Wend  Rs.CloseEnd SubPrivate Sub cmdGetOne_Click()  Set Rs.Source = CPw2  inputssn = InputBox("Enter the SSN you wish to retrieve:")  CPw2(0) = inputssn  Rs.Open  MsgBox "Person data: " & Rs(0) & ", " & Rs(1) & ", " & Rs(2)  Rs.CloseEnd SubPrivate Sub Form_Load()  'Replace <User ID>, <Password>, and <Server> with the
      'appropriate parameters.
      Conn = "UID=*****;PWD=*****;driver=" _
             & "{Microsoft ODBC for Oracle};SERVER=dseOracle;"  Set Cn = New ADODB.Connection
      With Cn
          .ConnectionString = Conn
          .CursorLocation = adUseClient
          .Open
      End With  QSQL = "{call packperson.allperson({resultset 9, ssn, fname, " _
             & "lname})}"  Set CPw1 = New ADODB.Command
      With CPw1
          Set .ActiveConnection = Cn
          .CommandText = QSQL
          .CommandType = adCmdText
      End With  QSQL = "{call packperson.oneperson(?,{resultset 2, ssn, fname, " _
             & "lname})}"  Set CPw2 = New ADODB.Command
      With CPw2
          Set .ActiveConnection = Cn
          .CommandText = QSQL
          .CommandType = adCmdText
          .Parameters.Append .CreateParameter(, adInteger, adParamInput)
      End With  Set Rs = New ADODB.Recordset
      With Rs
          .CursorType = adOpenStatic
          .LockType = adLockReadOnly
      End WithEnd SubPrivate Sub Form_Unload(Cancel As Integer)  Cn.Close
      Set Cn = Nothing
      Set CPw1 = Nothing
      Set CPw2 = Nothing
      Set Rs = NothingEnd Sub 
    Go to the Project menu item and select References. Select the "Microsoft Active Data Objects 2.x Library." Run the project. When you click on the "Get Everyone" button, it executes this query:QSQL = "{call packperson.allperson({resultset 9, ssn, fname, "_
                   & "lname})}" 
      

  2.   

    多谢上面的楼兄,
    我照你的方法已经实现,
    Set rs = New ADODB.Recordset
    Dim comm As New ADODB.Command
    Dim SQLS As String
    SQLS = "{call pkg_test.getforums({resultset 10, forumname})}"
    With comm  '执行存储过程
          .ActiveConnection = Cn
          .CommandType = adCmdText
          .CommandText = SQLS
          .Execute
    End With
    Set rs.Source = comm
    rs.Open
    ' While Not rs.EOF                 '在这里可以看到数据集!
    '      MsgBox "Name: " & rs(0)
    '      rs.MoveNext
    ' Wend
    Set DataGrid1.DataSource = rs还有个问题是,我想把RS附值给一个DBGRID!但是在DBGIRD里面看不到数据,不知道为什么!