部分源程序如下:
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中就不能显示了.
求大家.我怎么样才能实现这个功能.谢了.
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中就不能显示了.
求大家.我怎么样才能实现这个功能.谢了.
2.database()中
Set DataGrid1.DataSource = rs
rs.Close
a:
换成:On Error resume next '跳过错误继续执行
解决你的问题可以这样:
1、将 cn.open 放在form_load过程中
2、在 form_unload 中写入 set cn=nothing '释放对象
你的: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就什么也看不见了. 请问大家还有什么办法
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
操纵 rs对象就可以了,当rs与datagrid建立关联后一般不要执行
set datagrid.datasource=nothing(datagrid数据源被释放,当然什么都消失了),可以用rs.reqeury更新数据。