关于定义对象的一个问题?

thllv 2010-02-11 01:41:43
⑴Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
⑵Dim rs As New ADODB.Recordset
⑶Dim rs As Object
Set rs = CreateObject("ADODB.Recordset")

这三种定义对象的方法有何区别?请大侠们指点,谢谢了!

...全文
53 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
thllv 2010-02-11
  • 打赏
  • 举报
回复
大侠能否看下,我这样用是否会造成内存泄露?
Dim rs1 As Object,rs2 As Object,rs2 As Object
Dim dc1 As Object,dc2 As Object,MD_变量s As Object
---------------------------------------------
Private Sub Form_Open(Cancel As Integer)
Set MD_变量s = CreateObject("Scripting.Dictionary")
MD_变量s.Add "rs1", rs1
MD_变量s.Add "rs2", rs2
MD_变量s.Add "rs3", rs3
MD_变量s.Add "dc1", dc1
MD_变量s.Add "dc2", dc2
'---------------------------
Call MY_生成对象(MD_变量s)
'---------------------------
Set rs1 = MD_变量s("rs1")
Set rs2 = MD_变量s("rs2")
Set rs3 = MD_变量s("rs3")
Set dc1 = MD_变量s("dc1")
Set dc2 = MD_变量s("dc2")
'---本来想着这些set 不用加在“MY_生成对象(MD_变量s)”函数里就能设置好正确指向,但没有通过,加上后能正常运行,我担心是否会造成内存泄露?
.....
End Sub
Private Sub Command_退出_Click()
Call MY_清除对象(MD_变量s)
Set MD_变量s = Nothing
DoCmd.Close
End Sub
-----------------------
Public Function MY_生成对象(列表 As Object)
Dim 对象名 As String
对象列表 = 列表.keys
For i = 0 To 列表.Count - 1
对象名 = 对象列表(i)
sl2 = Left(对象名, 2)
Select Case sl2
Case "rs"
Set 列表(对象名) = CreateObject("ADODB.Recordset")
Case "dc"
Set 列表(对象名) = CreateObject("Scripting.Dictionary")
End Select
Next i
End Function

Public Function MY_清除对象(列表 As Object)
Dim 对象名 As String
对象列表 = 列表.keys
For i = 0 To 列表.Count - 1
对象名 = 对象列表(i)
sl2 = Left(对象名, 2)
Select Case sl2
Case "rs"
If 列表(对象名).State Then 列表(对象名).Close
Set 列表(对象名) = Nothing
列表.Remove 对象名
Case "dc"
Set 列表(对象名) = Nothing
列表.Remove 对象名
End Select
Next i
End Function

我这样用是想统一生成和清除对象,大侠指点下行否?
有无更好的方法?
ACMAIN_CHM 2010-02-11
  • 打赏
  • 举报
回复
(1),(2)没什么区别。

(3) 是后绑定,不需要引用ADO模型。由系统来决定引用哪个版本。
c789_789c 2010-02-11
  • 打赏
  • 举报
回复
加一句:“MD_变量s("rs1")就应该指向rs1了(我是这样认为的)”,我认为反之也成立,即:rs1是指向MD_变量s("rs1")的,而“MD_变量s("rs1")”在函数中准备好了实例,所以我觉得set可以不要了?
c789_789c 2010-02-11
  • 打赏
  • 举报
回复
我还有一个疑惑?
通常在程序中:
Dim rs1 As Object
Set rs1 = CreateObject("ADODB.Recordset")
这样rs1的实例就已经准备好了,也没有加"new",怎么就可以!

我在“MY_生成对象(列表 As Object) ”这个函数里“Set 列表(对象名) = CreateObject("ADODB.Recordset")” 也是准备好了实例的,因为每个变量都有“MD_变量s.Add "rs1", rs1 ”对应,这样,MD_变量s("rs1")就应该指向rs1了(我是这样认为的) ,于是set就好象不用加了,但事实上却不是,为什么?大侠能否再深入指点一下!
changechange 2010-02-11
  • 打赏
  • 举报
回复
Dim rs1 As Object,rs2 As Object,rs2 As Object
Set rs1 = MD_变量s("rs1")
'---本来想着这些set 不用加在“MY_生成对象(MD_变量s)”函数里就能设置好正确指向,但没有通过,加上后能正常运行,我担心是否会造成内存泄露?

---------------------请注意你的声明,你没有用 dim rs1 as new object 而是用 object 所以必须先set ,否则直接用 rs1=... 就可以了。你是没有创建一个新实例,只是声明了他的数据类型。
ACMAIN_CHM 2010-02-11
  • 打赏
  • 举报
回复
VB 或VBA 不会存在内存泄露。

7,713

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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