想检测用data控件返回的recordset对象中的EOF属性,但想尽办法不能成功,如下的语句出错,老提示"实时错误'91',对象变量或with块变量未设置"
If Data1.Recordset.EOF Then NotUnlock = False Else NotUnlock = True
然后我又定义
dim a as recordset(写成dim a as new recordset 时同样出错)
set a= data1.recordset
if a.eof then ... else ...
也提示出错!
data控件返回的recordset对象里面的EOF属性究竟该怎么用,请大侠指教!紧急求救!!!!!!!!!!!

解决方案 »

  1.   

    问题的关键不是那里
    我的if又不是块语句,加什么endif
    主要是怎么获取对象的属性,用什么方法
    请高手针对关键点指点小弟一下!!!
      

  2.   

    你是不是把语句写在form_load中了
    我这样写就不会错
    Private Sub Command2_Click()
        If Data1.Recordset.EOF = True Then
            MsgBox "无数据"
        Else
            MsgBox "有数据"
        End If
    End SubPrivate Sub Form_Load()
        Data1.DatabaseName = App.Path & "\db1.mdb"
    End Sub这样就会错
    Private Sub Form_Load()
        Data1.DatabaseName = App.Path & "\db1.mdb"
        If Data1.Recordset.EOF = True Then
            MsgBox "无数据"
        Else
            MsgBox "有数据"
        End If
    End Sub看看是不是你的问题
      

  3.   

    谢谢高手,真是一语道破天机,可我就是想在初始化时检查数据表是否为空,data1的初始化应该是在form的初始化之前吧,为什么data已经初始化了还不能用呢?能否给我解释是什么原因?
    要想实现我说的功能,即一打开窗口加载data后就检测到数据表是否为空还有什么方法?
    用data的Reposition和Validate事件行不?怎么实现呢?
    敬请SoHo_Andy(冰) 帮忙!
    谢谢!
      

  4.   

    SoHo_Andy(冰)的说法是错误的,照他的方法做,我敢肯定同样也是出错的。
        之所以会发生楼主所说的错误,是因为下面的过程中
       Private Sub Form_Load()
         Data1.DatabaseName = App.Path & "\db1.mdb"
         If Data1.Recordset.EOF = True Then
            MsgBox "无数据"
         Else
            MsgBox "有数据"
         End If
       End Sub   你用到了Data1的动态记录集对象Recordset,即Data1.Recordset,而在你的这个过程中你只是设置了Data1.DatabaseName = App.Path & "\db1.mdb" ,并没有初始化Data控件的动态记录集对象,也就是说这个时候动态记录集都还不存在,又哪来Data1.Recordset.EOF呢?是不是? 所以你应该在设计中将Data1控件的RecordSource属性设置好(选定数据库文件中的一个表名也可以),不过,如果你在设计时没有指定Data1控件的DatabaseName属性,只是在窗体装载过程中用代码Data1.DatabaseName = App.Path & "\db1.mdb" 来指定数据库名,那么你就得在代码中设置Data1.RecordSource属性,这样你可能就不会发现有错了,下面是我修改过的代码,给你一个参考:
       Private Sub Form_Load()
         Data1.DatabaseName = App.Path & "\db1.mdb"
         data1.recordsource="这里输入你具体的表名或查询语句" '在这里加上这一句,后面的可能就不会有错了。
         If Data1.Recordset.EOF = True Then
            MsgBox "无数据"
         Else
            MsgBox "有数据"
         End If
       End Sub同时提醒:设计时要注意Data1控件的RecordType属性   我很少用DAO及其控件Data的(我一般用ADO),不过楼主可以参照我的观点和方法试试看,我刚学VB,很多不懂,望各位大侠指教!!   若有问题,愿与楼主讨论。
      

  5.   

    呵呵,to zjp8310(z一阵风z) ,你可以先试试,不要乱说
    to cdxiaogan(小干) 
    你还是不要用data控件了下面是用ADO写的例子,引用ADO对象即可Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim strSQl As String
    Private Sub Form_Load()
        If cn.State = 1 Then
            cn.Close
        End If
        cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db1.mdb"
        
        
        strSQl = "select * from students"
        rs.Open strSQl, cn, adOpenDynamic, adLockOptimistic
        If Not rs.EOF And Not rs.BOF Then
            MsgBox "有记录 " & rs.RecordCount & " 条"
        Else
            MsgBox "没有找到学生的记录"
            rs.Close
            Exit Sub
        End If
        rs.Close
    End Sub
      

  6.   

    最好用ADO来做。
    至于上面的问题哪个对?我没有做实验。
    我觉的zjp8310(z一阵风z) 说的更在理一些。
      

  7.   

    To SoHo_Andy(冰):
       不用测试,谁都知道,一个记录集对象还没有初始化的时候,你能够引用它的Data1.Recordset.EOF属性吗?不信你自己按你的方法去试试,你先不要设置Data1.RecordSource属性,看你能不能通过,然后再先设置Data1.RecordSource,再运用你的方法试试。楼主出错的根本原因是在设计中和运行中都没有设置Data1.RecordSource属性,也没有初始化Data1.Recordset,如果引用Data1.Recordset.EOF之前先初始化了Data1.Recordset,我敢保证在哪里引用Data1.Recordset.EOF属性都不会出错。
        呵呵!我刚学VB,很多不懂,愿向各位讨论学习,还望各位大侠不啬指教!
      

  8.   

    我试过才说的我的测试通过
    Private Sub Command2_Click()
        If Data1.Recordset.EOF = True Then
            MsgBox "无数据"
        Else
            MsgBox "有数据"
        End If
    End SubPrivate Sub Form_Load()
        Data1.DatabaseName = App.Path & "\db1.mdb"
    End Sub
    你的测试不通过
     Private Sub Form_Load()
         Data1.DatabaseName = App.Path & "\db1.mdb"
         data1.recordsource="select * from students"
         If Data1.Recordset.EOF = True Then
            MsgBox "无数据"
         Else
            MsgBox "有数据"
         End If
       End Sub
      

  9.   

    呵呵,不好意思了,这个问题是我错了
    我原来的测试环境已经设置好了recordsource,所以那样写没有出错zjp8310(z一阵风z) 是对的,他上面的代码出错是因为没有刷新,加一句代码即可下面的代码就是楼主想要的答案了
    Private Sub Form_Load()
         Data1.DatabaseName = "d:\db1.mdb"
         Data1.RecordSource = "select * from students"
         Data1.Refresh
         If Data1.Recordset.EOF = True Then
            MsgBox "无数据"
         Else
            MsgBox "有数据"
         End If
    End Subto 大家,特别是zjp8310(z一阵风z),不好意思了,差点误人子弟,呵呵
      

  10.   

    一般情况下我回答别人的问题的时候,总是会先自己在程序中调试通过了再去说话的,这是对别人负责,也是对自己的脸面负责!呵呵!不过有时候我也会偷懒,没有实践过就回答了,所以不免会有错,望大家谅解!但是对于楼主这个问题,那根本不用调试,一看就知道问题出在哪了,所以SoHo_Andy(冰)也不用见怪,我愿向你学习!另外据我的经验:我发现你给的ADO代码中也是有错的,这是因为你用的数据库引擎是Microsoft.Jet.OLEDB.4.0,因此你要想获得打开的记录集的属性,你必须要设置cn.cursorlocation=aduseclient(默认情况下cn.cursorlocation=aduseserve),否则你将会发现下面语句块中:
       If Not rs.EOF And Not rs.BOF Then
            MsgBox "有记录 " & rs.RecordCount & " 条"
        Else
            MsgBox "没有找到学生的记录"
            rs.Close
            Exit Sub
        End If
    中的条件Not rs.EOF And Not rs.BOF永远都是成立的,而且永远都会弹出信息框“有记录-1条”,因为这个时候rs.RecordCount的值永远都是-1,表明记录集根本就不存在(这又有点象楼主的那个错误了),如果不信你可以调试看看,之所以出这个错,是因为你的连接字串用的驱动程序是Provider=Microsoft.Jet.OLEDB.4.0,而且又没有设置cn.cursorlocation=aduseclient,因此记录集实际上根本不存在本机内存中,所以对它的任何引用同样会出错,但是如果你的连接字串中的驱动程序用MSDASQL.1(当然这时候连接字串都变了),即使你没有设置cn.cursorlocation=aduseclient,却又不会出错,不信你把你的连接字串中的驱动程序改为MSDASQL.1(连接字串的其他内容相应修改)试试看。     愿意向SoHo_Andy(冰)学习讨论!希望你能再次来这里回话.