Private Sub cmdOK_Click()
    '用来存放SQL语句
    Dim txtSQL As String
    '用来存放记录集对象
'    Dim mrc As ADODB.Recordset
--------这里改为-----------------------1
    Dim mrc As New ADODB.Recordset
    '用来存放返回信息
    Dim MsgText As String
    UserName = ""
    '判断输入用户名是否为空
    If Trim(txtUserName.Text = "") Then
        MsgBox "没有这个用户,请重新输入用户名!", vbOKOnly + vbExclamation, "警告"
        txtUserName.SetFocus
    Else
        '查询指定用户名的记录
        txtSQL = "select * from user where 用户名='" & txtUserName.Text & "'"
        '执行查询语句
        Set mrc = ExecuteSQL(txtSQL, MsgText)
        If mrc.EOF = True Then
            MsgBox "没有这个用户,请重新输入用户名!", vbOKOnly + vbExclamation, "警告"
            txtUserName.SetFocus
        Else
            '判断输入密码是否正确
            If Trim(mrc.Fields(1)) = Trim(txtPassword.Text) Then
                OK = True
                mrc.Close
                Me.Hide
                UserName = Trim(txtUserName.Text)
            Else
                MsgBox "输入密码不正确,请重新输入!", vbOKOnly + vbExclamation, "警告"
                txtPassword.SetFocus
                txtPassword.Text = ""
            End If
        End If
    End If
    '记载输入密码次数
    miCount = miCount + 1
    If miCount = 3 Then
        Me.Hide
    End If
    Exit Sub
End Sub

解决方案 »

  1.   

    按你的说法,我改成为
    Dim mrc As New ADODB.Recordset
    运行,出现:实时错误‘3704’
    Operation is not allowed when the object is closed大家帮帮忙啊!
      

  2.   

    提点意见:
    1。能不能把sql的实现方在函数中,看上去太乱了。
    2。你的程序我没有仔细看,但从报的错误看,估计是数据库的连接有误!!
    3。另外一个低级错误是:
        mrc.eof是判断记录是否超底,它本身是一个布尔值,不用写           mrc.Eof=true/flase,用mrc.eof或Not mrc.eof就可以了。
      

  3.   

    估计是set Connection和Recordset对象为nothing后数据库已经关闭吧。
    建议要不把查询过程写到cmdOK_Click事件里,要不把查询过程做的封装性再强一些,自己定义返回的数据结构。
      

  4.   

    其一:你的connectionstring 的值是什么,没有相应的值,这会导致打不开数据库。
    其二:你没有定义以什么方式打开表。这将导致表的查询方式只能向后查询而不能用MoveFirst等方式。
    其三:建议你打开Cnn时采用
    with cnn
      .connectiontstring = 连接字符串
      .connecttimeout = 45
      .open
    end with
    然后判断cnn是否已经正常打开了。如果不能打开,请打cnn的相应选项加上,直到能打开数据库为止。
    其四:
      If mrc.EOF Then
         msgbox"Can't open the table"
         exit function 
      end if
    mrc.EOF本身就是布尔型值,如果不能打开表,你可以进行相应的处理。
      

  5.   

    能不能告诉我你的email。
    [email protected]
      

  6.   

    错误都是指向“If mrc.EOF = True Then”,和“If mrc.EOF = False Then”
    这是你的数据库表中没有记录的原因: 干脆给你一个实例算了:
    比较多要仔细看看才行:
    im connstr As String
    Dim i, j, X, y As Integer
    Dim re As New ADODB.Recordset
    Dim re1 As New ADODB.Recordset
    Dim re2 As New ADODB.Recordset
    Dim db As New ADODB.Connection
    connstr = "provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=zldb;Data Source=BUSINESS;Connect Timeout=30"
    '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    '%This Business is SQL Server name  %
    '%This zldb is a dababase name      %
    '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    If db.State = 0 Then
    db.Open connstr
    re.CursorLocation = adUseClient
    re.Open "select* from system", connstr, adOpenDynamic, adLockOptimistic
    re1.CursorLocation = adUseClient
    re1.Open "select* from ruzhudj order by id ", connstr, adOpenDynamic, adLockOptimistic
    re2.CursorLocation = adUseClient
    re2.Open "select* from bill_night order by id ", connstr, adOpenDynamic, adLockOptimistic
    End If
    '**************************************************
    Dim sign As String
    Dim X, y, z As Integer
    Text1.Text = 1
    Text2.Text = ""
    Text3.Text = ""
    Dim dd As String
    re.MoveFirst
    dd = CDate(Trim(re.Fields("datime").Value))
    Text2.Text = dd
    d1 = DateAdd("d", CInt(Text1), dd)
    Text3.Text = d1
    sign = MsgBox("È·ÈÏÏëÒª¹ý" & Trim(re.Fields("datime").Value) & "µÄ·¿ÕÊÂð£¿", vbYesNo + vbQuestion, "·¿×â¹ý×â")
    If sign = vbYes Then
    re.MoveFirst
    re.Fields("datime").Value = d1
    re.Update
    re.MoveNext
    '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
    i = 0
    j = 0
    If re1.RecordCount <> 0 Then
    re1.MoveFirst
    For i = 0 To re1.RecordCount - 1
    If (Trim(re1.Fields("status1").Value) <> 1) And (Trim(re1.Fields("status2").Value) <> 1) And (Trim(re1.Fields("status3").Value) <> 1) Then
    For j = 1 To 3
    With re2
    '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    If j = 1 Then
    .AddNew
    .Fields("order_no").Value = j
    .Fields("room_no").Value = Trim(re1.Fields("room_no").Value)
    .Fields("write_t").Value = Date 'Trim(re1.Fields("arrivedate").Value)
    .Fields("item").Value = dd & "&Eacute;&cent;&iquest;&Iacute;·&iquest;×&acirc;"
    .Fields("jf").Value = Trim(re1.Fields("realprice").Value)
    .Fields("jf_leiji").Value = CSng(Trim(re1.Fields("realprice").Value))
    .Fields("df").Value = ""
    .Fields("oper").Value = Trim(fmlogin.Label3.Caption)
    .Fields("meno").Value = "1" & "-" & Trim(re1.Fields("room_no").Value) & " " & Trim(re1.Fields("name").Value)
    re2.Update
    End If
    '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    If j = 2 Then
    If Trim(re1.Fields("servicecharge").Value) = "&frac14;&Oacute;&Ecirc;&Otilde;" Then
    .AddNew
    .Fields("order_no").Value = j
    .Fields("room_no").Value = Trim(re1.Fields("room_no").Value)
    .Fields("write_t").Value = Date 'Trim(re1.Fields("arrivedate").Value)
    .Fields("item").Value = dd & "&Eacute;&cent;&iquest;&Iacute;·&thorn;&Icirc;&ntilde;·&Ntilde;"
    .Fields("jf").Value = (CSng(Trim(re1.Fields("roomprice").Value)) * 10) / 100
    .Fields("jf_leiji").Value = Trim(re1.Fields("roomprice").Value * 10) / 100
    .Fields("df").Value = ""
    .Fields("oper").Value = Trim(fmlogin.Label3.Caption)
    .Fields("meno").Value = "1" & "-" & Trim(re1.Fields("room_no").Value) & " " & Trim(re1.Fields("name").Value)
    re2.Update
    End If
    End If
    '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    If j = 3 Then
    .AddNew
    If Trim(re1.Fields("servicecharge").Value) = "&Atilde;&acirc;&Ecirc;&Otilde;" Then
    .Fields("order_no").Value = j - 1
    Else
    .Fields("order_no").Value = j
    End If
    .Fields("room_no").Value = Trim(re1.Fields("room_no").Value)
    .Fields("write_t").Value = Date
    .Fields("item").Value = dd & "±&pound;&Iuml;&Otilde;·&Ntilde;"
    .Fields("jf").Value = "5"
    .Fields("jf_leiji").Value = "5"
    .Fields("df").Value = ""
    .Fields("oper").Value = Trim(fmlogin.Label3.Caption)
    .Fields("meno").Value = "1" & "-" & Trim(re1.Fields("room_no").Value) & " " & Trim(re1.Fields("name").Value)
    re2.UpdateEnd If
    End With
    Next j
    End If
    re1.MoveNext
    Next i
    End If'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Else
    Exit Sub
    End If
    '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'If MaskEdBox2.Text = "0000-00-00" Then
     'dd = MsgBox("&Ccedil;&euml;&Egrave;·&Egrave;&Iuml;&Ecirc;&Ccedil;·&ntilde;&ETH;è&Ograve;&ordf;&cedil;ü&cedil;&Auml;&acute;&Euml;&Egrave;&Otilde;&AElig;&Uacute;", vbYesNo + vbQuestion, "&Igrave;á&Ecirc;&frac34;")
     'If dd = vbYes Then
     'MaskEdBox2.SetFocus
     'Exit Sub
     'End If
     'If dd = vbNo Then
     'Exit Sub
     'End If
     'End If
    'If Text3.Text = "" Then
    'Exit Sub
    'End If
    'MaskEdBox2.Format = "yyyy-mm-dd"
    'd1 = CDate(MaskEdBox2.Text)
    'd2 = DateAdd("d", CInt(Text3), d1)
    'MaskEdBox3.Text = d2
    tmrTimer1.Enabled = True
    PlaySound App.Path & "\the microsoft sound.wav"
    End SubPrivate Sub Label6_MouseMove(Button As Integer, Shift As Integer, X As Single, y As Single)Picture6.BackColor = &HFFFF00
    Label6.BackColor = &HFFFF00End Sub
    '*************************************************************
      

  7.   

    我觉得是这行: '执行查询语句
    Set mrc = ExecuteSQL(txtSQL, MsgText)
        If mrc.EOF = True Then   '××××有问题
            MsgBox "没有这个用户,请重新输入用户名!", vbOKOnly + vbExclamation, "警告"
                
    很久没有写vb代码了,记得是这样的,如果ExecuteSQL没有返回。mrc是空的,EOF不可用用IsEmpty()判断一下,你试试吧
      

  8.   

    我也和你一样,也买了和你同样的书,在做事。我和你遇到的问题是一样的,问题是你出在
    1.你连接数据库时可能出错了,检查一下connectstring这句语句,是否写正确,或者把他该成connectstring ="file name=你保存的DNS的路径".注意的是在odbc源中选择dns文件哦!
    2.你的sql语句有没有写正确,查看方法是把你的语句放到sql server中的查询分析器中去运行一下,看看有没有什么问题!有问题就改一下!就这样了,又问题就与我联系,我的 QQ是57766476
      

  9.   

    Set mrc = ExecuteSQL(txtSQL, MsgText)错误处在这,
    你不能用函数返回一个记录集,而且在Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset中你并没有将ExecuteSQL初始化,我不明白你怎么就调试的过去?还有Set mrc = ExecuteSQL(txtSQL, MsgText)你也应该用
    Set mrc = ExecuteSQL(txtSQL, MsgText).clone
    建议你最好不要用函数返回记录集
      

  10.   

    你的cnn 定义的是函数内变量,当退出该函数时cnn将关闭你的记录集也就没有用了,用Set mrc = ExecuteSQL(txtSQL, MsgText)付值
    就会没有东西建议不要用函数返回记录集