晕了,大家来看看,关于用集合保存记录集中的数据!

sunhq 2005-11-06 09:43:26
部分程序如下:
Dim MyClasses As New Collection
Set cnnDB = New ADODB.Connection
cnnDB.Open strConn
Set rst1 = New ADODB.Recordset
Set rst1 = cnnDB.Execute("select * from user where ID = 1")
if Not rst1.EOF then
MyClasses.Add rst1("ID"), "ID"
MyClasses.Add rst1("Name"), "Name"
end if
rst1.Close
ID = MyClasses("ID")
Name = MyClasses("Name")
执行到ID = MyClasses("ID")时提示错误“对象不再有效”,我研究了半天,发现只要记录集关闭就会这样!这是怎么回事,怎么解决
...全文
306 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
viena 2005-11-09
  • 打赏
  • 举报
回复
如果只是保存字符串,用Dictionary就可以了
viena 2005-11-09
  • 打赏
  • 举报
回复
没细看,freewzf(一轮明月照九洲) 的回复就是我所说的实现
viena 2005-11-09
  • 打赏
  • 举报
回复
定义一个实体类,保存一条记录的信息,
循环遍历记录集,
每次实例化这个实体类为对象,填充对象,添加进集合
freewzf 2005-11-09
  • 打赏
  • 举报
回复
我想你可以这样,先定义一个类或者结构体之类的东西.然后再就这个类生成一个集合类.然后再把记录集付进去.
举个例子.

1\先定义一CFIELDNAME类,用于保存字段.内容如下:
private m_strFieldName as string '字段名称
private m_strFieldType as string '字段类型
private m_strFieldValue as string '字段值
public property let FieldName(strName as string)
m_strFieldName=trim(strName)
end sub
public property get FieldName() as string
Fieldname=m_strFieldName
end sub
public property let FieldValue(strValue as string)
m_strfieldvalue=trim(strvalue)
end sub
......
等等
2\由CFIELDNAME生成集合类CFIELDNAMECOL
使用VB提供的集合生成器,就可以实现.
3\保存记录集.
dim m_clsFd as new CFieldName
dim m_colFd as new CFieldNameCol
dim m_colRs as new collection

do while not rs.eof
set m_colFd=new CFieldNameCol
for i=0 to rs.fields.count-1
set m_clsFd=new CFieldName
m_clsfd.fieldname=rs.fields(i).name
m_clsfd.fieldvalue=rs.fields(i)
m_colfd.add m_clsFd
next i
m_colRs.add m_colFd
rs.movenext
loop
rs.close
就可以了.
aassdd 2005-11-09
  • 打赏
  • 举报
回复
集合保存的是对象的引用,关闭记录集当然就没值。
northwolves 2005-11-06
  • 打赏
  • 举报
回复
我以前会这样用,供参考:

Dim MyClasses As New Collection

Private Sub Form_Load()
Dim cnnDB As New ADODB.Connection
Dim rst1 As New ADODB.Recordset
cnnDB.Open strConn
Set rst1 = cnnDB.Execute("select * from user ")
Do While Not rst1.EOF
MyClasses.Add rst1("ID") & rst1("Name"), rst1("ID")
rst1.movenext
Loop
rst1.Close
cnnDB.Close
End Sub

Private Sub Command1_Click()
MsgBox MyClasses("0002")
End Sub
winehero 2005-11-06
  • 打赏
  • 举报
回复
MyClasses.Add rst1("ID"), "ID"
__________________________________________

你往集合对象中添加的是已打开记录集的Field对象,当RS CLose后,Field当然就无效了。
建议添加Field对象的值,而不是对象本身,如以上语句改为:

MyClasses.Add rst1("ID").value, "ID"
seu31199113 2005-11-06
  • 打赏
  • 举报
回复
Recordset 关闭之后当然就不能用啦!

你可以用 类似 C语言的结构体 作为自己自定义类型 ,看看能不能处理你的问题!
sunhq 2005-11-06
  • 打赏
  • 举报
回复
晕,我这里只是举一个简单的例子,我真正的应用复杂的多,需要按关键字在集合中检索,我的问题就是为什么集合中加入的记录集的数据在记录集关闭后就不能用了!
northwolves 2005-11-06
  • 打赏
  • 举报
回复
1. Dim MyClasses As New Collection
定义成全局变量

2.
Set rst1 = cnnDB.Execute("select * from user where ID = 1")
单一的一条数据何必用集合,两个字符串足够了

3. 按你的需要,下面代码就够了,不需要使用集合:

Set rst1 = New ADODB.Recordset
Set rst1 = cnnDB.Execute("select * from user where ID = 1")
if Not rst1.EOF then
ID = rst1("ID")
Name = rst1("Name")
end if
rst1.Close
sunhq 2005-11-06
  • 打赏
  • 举报
回复
那怎么行,我保存在集合就是为了在关闭记录集后用啊
szjhxu 2005-11-06
  • 打赏
  • 举报
回复
那你就把关闭记录集的语句放在后面好了。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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