<不知道大家碰到过类似的问题没有??>数据库被开,却不能关,一关的话datagrid就不能显示里面的值.但是不关的话,执行第二次运行的时候就会报

abcdefu520 2004-08-31 05:34:36
部分源程序如下:


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 Sub

Private 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中就不能显示了.
求大家.我怎么样才能实现这个功能.谢了.
...全文
103 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yelang771 2004-09-02
  • 打赏
  • 举报
回复
up
wumylove1234 2004-09-02
  • 打赏
  • 举报
回复
我没有使用这个函数



不用这个函数哪能不能释放rs了

???????????????????????我哪有说不能释放??????????????

我只不过意思是说写那个函数,对象之间的关系就很清晰了!

打开返回记录集,然后把连接交给返回的记录集.

你得到返回的记录集,再如何操作就是你自已的问题了.
abcdefu520 2004-09-01
  • 打赏
  • 举报
回复
我知道是在线式的.但请问怎么样解决呀!

我想了半天,只有两种选择,一种是让模块,修改一条数据,或添加一条数据.就模块关闭.重新再来修改或添加.

另一种是关闭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就什么也看不见了.

请问大家还有什么办法
lrest 2004-09-01
  • 打赏
  • 举报
回复
既然已经在 form_load 打开了 cn,在command_click就不必重复打开,只须
操纵 rs对象就可以了,当rs与datagrid建立关联后一般不要执行
set datagrid.datasource=nothing(datagrid数据源被释放,当然什么都消失了),可以用rs.reqeury更新数据。
abcdefu520 2004-09-01
  • 打赏
  • 举报
回复
我没有使用这个函数



不用这个函数哪能不能释放rs了
wumylove1234 2004-09-01
  • 打赏
  • 举报
回复
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
wumylove1234 2004-09-01
  • 打赏
  • 举报
回复
因为ADO是在线式的.所以你不能关闭连接.
lrest 2004-08-31
  • 打赏
  • 举报
回复
先不讨论你所说的问题,一般来说,数据表频繁打开就是一个不好的习惯,严重影响性能。
解决你的问题可以这样:
1、将 cn.open 放在form_load过程中
2、在 form_unload 中写入 set cn=nothing '释放对象
helanshan 2004-08-31
  • 打赏
  • 举报
回复
把:On Error GoTo a
a:
换成:On Error resume next '跳过错误继续执行
vbman2003 2004-08-31
  • 打赏
  • 举报
回复
cn.Open ......可以放到Form_lood()中
vbman2003 2004-08-31
  • 打赏
  • 举报
回复
1.执行INSERT,DELETE,UPDATE语句用cn.Execute sqlinsert
2.database()中
Set DataGrid1.DataSource = rs
rs.Close

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧