问题点:用WithEvents 定义的RecordSet,,无法作为参数正常传递。

奔跑9999 2009-02-02 09:01:41
问题点:用WithEvents 定义的RecordSet,,无法作为参数正常传递。
‘注:如果去掉WithEvents,则程序可正常执行。
Dim WithEvents mRs As ADODB.Recordset
Private Sub cmdReset_Click()
Dim strSQL As String
strSQL = "Select Top 20 LogID from tblLog"
Set mRs = New ADODB.Recordset
mRs.Open strSQL, mdb, adOpenKeyset, adLockBatchOptimistic ‘注:此时,mRs.RecordCount=20
ReSetRecordSet mRs
‘注:此时,mRs.RecordCount还是20,但是,应该是10才对。End Sub

Private Sub ReSetRecordSet(ByRef pRecordset As ADODB.Recordset)
Dim strSQL As String
strSQL = "Select Top 10 LogID from tblLog "
Set pRecordset = New ADODB.Recordset
pRecordset.Open strSQL, mdb, adOpenKeyset, adLockBatchOptimistic '注:此时,pRecordset.RecordCount=10
End Sub
...全文
201 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
奔跑9999 2009-02-05
  • 打赏
  • 举报
回复
我試過了的,用SET mRs = ReSetRecordSet()這樣的語句沒有問題。
因為:它就不是通過參數傳遞來實現的。
但是,我還是想找一個辦法:直接通過pRecordset修改來實現,不用明確指定來源recordset。
原因:想使代碼更簡潔。我有數百個語句,調用ReSetRecordSet。如果來源recordset都需要明確定指,則過程的靈活性降低了,因為:要多數個百個類似的語句,SET mRs = ReSetRecordSet。
Tiger_Zhao 2009-02-05
  • 打赏
  • 举报
回复
将 ReSetRecordSet mRs 更改为 SET mRs = ReSetRecordSet() 用任何批量文本修改工具就可以做到,根本不影响所谓的灵活性。
而且你根本不使用旧的 pRecordset 实例,从参数更改为函数返回值更直观。
vansoft 2009-02-03
  • 打赏
  • 举报
回复
Set mRs = New ADODB.Recordset

去掉试试
Tiger_Zhao 2009-02-03
  • 打赏
  • 举报
回复
WithEvents 的变量应该有一些事件绑定相关的自动处理。
在显式更改 mRs 时会调用(其实就是 VB 编译器对 Set mRs = 语句添加了额外的处理功能);而在 ReSetRecordSet() 中 pRecordset 是没有该特性的。
并且在 mRs 作为参数时可能自动作了不可更改的限定。

试试将 ReSetRecordSet() 改成函数,调用改为 mRs = ReSetRecordSet()
特别 2009-02-02
  • 打赏
  • 举报
回复
猜测可能是由于绑定事件的对象初始化后,其内存地址不能改变造成的
楼主可将ReSetRecordSet中
Set pRecordset = New ADODB.Recordset
这一行替换成
If pRecordset.State = 1 Then
'如果记录集已打开,则关闭
pRecordset.Close
End If

然后,可以在窗体的LOAD事件中初始化mRs
Set mRs = New ADODB.Recordset

然后,在其他打开 mRs 之前,都关闭记录集,或者用完后就关闭记录集

1,217

社区成员

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

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