Private AdoRs1 As ADODB.Recordset
Private AdoRs2 As New ADODB.Recordset
以上是Form级的变量。以上程序在每一台机器上测试结果一定是相同的。有兴趣者可把以上程序拷贝到一个新的Form中,并在Form中增加一个按钮 CmdTest即可
Private AdoRs2 As New ADODB.Recordset
以上是Form级的变量。以上程序在每一台机器上测试结果一定是相同的。有兴趣者可把以上程序拷贝到一个新的Form中,并在Form中增加一个按钮 CmdTest即可
解决方案 »
- SQL SERVER查询分析器中执行SQL文件的命令是什么
- http://sqlzoo.cn上的答案在哪裡找啊。
- 如何把表1中 text2的内容 按table1.id=table2.tableid 的规则写进 table2的text4中去
- sql 怎么从两个表中筛选出客户最后一次购买记录?
- 如何自动生成拼音缩写?
- ERP系统与CRM客户系统客户档案实现双向同步
- 请问如何在QA中执行带输出参数的存储过程?
- 请教,字符串提取问题!
- 能不能在两个savepoint之间rollback?请不吝赐教!
- DELPHI5中连结SQL Server2000数据库出错,请大家帮忙!谢谢!
- 大家请帮忙看看,这条语句怎么回事嘛!!!!!!!!!!!!!!!!!
- 分组,对某列求最大/最小值...问题是,同时要取得对应该最大/最小值对应行的另一列,该最大/最小值出现的时间.
楼主去看看COM本质论之类的书就会明白的这其实是一个对象生命周期的问题。
ADO.Recordset对象在FORM级 new一个以后实际上建立了全局对象
调用了类厂的AddRef(),将此对象与Form容器相关联,Recordset不能单独存在,它依靠connection实际上也使得connection对象引用计数。
按照规范,全局对象的释放必须在它的容器的析构函数中进行,而不是在局部过程中进行。也可以换句话说,在VB中,有些东西你控制不了,VB掩盖了太多的细节和底层
谢谢你的指点。可能是我的意思没有表达清楚,我现在改写了测试程序。请大家将下列程序拷贝到一个Form中,运行一下。
我的疑惑就是,为什么对ADODB.RecordSet声明的两种不同写法,效果却不一样,哪一种更规范,更有效。Private Sub Command1_Click()
'这是一个测试程序
Dim AdoRs1 As ADODB.Recordset
Dim AdoRs2 As New ADODB.Recordset
On Error GoTo ErrTest
'Step1: 新建一个ADODB.RecordSet实例; 注意 AdoRs2不需要新建
Set AdoRs1 = New ADODB.Recordset
'Step2: 执行某些操作
MsgBox "AdoRs1字段个数 :" & AdoRs1.Fields.Count
MsgBox "AdoRs2字段个数 :" & AdoRs2.Fields.Count
'Step3: 释放RecordSet
If AdoRs1.State = adStateOpen Then
AdoRs1.Close
End If
Set AdoRs1 = Nothing
If AdoRs2.State = adStateOpen Then
AdoRs2.Close
End If
Set AdoRs2 = Nothing
'Step4: 测试被释放后的RecordSet (注意测试的顺序)
If AdoRs1 Is Nothing Then
MsgBox "AdoRs1 被完全释放 !"
Else
MsgBox "AdoRs1 没有被完全释放 !"
End If
If AdoRs2 Is Nothing Then
MsgBox "AdoRs2 被完全释放 !"
Else
MsgBox "AdoRs2 没有被完全释放 !"
End If
MsgBox "AdoRs2字段个数 :" & AdoRs2.Fields.Count
MsgBox "AdoRs1字段个数 :" & AdoRs1.Fields.Count
Exit Sub
ErrTest:
MsgBox "获取AdoRs字段个数不成功, 请检查AdoRs1对象是否有效 !"
End Sub
因此,你的这个测试表明有一个隐式的引用存在。
但是对于 AdoRs2来说,set nothing 却将它的属性重新初始化了?!
谁知道vb.dll是怎么处理 set nothing 这条语句的。也不知道vb是怎么在调用ADO的COM接口。或许你将几个vb.dll反汇编掉就会弄明白是怎么回事情了。至于性能,使用由 New 关键字声明的变量会减慢应用程序的运行速度。因为 Visual Basic 每次遇到用 New 声明的变量时,都要测试是否已将对象引用赋给该变量。所以,最好不要用 dim ...as New...的声名方法了.By the way,参考MSDN 或许对你有帮助。你的测试程序还可以改进很多!
Global gAdoCnn as ADODB.Connection 因为每次使用以上全局变量时,都需要执行判断语句:
if Not gAdoCnn is Nothing then
'...
endif但是,如果我们将变量写成以下形式,
Global gAdoCnn as New ADODB.Connection
则每次使用时,都不需要执行 if Not gAdoCnn is Nothing then 语句。另外,如果ADODB.RecordSet是局部变量,则讨论对象的资源是否被释放好象意义不大,不知各位意见如何?