VB6.0+SQLserver2000,SQL程储过程在SQL环境下运行正常,能够返回记录集,但在VB6.0下调用,却出现"对象关闭时,不允许操作"错误.以下是源代码:Dim cnn1 As New ADODB.Connection
cnn1.ConnectionString = "Provider=SQLOLEDB.1;Password=168;Persist Security Info=True;User ID=cw;Initial Catalog=OEM;Data Source=192.168.0.1"
cnn1.CursorLocation = adUseClient
StatusBar1.Panels(2).Text = "正在调用存储过程,请稍候..."
    Dim rstByQuery As ADODB.Recordset
    Dim cmd As New ADODB.Command
    Dim paraInput1 As ADODB.Parameter
    Dim paraInput2 As ADODB.Parameter
    cmd.ActiveConnection = cnn1
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "getAmount"    Set paraInput1 = cmd.CreateParameter("@FYear", adInteger, adParamInput, , 2007)
    cmd.Parameters.Append paraInput1
    Set paraInput2 = cmd.CreateParameter("@FPeriod", adInteger, adParamInput, , 12)
    cmd.Parameters.Append paraInput2    Set rstByQuery = New ADODB.Recordset
    rstByQuery.CursorLocation = adUseClient
    rstByQuery.Open cmd, , adOpenKeyset, adLockReadOnly     MsgBox rstByQuery.RecordCount
    Set rstByQuery = cmd.ExecuteIf rstByQuery.EOF Then
   MsgBox "没有记录。"
   cnn1.Close
   Exit Sub
End If

解决方案 »

  1.   

    Dim strS As String '定义一变量
    Dim adoconn As New ADODB.Connection 'Connection 对象代表了打开与数据源的连接。
    Dim adocomm As New ADODB.Command 'Command 对象定义了将对数据源执行的指定命令。
    Dim ReturnValue As Integer '调用存储过程的返回值
    adoconn.ConnectionString = Adodc1.ConnectionString 'Adodc1为窗体中的ADO控件,并已成功连接数据库
    adoconn.Open
    Set adocomm.ActiveConnection = adoconn '指示指定的 Command对象当前所属的 Connection对象。
    adocomm.CommandText = "doc_ProcName" '设置Command对象源。
    adocomm.CommandType = adCmdStoredProc '通知提供者CommandText属性有什么,它可能包括Command对象的源类型。设置这个属性优化了该命令的执行。 
    adocomm.Parameters(1) = "1"
    adocomm.Parameters(2) = "OutputParameters" 'OutputParameters可以为任意的字符串或数字
    adocomm.Execute
    ReturnValue = adocomm.Parameters(0) '存储过程的返回值,返回0则成功执行。
    strS = adocomm.Parameters(2) '把存储过程的输出参数的值赋给变量strS
      

  2.   

    不好意思,我抄少了一句上来,
    cnn1.Open
    我已经打开了,但
      

  3.   

    对了,我想问一问,是不是程储过程中一定要设置反回参数?我和程储过程就没有设置,但在SQL环境中能够正确得到记录集.
      

  4.   

    Set   rstByQuery   =   New   ADODB.Recordset 
            rstByQuery.CursorLocation   =   adUseClient 
            rstByQuery.Open   cmd,   ,   adOpenKeyset,   adLockReadOnly           MsgBox   rstByQuery.RecordCount 
    -------------------
    这个都多余
      

  5.   

    对了,我想问一问,是不是程储过程中一定要设置反回参数?我和程储过程就没有设置,但在SQL环境中能够正确得到记录集.
    -------------------
    不必
      

  6.   

    Set       rstByQuery       =       New       ADODB.Recordset   
                    rstByQuery.CursorLocation       =       adUseClient   
                    rstByQuery.Open       cmd,       ,       adOpenKeyset,       adLockReadOnly                       MsgBox       rstByQuery.RecordCount   
    ------------------- 
    这个都多余
    ----------------------------
    那你的意思是怎么做?
      

  7.   

    多余的意思就是反这个去掉,直接:
    Set rstByQuery=cmd.Execute 
      

  8.   

    已按楼上大大的意见,改了代码如下:
        Dim   cnn1   As   New   ADODB.Connection 
        cnn1.ConnectionString   =   "Provider=SQLOLEDB.1;Password=168;Persist   Security Info=True;User   ID=cw;Initial   Catalog=OEM;Data   Source=192.168.0.1" 
        cnn1.CursorLocation   =   adUseClient 
        StatusBar1.Panels(2).Text   =   "正在调用存储过程,请稍候..." 
        cnn1.open
        Dim rstByQuery As new ADODB.Recordset
        Dim cmd As New ADODB.Command
        Dim paraInput1 As ADODB.Parameter
        Dim paraInput2 As ADODB.Parameter
        cmd.ActiveConnection = cnn1
        cmd.CommandType = adCmdStoredProc
        cmd.CommandText = "getAmount"    Set paraInput1 = cmd.CreateParameter("@FYear", adInteger, adParamInput, , 2007)
        cmd.Parameters.Append paraInput1
        Set paraInput2 = cmd.CreateParameter("@FPeriod", adInteger, adParamInput, , 12)
        cmd.Parameters.Append paraInput2    'Set rstByQuery = New ADODB.Recordset   Set rstByQuery = cmd.ExecuteIf rstByQuery.EOF Then'-------------这一行出错
       MsgBox "没有记录。"
       cnn1.Close
       Exit Sub
    End If
    -------------------
    但还是老地方出错,错误""对象关闭时,不允许操作"
      

  9.   

    我看了很多网上的源代码,这些都能运行,但是在VB.NET+SQLserver2000,我现在是vb6.0+SQLserver2000,会不会是这个问题?
      

  10.   


        Dim cn As New ADODB.Connection
        Dim rs As New ADODB.Recordset
        Dim cmd As New ADODB.Command
        Dim intRetValue As Integer
        cn.ConnectionString = "Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=TEST;Data Source=127.0.0.1"
        If cn.State = adStateOpen Then cn.Close
        cn.Open    Set cmd.ActiveConnection = cn
        cmd.CommandText = "GetInfo"   'GetInfo为存储过程名称
        cmd.CommandType = adCmdStoredProc
        Set rs = cmd.Execute
        
            With rs
            If Not .EOF Then
                .MoveFirst
                While Not .EOF
                   debug.print trim(!xm)
                .MoveNext
                Wend
            End If
            .Close
        End With
        cn.Close
    楼主可以试试看,在这没有问题.
      

  11.   

    感谢楼上的大大.你那个好象没有带参数哦.
    另外我查了一下CSDN,好象也有人和我一样的情况啊,看来问题大了.
    http://topic.csdn.net/u/20070828/09/93a7db4f-bfc2-4b8c-b8e7-d29eb2775d84.html
      

  12.   

    明白了,要在存储过程里加上一句话:set nocount on 
    谢谢各位!