Office中国论坛/Access中国论坛

标题: ADO recordset 与窗体的记录集 [打印本页]

作者: CHENZHIRONG    时间: 2004-8-3 21:14
标题: ADO recordset 与窗体的记录集
我创建一个ADO的recordset,然后赋给窗体的记录集,居然报错,是ACCESS的窗体不接受这种recordset吗?

Dim rs As ADODB.Recordset

  Set rs = New Recordset

  DoCmd.OpenForm "UDC"

  rs.CursorLocation = adUseClient

  rs.Fields.Append "ID", adNumeric

  rs.Fields.Append "Option", adBSTR

  rs.Fields.Append "OptionDescription", adBSTR

  rs.Fields.Append "HardCode", adBSTR

  Set Forms("udc").Recordset = rs

在最后一句 set 窗体 .recordset=rs 报错,“输入的对象不是有效的RECORDSET属性”
作者: sunredday    时间: 2004-8-4 01:36
在LOAD事件中寫到

Private Sub Form_Load()

Dim CNN As New ADODB.Connection

Dim RST As New ADODB.Recordset



Set CNN = CurrentProject.Connection

RST.Open "AA", CNN, adOpenKeyset, adLockOptimistic, adCmdTable

Set Me.Recordset = RST



End Sub

好象记录集没有打开的缘故
作者: sunredday    时间: 2004-8-4 03:37
?

[此贴子已经被作者于2004-8-3 19:41:58编辑过]


作者: sunredday    时间: 2004-8-4 04:57
请教:如何用ADO的RecordSet对象引用当前窗体的记录集?


请教:如何用ADO的RecordSet对象引用当前窗体的记录集?





以前我一直使用DAO的RecordSet对象引用当前窗体的记录集或记录集副本,例如:


Dim  Rst  As  Recordset


Dim  lngJLS   As   Long





Set Rst = ME.RecordsetClone‘记录集副本


   或 Set Rst = ME.Recordset


lngJLS = Rst.RecordCount '读取窗体中的记录数


Rst.Close





现在,我想把DAO代码转换成ADO,例如:


Dim lngJLS As Long


Dim Rst As New ADODB.Recordset





Rst.CursorType = adOpenDynamic


Rst.LockType = adLockBatchOptimistic





Set Rst = ME.Recordset


lngJLS = Rst.RecordCount '读取子窗体中的记录数


Set Rst = Nothing





可是运行时,总是系统提示:“运行时错误‘13’类型不匹配”。





我用下列代码查看了当前窗体的记录集属性,


Dim  rs  As Object


Set rs = ME.Recordset


If   TypeOf rs Is ADODB.Recordset Then


    MsgBox "ADO Recordset"


Else 'If TypeOf  rs Is DAO.Recordset Then


    MsgBox "DAO Recordset"


End If


则系统返回提示 “DAO Recordset”。也就是说,当前窗体记录集的默认属性是DAO型。


我将DAO 的引用去掉后再试,结果还是一样。





请问高手、同仁,为什么窗体记录集的默认属性总是DAO型?如何才能使用ADO 的RecordSet对象引用当前窗体的记录集或记录集副本,而使它们类型匹配呢?


我已经试了很多方式,就是解决不了问题,只好向大家请教了。拜托,为盼!





----------------------------------------------


缘系ACCECC,感谢ACCESS中国。 2002-8-18 11:59:14    [code]<SCRIPT language=JavaScript>


var actioninfo3='单帖屏蔽';document.write (dvbbs_show_topic('10976','2','tmtony','','','tmtony@21cn.com','Http://www.office-cn.net|||18449932|||||||||||||||','','Images/userface/image37.gif','','站长','screen.width-600)this.style.width=screen.width-600;if(this.height>250)this.style.width=(this.width*250)/this.height;">


天大事总平常事 烦恼心皆贪欲心


','','不是的, me.Recordset是一个通用对象,只是因为你使用了jet的绑定,所以缺省就是DAO了,如果你想用它来存ado,使用下面方法


加载时


   Dim rs As ADODB.Recordset


   Set rs = New ADODB.Recordset


   With rs


       .ActiveConnection = CurrentProject.Connection


       .Source = "SELECT * FROM 你的表"


       .LockType = adLockOptimistic


       .CursorType = adOpenKeyset


       .Open


   End With


   Set Me.Recordset = rs





然后你后面引用的me.recordset me.resordsetclone即为ado


','2002-8-18 12:45:37','face0.gif','*.*.*.*','2143',1,0,75,2,'管理员','32','32','2442','2002-1-7','257855','4265','4271','','1',0,'0','level10.gif',1,'2004-8-3 9:47:44','
作者: sunredday    时间: 2004-8-4 05:06
运行代码查看主要是ME.RECORDSET 默认是DAO 不是ADO。要在窗体加载时定义一个RS, ME.ME.RECORDSET =RS这样 窗体的RECORDSET就是ADO 型的了。
作者: CHENZHIRONG    时间: 2004-8-4 17:05
不是这个原因,我用以下代码通过:Set rs = New Recordset

  rs.CursorLocation = adUseClient

  rs.Open "UserDefineCode", CurrentProject.Connection, adOpenDynamic, adLockPessimistic, adCmdTable

  DoCmd.OpenForm "UDC"

  Set Forms("udc").Recordset = rs关键是一定要设CursorLocation = adUseClient,这个在ACCESS帮助中有说明。
作者: sunredday    时间: 2004-8-4 21:19
Dim rs As ADODB.Recordset

  Set rs = New Recordset

  DoCmd.OpenForm "UDC"

  rs.CursorLocation = adUseClient

  rs.Fields.Append "ID", adNumeric

  rs.Fields.Append "Option", adBSTR

  rs.Fields.Append "OptionDescription", adBSTR

  rs.Fields.Append "HardCode", adBSTR

  rs.Open Me.Recordset.Name, CurrentProject.Connection



  

   

  Set Forms("udc").Recordset = rs


作者: CHENZHIRONG    时间: 2004-8-4 22:20
原来的窗体没有RECORDSET,应此用ME.RECORDSET.NAME 有问题,提示对象没设置。
作者: sunredday    时间: 2004-8-4 22:43
Dim rs As ADODB.Recordset

  Set rs = New Recordset

  DoCmd.OpenForm "UDC"

  rs.CursorLocation = adUseClient

  rs.Fields.Append "ID", adNumeric

  rs.Fields.Append "Option", adBSTR

  rs.Fields.Append "OptionDescription", adBSTR

  rs.Fields.Append "HardCode", adBSTR

  rs.Open

rs.ActiveConnection = CurrentProject.Connection

  Set Forms("udc").Recordset = rs


作者: CHENZHIRONG    时间: 2004-8-4 23:09
多谢suredday, 第一个问题解决了,但接下来又有问题,打开的窗体的记录集不可更新,我设了rs.LockType = adLockOptimistic也没用,不知为何?
作者: sunredday    时间: 2004-8-5 02:21
rs.AddNew

rs.Fields(1).Value = 1

rs.Update

Forms![udc].文本0.Value = rs.Fields(1).Value

我觉得窗体控件应该是后期绑定的.

更新RS应该利用窗体结合代码来更新.

可是这样一来, ME.RECORDSET=RS有什么用呢
作者: CHENZHIRONG    时间: 2004-8-5 16:30
直接操作记录集出错,运行到rs.fields(1).value=1时提示“多步操作时产生错误,请检查每一步的状态值。”我的问题是这样的,我有一组类二维表的数据,这组数据没有(不能)存在ACCESS的表中,应此我要编辑这组数据时就临时产生一个记录集,再赋给窗体,在窗体中编辑后,再取出记录集的数据保存。这个问题的另一个解法是每次产生一个临时表,我不喜欢这种方法。
作者: sunredday    时间: 2004-8-5 19:37
Dim rs As ADODB.Recordset

  Set rs = New Recordset

  DoCmd.OpenForm "UDC"

  rs.CursorLocation = adUseClient

  rs.Fields.Append "ID", adNumeric

  rs.Fields.Append "Option", adBSTR

  rs.Fields.Append "OptionDescription", adBSTR

  rs.Fields.Append "HardCode", adBSTR

  rs.Open

rs.ActiveConnection = CurrentProject.Connection

Set Forms("udc").Recordset = rs  rs.AddNew

rs.Fields(1).Value = 1

rs.Update

Forms![udc].文本0.Value = rs.Fields(1).Value其中 Set Forms("udc").Recordset = rs 没有用.RS 可以在窗体上显示,没有必要绑定到窗体。


作者: CHENZHIRONG    时间: 2004-8-6 16:10
窗体是一个数据表或连续窗体,有必要绑定,靠给控件赋值不行。
作者: Sooloom    时间: 2007-7-17 00:00
我正要找这个问题
作者: bjcompass    时间: 2011-8-29 14:35
gaoshen




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3