在窗体中添加了类模块里面有函数
      Public Function ExecuteSQL(ByVal sql As String, rst As ADODB.Recordset, Optional enablewrite As Boolean = True) As Boolean
     Dim con As ADODB.Connection
     On Error GoTo execute_Error
     Set con = New ADODB.Connection
     con.Open "filedsn=zhiwushezhi.dsn;uid=sa;pwd=sa"
     Set rst = New ADODB.Recordset
     If enablewrite Then
       rst.Open Trim(sql), con, adOpenStatic, adLockOptimistic
       Else
       rst.Open Trim(sql), con, adOpenStatic, adLockReadOnly
       End If
       ExecuteSQL = True
       con.Close
       Exit Function
execute_Error:
       ExecuteSQL = False
       Exit Function
       
End FunctionPublic Function viewdata(ByVal txtsql As String, DataGrid1 As DataGrid) As Integer    Dim rstdata As ADODB.Recordset
    Set rstdata = New ADODB.Recordset
    
    Dim result As String
    result = ExecuteSQL(txtsql, rstdata, False)
     If rstdata.RecordCount <> 0 Then
        Set DataGrid1.DataSource = rstdata
        viewdata = rstdata.RecordCount
        Else
         MsgBox "还没有数据!", vbOKOnly + vbExclamation, "警告"
         viewdata = 0
         End If
End Function
运行显示If rstdata.RecordCount <> 0 Then这行有错误“对象关闭时,不允许操作”
是因为连接数据库没有成功吗,怎么做啊?
请高手帮帮忙啊!非常感谢!!

解决方案 »

  1.   

    一步步测试
    con.Open "filedsn=zhiwushezhi.dsn;uid=sa;pwd=sa" 
    msgbox con.state先看看有没有连接上数据库
      

  2.   

    msgbox con.state 
    这行是什么意思啊?
    一条条运行了,就显示那行错误If rstdata.RecordCount <> 0 Then
      

  3.   

    你先判断result =true吗,如果是则正确,如果不是则If rstdata.RecordCount <> 0 Then会抱错的肯定。
      

  4.   

    判断result =true
    是什么意思啊,不太明白啊
      

  5.   

    http://www.cnblogs.com/tongnaifu/archive/2008/10/21/1316141.html
      

  6.   


    就是在你的代码:
    con.Open "filedsn=zhiwushezhi.dsn;uid=sa;pwd=sa"
    下面加一句: 
    msgbox con.state 
    如果正常连接上了数据库,con.state=1
      

  7.   

    试试改con.close 为 set con=nothing
      

  8.   

    一样的出现那个错误!
    如果把相关的recordset内容去掉,其他的功能还是可以实现。就是说datagrid控件中不能显示执行SQL语句得到的recordset的内容
      

  9.   

    我逐条语句运行,为什么运行到这一行 rst.Open Trim(sql), con, adOpenStatic, adLockOptimistic 就会直接跳到这行ExecuteSQL = False 
    是不是表示执行SQL语句失败?为什么会这样?
      

  10.   

    先不要关闭链接con.Close  试试
    再最后 关掉它并释放链接对象
      

  11.   

    Public Function viewdata(ByVal txtsql As String, DataGrid1 As DataGrid) As Integer     Dim rstdata As ADODB.Recordset 
        Set rstdata = New ADODB.Recordset 
        
        Dim result As String 
        result = ExecuteSQL(txtsql, rstdata, False) 
        If result <> 0 Then 
            Set DataGrid1.DataSource = rstdata 
            viewdata = rstdata.RecordCount 
            Else 
            MsgBox "还没有数据!", vbOKOnly + vbExclamation, "警告" 
            viewdata = 0 
            End If 
    End Function 
      

  12.   

    把On Error GoTo execute_Error 先引上,看错误在哪里
    可能sql有问题
      

  13.   

            result = ExecuteSQL(txtsql, rstdata, False) 
        If enablewrite Then '这里是false,当然RST就没打开
          rst.Open Trim(sql), con, adOpenStatic, adLockOptimistic 
          Else 
          rst.Open Trim(sql), con, adOpenStatic, adLockReadOnly 
        End If 
      

  14.   

    这样的吗?
    不是吧。result是boolean型。类型不匹配啊和0
      

  15.   

    把On Error GoTo execute_Error 先引上,这是什么意思啊?
      

  16.   

    即使把false改成true也是一样的错误
      

  17.   


    'On Error GoTo execute_Error就这个意思,这样才能看出错在哪
      

  18.   


    我没看仔细,不过你的错误太多    Dim result As String 
        result = ExecuteSQL(txtsql, rstdata, False) 
        If rstdata.RecordCount <> 0 Then 
     
    改成    Dim result As boolean
        result = ExecuteSQL(txtsql, rstdata, False) 
        If result Then 
      

  19.   

    书上是定义的result是字符型的
    你说把那个'On Error GoTo execute_Error 
    那后面的判断读写方式的语句就都有错,就不需要写了。我试过
      

  20.   

    呵呵,,,照你说的把类型改了之后。if result then
    能够运行,但是结果不对。
    我的表里面明明有数据,但它出现对话框,警告,还没有数据。就是说datagrid控件里还是不能显示执行SQL语句的记录集
      

  21.   

        去掉con.Close,     result = ExecuteSQL(txtsql, rstdata, TRUE)    If rstdata.RecordCount <> 0 Then 
            Set DataGrid1.DataSource = rstdata 
            viewdata = rstdata.RecordCount 
        Else 
            MsgBox "还没有数据!", vbOKOnly + vbExclamation, "警告" 
            viewdata = 0 
        End If 
        rstdata.close
      

  22.   

    意思是 'On Error GoTo execute_Error  注释掉这句话看看错误是不是在ExecuteSQL这个函数中出现而且 
    Public Function viewdata(ByVal txtsql As String, DataGrid1 As DataGrid) As Integer     Dim rstdata As ADODB.Recordset 
        Set rstdata = New ADODB.Recordset 
        
        Dim result As String     '字符型
        result = ExecuteSQL(txtsql, rstdata, False)  ’布尔型    If rstdata.RecordCount <> 0 Then    ’rstdata 中没有任何数据集,而是个空集
            Set DataGrid1.DataSource = rstdata 
            viewdata = rstdata.RecordCount 
            Else 
            MsgBox "还没有数据!", vbOKOnly + vbExclamation, "警告" 
            viewdata = 0 
            End If 
    End Function 
      

  23.   

    治标不治本,那个FALSE 要改成TRUE才会执行,而且上面的连接状态不能关掉了“con.Close”
      

  24.   

    这样改还是第一个错误,对象关闭时,不允许操作。
    只要是改成这样的rstdata.RecordCount <> 0就是涉及到rstdata.recordcount就会出现那个错误!不明白啊!
      

  25.   

    If rstdata.RecordCount <> 0 Then    ’rstdata 中没有任何数据集,而是个空集 
      

  26.   

    为什么rstdata是个空集呢?不管result是什么类型,都是一样的,数据不能显示出来。
      

  27.   

    Public Function viewdata(ByVal txtsql As String, DataGrid1 As DataGrid) As Integer     Dim rstdata As ADODB.Recordset 
        Set rstdata = New ADODB.Recordset 
        
        Dim result As String 
        result = ExecuteSQL(txtsql, rstdata, False) 
        If rstdata.RecordCount <> 0 Then  '到这里rstdata根本就没打开,也没付对象值,有数据就见鬼了
            Set DataGrid1.DataSource = rstdata 
            viewdata = rstdata.RecordCount 
            Else 
            MsgBox "还没有数据!", vbOKOnly + vbExclamation, "警告" 
            viewdata = 0 
            End If 
    End Function 
      

  28.   

    是问为什么没有打开啊?
    是执行ExecuteSQL(txtsql, rstdata, False) 有错吗?
    怎么改啊?
      

  29.   

     首先我猜测你这个程序是复制粘贴上或者是直接修改别人的程序
    告诉你原因吧ExecuteSQL(txtsql, rstdata, False) 我猜测 你执行这个函数应该是返回一个 数据集
    然后执行
     rstdata= ExecuteSQL(txtsql, rstdata, False) 这个时候 你才能有数据集你还是应该好好想想你写的函数到底要用来做什么吧!!!
    到底想怎么实现
      

  30.   

    我的函数就是如果SQL语句执行成功,返回值是true。否则返回false
    就是这样啊,执行成功的话,结果存储在与形参数据集rst对应的实参rstdata数据集内啊。
    有什么问题呢
    虽然一样可以把ExecuteSQL函数写成是返回数据集就是rstdata= ExecuteSQL(txtsql, rstdata, False) 
    但是我那样写也没什么错吧。应该。
    代码是书上的。
      

  31.   


    rst是全局变量???
    那你就将
      If rstdata.RecordCount <> 0 Then 
    更改为:  If rst.RecordCount <> 0 Then 
      

  32.   

    debug.print 你的SQL语句,然后放入查询分析器中去执行...
      

  33.   

    rstdata是实参拉。怎么能改
    试了,改了也不对。
      

  34.   


    'Set rst = New ADODB.Recordset 
    'con.Close 
    '你如果不把上面两句注释掉,能得到数据才怪了
    '还有你ExecuteSQL明明返回的是bol类型,接收的result却是string类型,而且result根本没用到
      

  35.   


    '参照你上面的代码写的,你对照着看吧
    Option ExplicitPrivate Sub AA()
        Dim rstTemp As New ADODB.Recordset
        Dim bolResult As Boolean
        bolResult = BB("select * from sum1", rstTemp, False)
        If bolResult Then
            Dim i As Integer
            i = rstTemp.RecordCount
        End If
    End SubPrivate Function BB(ByVal sql As String, ByVal rst As ADODB.Recordset, ByVal bolTemp As Boolean)
        Dim conn As ADODB.Connection
        On Error GoTo execute_Error
        Set conn = New ADODB.Connection
        If conn.State = 1 Then conn.Close
        conn.IsolationLevel = adXactCursorStability
        conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
        & "Persist Security Info=False;" _
        & "Data Source= E:\1.mdb "
        conn.Open
        'Set rst = New ADODB.Recordset   你在这里再一次实例化recordset,已经不是你原来的rstdata了
        rst.Open Trim(sql), conn, adOpenStatic, adLockBatchOptimistic
        BB = True
        'conn.Close   关闭了链接,你的recordset也会关闭
        Exit Function
    execute_Error:
        BB = False
    End FunctionPrivate Sub Form_Load()
        AA
    End Sub
      

  36.   

    问题关键是它执行完这行if语句 If enablewrite Then 
          rst.Open Trim(sql), con, adOpenStatic, adLockOptimistic 
          Else 
          rst.Open Trim(sql), con, adOpenStatic, adLockReadOnly 
          End If 
    之后不运行ExecuteSQL = True 
    而是转向运行ExecuteSQL =false,也就是execute_Error: 
    出错处理。是否说明执行SQL语句没成功啊?
      

  37.   

    或许你的SQL语句有问题:
    debug.print 你的SQL语句,然后放入查询分析器中去执行...
      

  38.   

    确认con.state=1吗?
    如果con打开了,'Set rst = New ADODB.Recordset  'con.Close 
    这两句也注释掉了,设断点单步走看错在哪里,错误类型
      

  39.   

    看看你的sql 语句是不是正确
      

  40.   

    走到ExecuteSQL =false的时候看一下错误类型。err.Description 
      

  41.   

    走到这里没有错啊,继续运行的时候到 If rstdata.RecordCount <> 0 Then就出错!对像关闭时,不允许操作
      

  42.   

    没错会走到ExecuteSQL =false,你单步走停在ExecuteSQL =false,在下面的“立即”对话框中输入?err.Description 
      

  43.   

    设置断点在ExecuteSQL = True 
    运行  rst.Open Trim(sql), con, adOpenStatic, adLockReadOnly 出错。错误是microsoft ODBC SQL Server Driver 【SQL Server】第一行:nationid附近有语法错误
    我的SQL语句是: txtsql = "select nationid as 民族编号,dutyname as 民族名称 from tbnation orderby nationid"
      

  44.   

    呵呵,改了,没有错。但是没有结果出来,就是recordset还是没有记录
      

  45.   

    那recordset.recordcout是多少?让你注释掉的两行你有没有注释掉
      

  46.   

    注释掉了啊。
    recordcount的值,有两个对,一个错的。
    我刚刚改了。可以recordcount值都是对的。但就是没有数据
      

  47.   

    什么是 两个对,一个错的,没看明白
    你断点设在If rstdata.RecordCount <> 0 Then 
    看看recordcount是多少
      

  48.   

    你断点设在If rstdata.RecordCount <> 0 Then 
    程序运行到这里会停在这里,然后你再下面的“立即”对话框中输入?rstdata.RecordCount 
      

  49.   

    但是下面一行Set DataGrid1.DataSource = rstdata
    DataGrid1.DataSource=nothing
      

  50.   

    参考 42楼
     
    但 他函数声明有问题
    Private Function BB(ByVal sql As String, ByVal rst As ADODB.Recordset, ByVal bolTemp As Boolean)
    改为 
    Private Function BB(ByVal sql As String, ByRef rst As ADODB.Recordset, ByVal bolTemp As Boolean)
      

  51.   

    加一句con.CursorLocation = adUseClient
    datagrid比较娇贵
      

  52.   

    加在con.Open "filedsn=zhiwushezhi.dsn;uid=sa;pwd=sa" 前面