我本来是VB+ACCESS,现在老师要求VB+SQL,所以我改成连接SQL,可是现在出现了问题,SQL连接正常,就是代码不知道哪里错了:有劳大家了!谢谢!
'Dim db As Database
'Dim rst As Recordset
Dim Rec As Integer
Dim StrFlag As String
Dim NumFlag As Boolean
'Dim db1 As Database
'Dim rst1 As Recordset
Dim CN   As New ADODB.Connection                '定义数据库的连接
Dim Rs   As New ADODB.Recordset
Dim Rs1  As New ADODB.Recordset
Private Sub cmdOkCancel_Click(Index As Integer)
Select Case Index
    Case 0
        If StrFlag = "修改" Then
            Rs.EditMode
            WriteIn
            Rs.Update
            Disp
            Picture2.Visible = False
            Picture1.Visible = True
            SetTxt (False)
        ElseIf StrFlag = "删除" Then
            Rs.Delete
            Rs.MovePrevious
            If Rs.BOF Then Rs.MoveNext
            Disp
            Picture2.Visible = False
            Picture1.Visible = True
        End If
    Case 1
        Disp
        Picture2.Visible = False
        Picture1.Visible = True
        SetTxt (False)
End Select
End SubPrivate Sub Command1_Click()
Unload Me
End SubPrivate Sub Form_Load()
CN.ConnectionString = "Provider=sqloledb;Data Source=GUOCHEN;Initial Catalog=book;User Id=sa;Password=;"
CN.OpenRs.CursorLocation = adUseClient
Rs.Open "select * from Book", CN, adOpenDynamic, adLockOptimistic
Rs.Filter = "图书编号=5"
'Set db = Workspaces(0).OpenDatabase("Database\Data.mdb", False)
'Set rst = db.OpenRecordset("Book", dbOpenTable)
'rst.Index = "图书编号"
Rs1.CursorLocation = adUseClient
Rs1.Open "select * from Type", CN, adOpenDynamic, adLockOptimistic
'Set db1 = Workspaces(0).OpenDatabase("Database\Data.mdb", False)
'Set rst1 = db1.OpenRecordset("Type", dbOpenTable)Rec = Rs.RecordCount
If Rec = 0 Then
    Toolbar1.Enabled = False
    SetTxt (False)
End If
SetTxt (False)
Rs.MoveFirst'到这句错误,说EOF或BOF有个为空,到底哪里错了?
Disp
TypeAdd
Picture1.Visible = True
Picture2.Visible = False
NumFlag = False
End Sub
Private Sub Disp()
txtBookNum = Rs.Fields("图书编号") & vbNullString
txtBookName = Rs.Fields("书名") & vbNullString
txtCost = Rs.Fields("价格") & Empty
txtBookChu = Rs.Fields("出版社") & vbNullString
Combo1.Text = Rs.Fields("类别") & vbNullString
End Sub
Private Sub Kong()
txtBookNum = ""
txtBookName = ""
txtbookcost = ""
txtBookChu = ""
Combo1.Text = ""
End Sub
Private Sub SetTxt(Bool As Boolean)
txtBookNum.Enabled = Bool
txtCost.Enabled = Bool
txtBookName.Enabled = Bool
txtBookChu.Enabled = Bool
Combo1.Enabled = Bool
End SubPrivate Sub Form_Unload(Cancel As Integer)
'rst.Close
'rst1.Close
'db1.Close
'db.Close
Rs.Close
Rs1.Close
CN.Close
End SubPrivate Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Button.Index
    Case 1
        Rs.MoveFirst
        Disp
    Case 2
        Rs.MovePrevious
        If Rs.BOF Then
            Rs.MoveNext
            Exit Sub
        End If
        Disp
    Case 3
        Rs.MoveNext
        If Rs.EOF Then
            Rs.MovePrevious
            Exit Sub
        End If
        Disp
    Case 4
        Rs.MoveLast
        Disp
    Case 10
        StrFlag = "修改"
        SetTxt (True)
        labFlag.Caption = "您确实要修改当前记录吗?"
        Picture1.Visible = False
        Picture2.Visible = True
    Case 11
        StrFlag = "删除"
        labFlag.Caption = "您确实要删除当前记录吗?"
        Picture1.Visible = False
        Picture2.Visible = True
    Case 12
        SearchNum.Show (1)
        If SearchFlag = True Then
            Rs.Find "图书编号=" & Trim(BookBianHao)
            If Not Rs.EOF Then
                MsgBox "没有此图书编号!", 0 + 48, "查找失败"
                Exit Sub
            End If
            Disp
            SearchFlag = False
        End If
End Select
End Sub
Private Sub WriteIn()
Rs.Fields("图书编号") = txtBookNum
Rs.Fields("书名") = txtBookName
Rs.Fields("价格") = Val(txtCost)
Rs.Fields("出版社") = txtBookChu
Rs.Fields("类别") = Combo1.Text
End Sub
Private Sub TypeAdd()
Rs1.MoveLast
Rs1.MoveFirst
For i = 1 To Rs1.RecordCount
    Combo1.AddItem Rs1.Fields("类别")
    Rs1.MoveNext
    If Rs1.EOF Then Exit Sub
Next
End SubPrivate Sub txtBookNum_Change()End Sub

解决方案 »

  1.   

    检查Rec = Rs.RecordCount这句话是否取得记录数
    如果rec=0,就不应该执行rs.movefirst
      

  2.   

    可以將你認為出錯的那部分代碼替換為下列代碼,看看功能是否要求如此
    if cbool(rs.state) then  '判斷紀錄集是否打開
        if not rs.eof then  '如果紀錄集紀錄為空
            rs.filter=""    '將篩選過濾條件去掉(也可以加在下一個篩選條件前)
            msgbox "不存在紀錄!",vbinfomation,me.caption
            exit sub
        else
            rs.movefirst
        end if 
    endif
      

  3.   

    TO: wei1027(猫1027) 
    REC=0
    然后跳到:
    Private Sub SetTxt(Bool As Boolean)
    txtBookNum.Enabled = Bool
    txtCost.Enabled = Bool
    txtBookName.Enabled = Bool
    txtBookChu.Enabled = Bool
    Combo1.Enabled = Bool
    End Sub
      

  4.   

    你在打开Access时用的DAO方式,而你换成SqlServer时用了ADO方式.这两种方式不同,对于DAo方式,你设置的记录集方式中的RecordCount是有效的,它能直接反映当前记录集中的记录个数;而对于Ado方法的有时候它不一定有效(至于原理也不是很清楚).因此在操作记录集前不要把全部希望寄托在RecordCount这个属性上.可以把你下面的代码做一下处理:
    原:
    SetTxt (False)
    Rs.MoveFirst'到这句错误,说EOF或BOF有个为空,到底哪里错了?
    Disp改后:
    SetTxt(False)
    if not (Rs.eof or Rs.bof) then '确定当前记录集中有记录
      rs.movefirst
    else
      '在里做你自己的特殊处理.
    end if 
    Disp
      

  5.   

    TO:AechoJohn(江江)
    谢谢你告诉我原理,还告诉我修改,现在这句不抱错,跳到DISP这里抱错,同样是“BOF或EOF有个为真,或当前记录以被删除”请问如何解决?谢谢!
    Private Sub Disp()
    txtBookNum = Rs.Fields("图书编号") & vbNullString'错误指像这里
    txtBookName = Rs.Fields("书名") & vbNullString
    txtCost = Rs.Fields("价格") & Empty
    txtBookChu = Rs.Fields("出版社") & vbNullString
    Combo1.Text = Rs.Fields("类别") & vbNullString
    End Sub
      

  6.   

    我是这样写的:
    SetTxt (False)
    If Not (Rs.EOF Or Rs.BOF) Then '确定当前记录集中有记录
      Rs.MoveFirst
    Else
      MsgBox "hello" '在里做你自己的特殊处理.
    End If
    Disp
    他就直接跳出MSGBOX,说明记录集没有记录,怎么可能呢?
      

  7.   

    "他就直接跳出MSGBOX,说明记录集没有记录,怎么可能呢?"说明你的记录集中没有指定的数据,如果认为有数据的话,你可以在If Not (Rs.EOF Or Rs.BOF) Then 这句上加上断点跟踪一下,并监视Rs这个对象是否有记录数据.If Not (Rs.EOF Or Rs.BOF) Then 这句应为 If Not (Rs.EOF And Rs.BOF) Then 
    还有在Disp,TypeAdd这些直接访问RS对象的地方,最好加上一些判断或错误处理.
      

  8.   

    TO:AechoJohn(江江)
    改成AND也一样,可是我数据库中有数据呀
    select * from Book
    ID          图书编号       书名                             价格                       类别         出版社                            借出日期                        是否借出 
    ----------- ---------- ------------------------------ ------------------------ ---------- ------------------------------ --------------------------- ---- 
    1           1000       c++语言程序设计                      30.0                     电子计算机      清华大学出版社                        NULL                        0
    2           1001       vb6程序设计                        32.0                     电子计算机      机械工业出版社                        NULL                        0
    3           1002       大学英语四级词汇                       18.0                     外语         清华大学出版社                        NULL                        0
    4           1004       足球理论                           14.0                     体育         北京体育大学出版社                      NULL                        0
    5           1005       哈哈后                            20.0                     电子计算机      哈哈                             NULL                        NULL(5 row(s) affected)
      

  9.   

    txtBookNum = Rs.Fields("图书编号") & vbNullString
    这个是ACCESS里的写发,改成SQL因该也是这样吧
    请问我记录集为什么没有记录?
      

  10.   

    你把数据库里的NULL手工改成一个值试试看。
      

  11.   

    我设断点调试了,现在因为得不到数据,所以执行txtBookNum = Rs.Fields("图书编号") & vbNullString抱错
      

  12.   

    大致看了一下,太长了
    Rs.Filter = "图书编号=5",当然没有记录,有图书编号=5的吗?好像有1005的
      

  13.   

    if Rs.eof and Rs.bof then
    '''''''''msgbox "记录集为空"
    else
        Disp
        TypeAdd
        Picture1.Visible = True
        Picture2.Visible = False
        NumFlag = False
    end if
    End Sub
      

  14.   

    SetTxt(False)
    if not (Rs.eof or Rs.bof) then '确定当前记录集中有记录
      rs.movefirst
    else
      '在里做你自己的特殊处理.
    end if 
    Disp
    只要执行了ELSE里面的东东,说明已经是没有数据集了,怎么还要执行DISP呢?只要是没有数据集,就不要再对RS进行什么查询/删除/更改的操作。RS.EOF或者RS.BOF的值为真,说明所查询出来的数据集是空的,指针已经移到了末尾或者是首位置!
      

  15.   

    RS.EOF或者RS.BOF的值为真,指针已经移到了末尾或者是首位置,不能说明所查询出来的数据集是空的。RS.EOF and RS.BOF才能说明所查询出来的数据集是空的。