请高手指教,本工程是用ADO对象引用,Access2000为后台,里面主要有两个表,一个用户表,已经成功完成相关功能,如增加、删除、修改等,另外一个表为图书库,在连接该表时总是报告对象变量或WITH变量未设置。
代码如下:
Option Explicit
Dim addorSave As Boolean
Dim mrc As ADODB.Recordset
Public txtSQL As String
Dim adoCn As New ADODB.ConnectionPrivate Sub CboClass_Change()
  Dim sSql As String
  Dim MsgText As String
  Dim mrcc As ADODB.Recordset
End SubPrivate Sub CboClass_KeyDown(KeyCode As Integer, Shift As Integer)
 EnterToTab KeyCode
End SubPrivate Sub CmdCancel_Click()
 Unload Me
End SubPrivate Sub Form_Load()
' Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb" & ";Persist Security Info=False"
 AdoBook.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\library.mdb" & ";Persist Security Info=False"
 'adoCn.Open
 addorSave = True
' AdoBook.Caption = "记录数:" & AdoBook.Recordset.AbsolutePosition + 1 & "/" & AdoBook.Recordset.RecordCount
 Dim sSql As String
 Dim intCount As Integer
 Dim MsgText As String
 Dim mrc As ADODB.Recordset
 txtSQL = "select distinc 类别名称 from 图书类别表"
 Set mrc = ExecuteSQL(txtSQL, MsgText)
 If mrc.EOF Then
    Do While Not mrc.EOF
        CboClass.AddItem Trim(mrc.Fields(1))
        mrc.MoveNext
    Loop
        CboClass.ListIndex = 0
 Else
    MsgBox "请先进行书籍标准设置!", vbOKOnly + vbExclamation, "警告"
    CmdAddorOK.Enabled = False
    Exit Sub
 End If
    mrc.Close
End Sub

解决方案 »

  1.   

    把 Dim mrc as ADODB.Recordset 改为Dim mrc as NEW ADODB.Recordset 看看
    应该可以的。
      

  2.   

    估计不是这问题,Dim mrc as ADODB.Recordset 的写法并不错呀,你有没有用MSfelxgrid?
      

  3.   

    看看是否是应该把数据规范化为string后再添加到CboClass
      

  4.   

    If mrc.EOF Then
        Do While Not mrc.EOF
            CboClass.AddItem Trim(mrc.Fields(1))
            mrc.MoveNext
        Loop
            CboClass.ListIndex = 0
     Else
       上面的代码: mrc.EOF表示没有记录,那下面怎么还执行呢
    应改成
         if not mrc.EOF then
      

  5.   

    好象少了定义adobook作为Connection
    (却定义了Dim adoCn As New ADODB.Connection)
    dim AdoBook as Adodb.Connection
    set adobool=new adodb.connection
      

  6.   

    用mrc前写上一句set mrc=new ADODB.Recordset
      

  7.   

    在执行到Set mrc = ExecuteSQL(txtSQL, MsgText)时,你定义的MsgText是做什么的?我查了一下MSDN,ExecuteSQL只有一个参数啊!
      

  8.   

    根据错误提示应该是某个对象没有实例化(需要new一下)
    你检查你用的对象Recordset,Connection等,使用前一定先new一下,我认为这种东西用的多最好定义是不要new而是用的时候在new(分配内存)否则如果太多会出现错误
    定义Dim mrc As ADODB.Recordset
    用的时候在:
    set mrc=new ADODB.Recordset
      

  9.   

    在Dim mrc As ADODB.Recordset后面加一句
     set mrc=new adodb.recordset最好不要用Dim mrc as NEW ADODB.Recordset 这种方式来声明变量
    还有逻辑错误住楼上的已经说了
      

  10.   

    Set mrc = ExecuteSQL(txtSQL, MsgText)
    这句话的返回结果应该是一个nothing ,请检查这个函数里面执行过程是不有错误产生.
    在这句话执行后要先检查返回对象的状态再调用它。
    Set mrc = ExecuteSQL(txtSQL, MsgText)
    if not (mrc is nothing) then
        if mrc.state=1 then
            ....
            ....
        end if
    end if
      

  11.   

    Dim mrc As ADODB.Recordset
     txtSQL = "select distinc 类别名称 from 图书类别表"
     Set mrc = ExecuteSQL(txtSQL, MsgText)
     If mrc.EOF Then
    定义一个Recordset之后,必须要实例化,用Set mrc=new ADODB.Recordset或者Dim mrc As new ADODB.Recordset的方式也可以
      

  12.   

    函数ExecuteSQL我在参考资料上说针对数据库后台为SQL,本来我这个程序是用SQL,但是我考虑程序功能不大,所以改用Access,不过这个函数还没有去掉,把他放在模块里。请各位高手参考下面代码,并给兄弟提出意见,谢谢!
    Option Explicit
    Public UID As String
    Public PWD As String
    Dim db As ADODB.Connection
    Public Username  As StringPublic Sub EnterToTab(Keyasc As Integer)
        If Keyasc = 13 Then
            SendKeys "{TAB}"
          '  SendKeys "{Home}+{End}"
        End If
    End Sub
    Public Sub ShowErr()
     MsgBox "" & vbCrLf & vbCrLf & Err.Description, vbOKOnly + vbCritical, ""
    End Sub
    'Public Sub EnterToTab(Keyasc As Integer)
     '   If Keyasc = 13 Then
      '      SendKeys "{TAB}"
       ' End If
    'End SubPublic Function Testtxt(txt As String) As Boolean
        If Trim(txt) = "" Then
            Testtxt = False
        Else
            Testtxt = True
        End If
    End Function
    Public Function ConnectString() _
       As String
    'returns a DB ConnectString
      ConnectString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "" _
         & "\library.mdb" & ";Persist Security Info=False"
    End FunctionPublic Function ExecuteSQL(ByVal SQL _
       As String, MsgString As String) _
       As ADODB.Recordset
    'executes SQL and returns Recordset
       Dim cnn As ADODB.Connection
       Dim rst As ADODB.Recordset
       Dim sTokens() As String
       
       On Error GoTo ExecuteSQL_Error
       
       sTokens = Split(SQL)
       Set cnn = New ADODB.Connection
       '连接到指定的数据源类型
       cnn.Open ConnectString
       If InStr("INSERT,DELETE,UPDATE", _
          UCase$(sTokens(0))) Then
          cnn.Execute SQL
          MsgString = sTokens(0) & _
             " query successful"
       Else
          Set rst = New ADODB.Recordset
          rst.Open Trim$(SQL), cnn, _
             adOpenKeyset, _
             adLockOptimistic
          'rst.MoveLast     'get RecordCount
          Set ExecuteSQL = rst
          MsgString = "查询到" & rst.RecordCount & _
             " 条记录 "
       End If
    ExecuteSQL_Exit:
       Set rst = Nothing
       Set cnn = Nothing
       Exit Function
       
    ExecuteSQL_Error:
       MsgString = "查询错误: " & _
          Err.Description
       Resume ExecuteSQL_Exit
    End Function'Public Sub ConnectToDataBase()
    Rem 把数据存到数据库文件中,利用SQL语句的INSERT表达式,其中要引用ADO2.5/3.0library 库
    Rem On Error GoTo errhander:
    '打开数据库
    '引入ADO为了操作数据库
    'Dim adoCn As New ADODB.Connection
    'Dim adoRs As New ADODB.Recordset
    'adoCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "" _
         & "\library.mdb" & ";Persist Security Info=False"
    'adoCn.Open
    'End Sub上面代码除了这函数外,还有两个目的:1窗体上各个文本框直接用回车键实现控件焦点的转移,无须手工点击每一个文本框;2,Testtxt函数是为了实现自动判断是否为空。但是实际上这两个功能都没有实现,而在别的程序里实现。请指教。谢谢!
      

  13.   

    把函数ExecuteSQL中的On Error GoTo ExecuteSQL_Error语句先去掉,然后再执行一遍,这时程序会停在错误的地方,你就可以找到原因了.
    或者你按F8单步执行,也可以发现在那儿产生了错误。
    重点是看Set ExecuteSQL = rst这一句话有没有执行。
    ps:看你的程序,我知道你是初学者,很多代码都是照搬过来的,对你提一些建议,不要只抄不看,不想,还有基本知识要掌握,比如对象,实例的概念,程序调试的基本方法,程序错误的分析等。从简到繁一步一步来。
      

  14.   

    正确答案来了!!!If mrc.EOF Then          ‘ 妳这里已经eof了,请看(2)
        Do While Not mrc.EOF
            CboClass.AddItem Trim(mrc.Fields(1))
            mrc.MoveNext     ‘由于已经eof,无法movenext,当然出错!!!!!!!
        Loop
    。。
      

  15.   

    正确答案来了!!!If mrc.EOF Then          ‘ 妳这里已经eof了,请看(2)
        Do While Not mrc.EOF
            CboClass.AddItem Trim(mrc.Fields(1))
            mrc.MoveNext     ‘(2)由于已经eof,无法movenext,当然出错!!!!!!!
        Loop
    。。
      

  16.   

    executeSQL函数的功能是执行你传入的sql语句,如果是insert,update,delete就用连接对象执行这个操作,成功后返回成功消息给msgstring,不成功把错误消息返回给msgstring.
    如果是select则创建一个记录集对象,并把查询结果返回到记录集中,并当做executesql函数的返回值;如果成功则返回记录数给msgstring,如果错误则把错误消息返回给msgstring.
    这是MSDN上微软给的一个例子,功能很好,但你没有在函数执行后对其结果判断就直接当作其中一种情况的成功状态使用这是很不好的,至少你应该判断返回的msgstring的内容是什么,并用判断返回的对象的状态,再做相应的处理。
      

  17.   

    wamlaw(象草一样不能自拔):
        从楼主给出的错误提示上来说,不可能是mrc.movenext时产生的错误,因是那时是eof or bof为真,不能移动。还是如果eof为真,do while not mrc.eof 这个循环是不能执行的,更别说mrc.movenext这句话了.
        不过也说明楼主又一个写错的地方:).hehe,看来这里的新手太多了,VB简单,但也是要认真学过才能和好的.