vb+sql server,ado方式数据库中有两个表,guest和temp,两表的格式完全相同。guest表中有内容。temp为空。
用recordset得到guest的recordcount没有问题。
但是我用
   TempSql = "select * from temp "   '查看temp表是否为空
   Set TempRs = OpenRec(TempSql)
   If TempRs.RecordCount <> 0 Then  '错误提示在这里
      MsgBox "temp表不为空"
   end if
  
    可是,程序提示 实时错误 3704 ,如果对象已关闭,则不允许执行应用程序所要求的操作。
   为什么?它好像不让我用temp表的recordcount,可是temp表我也没有设置什么啊。它和guest表一样,只是一个有内容而一个无内容啊。
为什么?各位大侠帮忙。谢谢!100分相送,在线等待。

解决方案 »

  1.   

    看看你的代码中有没有类似rs.close之类的代码!如果有的话将此语句删除,然后再试!
      

  2.   

    有rs.close的。但都是针对guest表的。rs也是对guest记录集的。而且rs.close后,立刻有rs.open。为什么?
      

  3.   

    dim rs as adodb.recordset
    dim con as adodb.connection
    试试
    TempSql = "select * from temp "   '查看temp表是否为空
    set con=new adodb.connection
    con.connectionstring=""
    con.open
    rs.open TempSql,con,3,3
    if rs.recordcount<>0 then
       msgbox "not data"
    end if 
      

  4.   

    楼上大侠,我照你那么写,提示错误:[microsoft][odbc 驱动程序管理器]未发现数据源名称并且未指定默认驱动程序。再次请教!
      

  5.   

    If rs.state = 0 Then
       MsgBox "没有记录", vbOKOnly, "提示"
    Exit Sub
    End If
      

  6.   

    问题就在于你的自定义函数OpenRec我猜你这个函数大概这样子吧(乱猜的,也只能这样子猜,猜得不好莫怪啊)
    Public Function OpenRec(ByVal strSqlStmt As String) As ADODB.RecordSet
        rs.Source = strSqlStmt
        rs.Open
        Set OpenRec = rs
        rs.Close
    End FunctionSet TempRs = OpenRec(TempSql)如果你这个函数大概真是这样子的话,不出错才怪呢。
    TempRs 和 rs 同引用一个记录集,
    在函数返回前这个记录集已经被关闭了。
    所以也就出错啰。
      

  7.   

    把这句If TempRs.RecordCount <> 0 Then换成
    if temprs.eof and temprs.bof then
      

  8.   

    建议把OpenRec函数的定义代码Copy上来。
      

  9.   

    我的函数是 Public Function OpenRec(ByVal strSql As String) As ADODB.Recordset
    Dim Tmprec As New ADODB.Recordset
    On Error Resume Next
        Tmprec.Open strSql, Adocn, 3, 3
        Set OpenRec = Tmprec
    End Function
    这个函数应该没有问题。
      

  10.   

    1  TempSql = "select * from temp "   '查看temp表是否为空
    2  Set TempRs = OpenRec(TempSql)
    3  If TempRs.RecordCount <> 0 Then  '错误提示在这里
    4     MsgBox "temp表不为空"
    5  end if事实就是
    在2行位置,返回的记录录是已经关闭了的。所以3行位置访问属性RecordCount报错。
      

  11.   

    引用:sanpo(山炮) ---------------
    把这句If TempRs.RecordCount <> 0 Then换成
    if temprs.eof and temprs.bof then---------------------------
    还是出现第一个错误
      

  12.   

    Public Function OpenRec(ByVal strSql As String) As ADODB.Recordset
        Dim Tmprec As New ADODB.Recordset
        On Error Resume Next
        Tmprec.Open strSql, Adocn, 3, 3
        Set OpenRec = Tmprec
    End Function
    看了你这个函数,也觉得没有什么不对啊。
    但是对于Tmprec这个变量倒是觉得又有点儿问题。
    你又在这个函数中返回这个局部变量...建立这样做
    Public Syb OpenRec(ByVal strSql As String, Rec As ADODB.Recordset)
        ...
        Rec.Open
    End Function
      

  13.   

    当然了
    访问一个关闭了的记录集的属性(RecordCount, Eof, Bof, ...)是没有意义的。
      

  14.   

    Intelement(智能元素) ,你说返回的记录录是已经关闭了的。怎么会呢?
    我的函数已经写了。你能帮我看看吗?guest表的打开,也是用OpneRec的。它的recordset的recordcount都可以正确运用。为什么?OpenRec是在另一个模块中的公用函数。
      

  15.   

    OpenRec没问题!别的表都是用它打开的。
      

  16.   

    其实我也觉得没有问题。
    是因为在C/C++是对象引用都没有计数的。所以在C/C++一定不能返回局部变量。(有点跑题了)Debug.Print TempRs.State '看看是否为1adStateOpen   1
    adStateClosed 0
      

  17.   

    Debug.Print TempRs.State看看其值是否为1adStateOpen   1
    adStateClosed 0
      

  18.   

    Intelement(智能元素)兄 ,Debug.Print TempRs.State为0奇怪了。它是关闭了,但~~但~~但~~为什么~~~~~~~~~~~~~~~~~~~~~~``
      

  19.   

    Public Function OpenRec(ByVal strSql As String) As ADODB.Recordset
        Dim Tmprec As New ADODB.Recordset
        'On Error Resume Next   '把这一句注释掉,看看究竟什么了什么错误。
        Tmprec.Open strSql, Adocn, 3, 3
        Set OpenRec = Tmprec
    End Function会不会是 select * from temp 有错啊噢!对了
    在SQL SERVER 中,TEMP 是关键字!!!这样写SQL语句
    TempSql = "select * from [temp]"
    Set TempRs = OpenRec(TempSql)
      

  20.   

    由于在SQL SERVER中TEMP是关键字。
    所以SELECT * FROM TEMP出现语法错误。
    OPEN记录集的时候肯定出错啦。
    但是你在函数里面启动了错误陷阱
    且用的是On Error Resume Next
    所以...
      

  21.   

    上面只是初步猜测。'On Error Resume Next   '最好把这一句注释掉,看看究竟什么了什么错误!!!!吃饭去,待会儿再来。
      

  22.   

    Intelement(智能元素) ,是的。问题解决了一大半了!
    还有一些错误,但要谢谢你!等我把问题都解决了之后,给你分!
    我也刚吃完饭来!
      

  23.   

    Intelement(智能元素) 兄,还有一个问题需要请教
    如果我要删除一个表的总体内容,该怎么办?
    我用的是   
          If TempRs2.RecordCount <> 0 Then
                TempRs2.MoveFirst             'temp2清空
                For i = 1 To TempRs2.RecordCount
                    TempRs2.Delete
                    TempRs2.MoveNext   ’错误在这里
                Next i
            End If     程序报错。如果改成——   If TempRs2.RecordCount <> 0 Then
                TempRs2.MoveFirst             'temp2清空
                For i = 1 To TempRs2.RecordCount
                    TempRs2.Delete   '错误在这里
                    TempRs2.Update
                    TempRs2.Close
                    TempRs2.Open
                  Next i
            End If而以上两个错误都不是很稳定,请求帮助。
    删除表的所有内容和删除表中的一个记录程序上有啥区别呢?(除了for循环之外)
      

  24.   

    Intelement(智能元素) 兄,我从起了个帖子,能帮帮我吗?在那上面回复吧!