部分源程序如下:
      Dim sige As Boolean 'sign -N'标识 ,记号,V'签名
Dim symbol As Boolean 'symbol -N '符号,记号,象征
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset    //通用申明
              :
              : 
Private Sub Command2_Click()     //确定按钮.确定是添加还是修改数据.如果已经添加了一次,或修改了一次.再添加另外一次数据时,或再修改另外一个数据时,就会报错:对象打开,不充许操作.
'On Error GoTo a
 Dim sqlinsert As String
 Dim sql As String
  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path + "\db1.mdb" & ";Persist Security Info=False"
   //原因是我把cn.open打开了.但是不能关,一关的话.datagrid里面的值就显示不出来了.
 If sige = True Then
  sqlinsert = "insert into cz(配件名称,车型,库存数,单位,成本价,仓位,入库日期,操作员)values('" & Trim(Text1.Text) & "','" & Trim(Text4.Text) & "','" & Trim(Text5.Text) & "','" & Trim(Text6.Text) & "','" & Trim(Text2.Text) & "','" & Trim(Text3.Text) & "','" & Date & "','" & Combo1.Text & "')"
 rs.Open sqlinsert, cn, adOpenDynamic, adLockBatchOptimistic
 Call database
 sige = False
 End If
 If symbol = True Then
  If Text7.Text = "" Then
     MsgBox "请选择要修改的配件", vbInformation, "提醒"
     Else
   sqlinsert = "update cz set 配件名称='" & Trim(Text1.Text) & "',车型='" & Trim(Text4.Text) & "',仓位='" & Trim(Text3.Text) & "',库存数='" & Trim(Text5.Text) & "',单位='" & Trim(Text6.Text) & "',成本价='" & Trim(Text2.Text) & "' where 配件编号=" & Text7.Text & ""
   rs.Open sqlinsert, cn, adOpenDynamic, adLockBatchOptimistic
 Call database           //调用database
 symbol = False
  End If
 End If
'a:
End SubPrivate Sub database()
 cn.CursorLocation = adUseClient
 sql = "select * from cz"
 rs.Open sql, cn, adOpenDynamic, adLockBatchOptimistic
 Set DataGrid1.DataSource = rs        //不能关cn.close.  一关的话datagrid1就不能显示值了.
 Command2.Enabled = False
 Text7.Enabled = False
 Text1.Enabled = False
 Text4.Enabled = False
 Text5.Enabled = False
 Text6.Enabled = False
 Text2.Enabled = False
 Text3.Enabled = False
End Sub注:程序语法上没有什么错误,如果只修改一条.或只修改一条就没什么错误了.command2是"确定"按钮.确定是添加还是修改数据.如果已经添加了一次,或修改了一次.再添加另外一次数据时,或再修改另外一个数据时.就会报错:对象打开,不充许操作.换一句话来说.我就想实现.添加一条数据.点确定.再添加一条数据.再点确定.如此类推........
            或.修改一条数据,点确定.再修改一条数据,再点确定.如此类推........
但是不行,我第一次运行时,功能实行.但我没有关掉cn.close;
               因为关掉cn.close后.datagrid1中就不能显示了.
   求大家.我怎么样才能实现这个功能.谢了.

解决方案 »

  1.   

    1.执行INSERT,DELETE,UPDATE语句用cn.Execute sqlinsert
    2.database()中
      Set DataGrid1.DataSource = rs 
      rs.Close
      

  2.   

    cn.Open ......可以放到Form_lood()中
      

  3.   

    把:On Error GoTo a
          a:
    换成:On Error resume next   '跳过错误继续执行
      

  4.   

    先不讨论你所说的问题,一般来说,数据表频繁打开就是一个不好的习惯,严重影响性能。
    解决你的问题可以这样:
    1、将 cn.open 放在form_load过程中
    2、在 form_unload 中写入 set cn=nothing '释放对象
      

  5.   

    因为ADO是在线式的.所以你不能关闭连接.
      

  6.   

    我知道是在线式的.但请问怎么样解决呀!我想了半天,只有两种选择,一种是让模块,修改一条数据,或添加一条数据.就模块关闭.重新再来修改或添加.另一种是关闭rs.close; cn.close; 哪样的话datagrid就什么东西都没有了.数据修改了或添加了.但是不能显示.上面的办法我都试过.TO: lrest() 
    你的:1、将 cn.open 放在form_load过程中
        2、在 form_unload 中写入 set cn=nothing '释放对象
      我的:  cn.open已经在form_load中已经打开.
          2不知道是什么意思TO: vbman2003(家人) 
    你的:2.database()中
        Set DataGrid1.DataSource = rs 
         rs.Close我的:2.不能关闭rs.close.哪样的话.datagrid就什么也看不见了. 请问大家还有什么办法
      

  7.   

    Public Function ExecuteSQL(ByVal SQL _
       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.CursorLocation = adUseClient
       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
      Debug.Print Msgstring
       Resume ExecuteSQL_Exit
    End Function
    用这个函数.
    可以保证资源释放.
    使用时,
    set rst=executesql(mySql)
    msgbox rst.recordcount用这个函数,可以将Cnn的连接交给你自已的Rst.
    然后这个Rst你如何控制就看你自已想法了.
    在释放这个Rst的时候,if rst.state=adstateopen then rst.close
                           set rst=nothing
      

  8.   

    既然已经在 form_load 打开了 cn,在command_click就不必重复打开,只须
    操纵 rs对象就可以了,当rs与datagrid建立关联后一般不要执行 
    set datagrid.datasource=nothing(datagrid数据源被释放,当然什么都消失了),可以用rs.reqeury更新数据。