Office中国论坛/Access中国论坛
标题: 【新手入门】之十六:浅谈ADO之Recordset(下) [打印本页]
作者: roych 时间: 2014-11-17 09:06
标题: 【新手入门】之十六:浅谈ADO之Recordset(下)
记录集的基本操作讲解到此结束,下面再讲些可能不太常用的或者属性。
第一个方法:GetString(字符串类型,想获取的行数,字段分隔符,记录分隔符,空值表达式)
最后一个参数没仔细研究过。有时候,我们需要把所有符合条件的记录合并成一个文本字符串,这时候,这个函数就派上用场了:
- Sub GetStr1()
- Dim rst As New ADODB.Recordset
- Dim s As String
- rst.Open "select 企业代码 from myTable2 where 违规月份='9月'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
- s = rst.GetString(adClipString, , , ",")
- Debug.Print "9月违规的企业分别是:" & Left(s, Len(s) - 1)
- End Sub
复制代码改成循环语句则是这样:
- Sub GetStr2()
- Dim rst As New ADODB.Recordset
- Dim s As String
- rst.Open "select 企业代码 from myTable2 where 违规月份='9月'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
- Do Until rst.EOF
- s = s & "," & rst(0)
- rst.MoveNext
- Loop
- Debug.Print "9月违规的企业如下:" & Right(s, Len(s) - 1)
- End Sub
复制代码 相比之下,孰优孰劣自不待言。——当然,更复杂的写法是用GetRows方法:
- Sub GetStr3()
- Dim rst As New ADODB.Recordset
- Dim s()
- Dim i As Long, j As Long
- Dim k As String
- rst.Open "select * from myTable2 where 服务代码='10669967'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
- s = rst.GetRows()
- For i = 0 To UBound(s, 2)’ UBound(s, 2)
- For j = 0 To UBound(s, 1)
- k = k & ":" & s(j, i)
- Next
- Next
- Debug.Print k
- End Sub
复制代码
这是因为GetRows返回的是一个二维数组。二维数组?这是神马啊?——估计有人会问了。这里先简单普及下吧,有时间再发一些扫盲贴:
数组下限是默认从0开始的。二维常数数组,通常是像下面这样写的:
- Sub test()
- Dim arr(1, 2)’定义一个2列×3行的数组。如果希望从1开始,则改为:arr(1 to 2,1 to 3)
- arr(0, 0) = "1"
- arr(0, 1) = "2"
- arr(0, 2) = "3"
- arr(1, 0) = "4"
- arr(1, 1) = "5"
- arr(1, 2) = "6"
- Debug.Print “行数上限是:” & UBound(arr, 2) & ”列数下限是:” & LBound(arr,1)
- ‘最后一个参数表示的是维度。
- End Sub
复制代码当然,还有三维、四维数组等等,例如arr(0 to 1, 2 to 4, 3 to 5),但在Access里应用不太广泛。数组普及至此结束,下面回来看看GetRows的参数:
第一个参数:需要获取的行数,默认为全部行数。
第二个参数:起始行标,
第三个参数:列标。
第二、三个参数下标均从0开始,可以理解吗?
最后,我们来点更有意思的:保存记录集和读取本地记录集文件。先贴代码:
- Sub SaveRecord()
- Dim rst As New ADODB.Recordset
- rst.Open "select * from mytable where 违规月份='1月'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
- rst.Save "E:\myReordset.xml", adPersistXML
- rst.Close
- Set rst = Nothing
- End Sub
复制代码就这么几句,一个记录集就以XML格式保存在E盘了。XML比较直观,用记事本或者IE浏览器就能打开。是不是觉得安全性太低?,那我们改为ADTG格式试试:
- rst.Save "E:\myReordset.adtg", adPersistADTG
复制代码还能用记事本打开吗?要不,看看Access能不能导入?好像也没有这个格式…是不是有种锁门准备出去时才发现钥匙落在房间里面的感觉呢?不过这次我们不用请锁匠,用ADO来读取就可以了。
- Sub ReadRecord()
- Dim rst As New ADODB.Recordset
- rst.Open "E:\myReordset.ADTG", , adOpenKeyset, adLockOptimistic, adCmdText
- Do Until rst.EOF
- Debug.Print rst(3)
- rst.MoveNext
- Loop
- End Sub
复制代码跟前面比较,发现什么了吗?
保存记录集时仍需数据连接参数,但读取时却不再需要了,这是最大的不同。另外,最后一个参数为可选参数,可填可不填。
当然,Recordset里还有很多有趣的属性,但在Access里不是很常用,这里便稍稍提一下,有兴趣的版友可以自行研究一下。
1、用AbsolutePosition属性用于显示当前记录的光标位置,请参考盗梦的实例。
2、用PageSize和PageCount属性来分页,这常常应用于网页中。由于Access缺少Table类控件,我也不建议这样做,不过还是做了个例子供大家参考。
3、用Filter属性来筛选记录集的一个子集。这个也应用很少,因为这个子集既然可以能够通过条件来筛选,那么,何不在开始时就设置条件呢?
ADO讲解到此暂告一个段落,后面如果不太忙的话,或许会再谈谈流文件(stream)。
[attach]55018[/attach]
【新手入门】之一:If分支语句
【新手入门】之二:分支语句总结
【新手入门】之三:循环语句For
【新手入门】之四:循环语句Do和死循环
【新手入门】之五:公共变量与传址过程、传值过程
【新手入门】之六:“悲欢离合总无情”——浅谈Split和Join
【新手入门】之七:嵌套与并列——再谈If流程问题
【新手入门】之八:“连就连”——浅谈“&”和“+”连接符的区别
【新手入门】之九:从百钱百鸡谈起——浅谈“规划求解”兼答lingjiang问
【新手入门】之十:书到用时方恨少——自定义菜单(Access 2003)的制作
【新手入门】之十一:浅谈ADO之序言
【新手入门】之十二:浅谈ADO之Connection
【新手入门】之十三:浅谈ADO之Conmmand(上)
【新手入门】之十四:浅谈ADO之Command(下)
【新手入门】之十五:浅谈ADO之Recordset(上)
【新手入门】之十六:浅谈ADO之Recordset(下)
【新手入门】之十七:浅谈列表框的使用
【新手入门】之十八:双击列表框修改数据
【新手入门】之十九:从“书与女友恕不外借”谈起——浅谈“Bookmark”的使用
【新手入门】之二十:“书与书签”——bookmark属性答疑
【新手入门】之二十一:记录集的“凌迟”——逐条导出记录集
【新手进阶】之一:基础算法(一)
【新手进阶】之二:基础算法(二)
【新手进阶】之三:基础算法(三)
【新手进阶】之四:基础算法(四)
【新手进阶】之五:排序搜索(一)
【新手进阶】之六:排序搜索(二)
【新手进阶】之七:递归算法
【新手进阶】之八:冒泡排序
【新手进阶】之九:浅谈不绑定数据源操作记录
【新手进阶】之十:工作日的计算
【新手进阶】之十一:“庖丁解牛”和“纪昌学射”——浅谈表格式文本数据的导入
【新手进阶】之十二:从四脚腾空的奔马谈起——原来界面可以这样设计
【新手进阶】之十三:Outlook风格导航界面
【新手进阶】之十四:仓库管理系统
作者: cfedf 时间: 2014-11-19 07:13
向楼主学习,有几个问题问一下。
1,为什么例子里面没有类似于command的按钮,没有按钮,怎么激发代码了?
2,为什么代码是sub开头,一般不都是private sub command-click()开头吗?
主要这两个。谢谢楼主的文章,很收益。
作者: roych 时间: 2014-11-19 08:57
本帖最后由 roych 于 2014-11-19 09:10 编辑
1、按F5运行就可以了。
如果非要按钮,也可以设置个按钮,然后
private sub command1_click()
call 函数名
end sub2、首先,我建立的是模块级别的过程,默认为公共模块(Public,这个谓词可以不加),在其它位置直接调用即可。如果加上私有化(Private)则只能在该模块运行,在其它地方调用时就会出现“子过程或函数未定义”的编译错误。
而private sub command1_click()表示的是私有化按钮单击过程事件。只能在所隶属的窗体上执行。——一般情况下,是无法在别的窗体上调用本窗体的单击事件,如果需要这么做,往往只能在模块级别上写一个公共函数,然后互相调用。
作者: cfedf 时间: 2014-11-19 11:52
roych 发表于 2014-11-19 08:57
1、按F5运行就可以了。
如果非要按钮,也可以设置个按钮,然后
private sub command1_click()
你太厉害了。这样就不用一个按钮一段代码,call一下,多省事情。我正在研究你的例子,非常好。我想ado我终于知道怎么回事了。我先练着,有问题向你请教,非常感谢你的热心帮助。
作者: roych 时间: 2014-11-19 11:58
懒嘛。我向来是个懒人~~
作者: cfedf 时间: 2014-11-19 20:45
[attach]55078[/attach]楼主您好,请教个问题,你的代码我在你的文件里运行没问题,可是我把你的代码用到我的ACCESS中测试出问题了,我是直接复制黏贴你的代码.结果是这样的提示.
作者: roych 时间: 2014-11-20 09:08
应该是没有引用库的问题吧。在VBE里点击“工具/引用”,然后选择 ADO 2.8库(Microsoft ActiveX Data Object……)
作者: wanlong3390 时间: 2014-11-22 16:42
老师,什么时候发表其他的基础文章呀?
作者: roych 时间: 2014-11-22 18:08
先去淘贴里看看呀。
作者: wu8313 时间: 2015-6-10 15:38
本帖最后由 wu8313 于 2015-6-14 19:39 编辑
GetString 非常好,谢谢指点。
可以把某个ACC本地表的所有行 转化为 一个字符串 mystring1(形如:1001;1002;1003),传递给 存储过程的文本型输入参数, 然后在SQL里面把这个文本型参数用表值函数转化成表t1.从而实现批量插入,更新,删除 。比如,delete from T1 where 工号 in (select * from t1)
作者: datouda 时间: 2016-9-5 20:00
嘿嘿 竟然有附件!!!
作者: shslsun 时间: 2016-12-24 07:04
非常感谢!!!
作者: shslsun 时间: 2016-12-24 07:05
非常好,非常感谢!!
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) |
Powered by Discuz! X3.3 |