设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 23461|回复: 13
打印 上一主题 下一主题

[ADO/DAO] 【新手入门】之十六:浅谈ADO之Recordset(下)

[复制链接]
跳转到指定楼层
1#
发表于 2014-11-17 09:06:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
记录集的基本操作讲解到此结束,下面再讲些可能不太常用的或者属性。
第一个方法:GetString(字符串类型,想获取的行数,字段分隔符,记录分隔符,空值表达式)
最后一个参数没仔细研究过。有时候,我们需要把所有符合条件的记录合并成一个文本字符串,这时候,这个函数就派上用场了:
  1. Sub GetStr1()
  2. Dim rst As New ADODB.Recordset
  3. Dim s As String
  4. rst.Open "select 企业代码 from myTable2 where 违规月份='9月'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  5. s = rst.GetString(adClipString, , , ",")
  6. Debug.Print "9月违规的企业分别是:" & Left(s, Len(s) - 1)
  7. End Sub
复制代码
改成循环语句则是这样:
  1. Sub GetStr2()
  2. Dim rst As New ADODB.Recordset
  3. Dim s As String
  4. rst.Open "select 企业代码 from myTable2 where 违规月份='9月'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  5. Do Until rst.EOF
  6.     s = s & "," & rst(0)
  7.     rst.MoveNext
  8. Loop
  9. Debug.Print "9月违规的企业如下:" & Right(s, Len(s) - 1)
  10. End Sub
复制代码
相比之下,孰优孰劣自不待言。——当然,更复杂的写法是用GetRows方法:
  1. Sub GetStr3()
  2. Dim rst As New ADODB.Recordset
  3. Dim s()
  4. Dim i As Long, j As Long
  5. Dim k As String
  6. rst.Open "select * from myTable2 where 服务代码='10669967'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  7. s = rst.GetRows()
  8. For i = 0 To UBound(s, 2)’ UBound(s, 2)
  9.     For j = 0 To UBound(s, 1)
  10.         k = k & ":" & s(j, i)
  11.     Next
  12. Next
  13. Debug.Print k
  14. End Sub
复制代码

这是因为GetRows返回的是一个二维数组。二维数组?这是神马啊?——估计有人会问了。这里先简单普及下吧,有时间再发一些扫盲贴:
数组下限是默认从0开始的。二维常数数组,通常是像下面这样写的:
  1. Sub test()
  2. Dim arr(1, 2)’定义一个2列×3行的数组。如果希望从1开始,则改为:arr(1 to 2,1 to 3)
  3. arr(0, 0) = "1"
  4. arr(0, 1) = "2"
  5. arr(0, 2) = "3"
  6. arr(1, 0) = "4"
  7. arr(1, 1) = "5"
  8. arr(1, 2) = "6"
  9. Debug.Print “行数上限是:” & UBound(arr, 2) & ”列数下限是:” & LBound(arr,1)
  10. ‘最后一个参数表示的是维度。
  11. End Sub
复制代码
当然,还有三维、四维数组等等,例如arr(0 to 1, 2 to 4, 3 to 5),但在Access里应用不太广泛。数组普及至此结束,下面回来看看GetRows的参数:
第一个参数:需要获取的行数,默认为全部行数。
第二个参数:起始行标,
第三个参数:列标。
第二、三个参数下标均从0开始,可以理解吗?
最后,我们来点更有意思的:保存记录集和读取本地记录集文件。先贴代码:
  1. Sub SaveRecord()
  2. Dim rst As New ADODB.Recordset
  3. rst.Open "select * from mytable where 违规月份='1月'", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
  4. rst.Save "E:\myReordset.xml", adPersistXML
  5. rst.Close
  6. Set rst = Nothing
  7. End Sub
复制代码
就这么几句,一个记录集就以XML格式保存在E盘了。XML比较直观,用记事本或者IE浏览器就能打开。是不是觉得安全性太低?,那我们改为ADTG格式试试:
  1. rst.Save "E:\myReordset.adtg", adPersistADTG
复制代码
还能用记事本打开吗?要不,看看Access能不能导入?好像也没有这个格式…是不是有种锁门准备出去时才发现钥匙落在房间里面的感觉呢?不过这次我们不用请锁匠,用ADO来读取就可以了。
  1. Sub ReadRecord()
  2. Dim rst As New ADODB.Recordset
  3. rst.Open "E:\myReordset.ADTG", , adOpenKeyset, adLockOptimistic, adCmdText
  4. Do Until rst.EOF
  5. Debug.Print rst(3)
  6. rst.MoveNext
  7. Loop
  8. End Sub
复制代码
跟前面比较,发现什么了吗?
保存记录集时仍需数据连接参数,但读取时却不再需要了,这是最大的不同。另外,最后一个参数为可选参数,可填可不填。
当然,Recordset里还有很多有趣的属性,但在Access里不是很常用,这里便稍稍提一下,有兴趣的版友可以自行研究一下。
1、用AbsolutePosition属性用于显示当前记录的光标位置,请参考盗梦的实例。
2、用PageSize和PageCount属性来分页,这常常应用于网页中。由于Access缺少Table类控件,我也不建议这样做,不过还是做了个例子供大家参考。
3、用Filter属性来筛选记录集的一个子集。这个也应用很少,因为这个子集既然可以能够通过条件来筛选,那么,何不在开始时就设置条件呢?
ADO讲解到此暂告一个段落,后面如果不太忙的话,或许会再谈谈流文件(stream)。

【新手入门】之一:If分支语句
【新手入门】之二:分支语句总结
【新手入门】之三:循环语句For
【新手入门】之四:循环语句Do和死循环
【新手入门】之五:公共变量与传址过程、传值过程
【新手入门】之六:“悲欢离合总无情”——浅谈Split和Join
【新手入门】之七:嵌套与并列——再谈If流程问题
【新手入门】之八:“连就连”——浅谈“&”和“+”连接符的区别

【新手入门】之九:从百钱百鸡谈起——浅谈“规划求解”兼答lingjiang问
【新手入门】之十:书到用时方恨少——自定义菜单(Access 2003)的制作
【新手入门】之十一:浅谈ADO之序言
【新手入门】之十二:浅谈ADO之Connection
【新手入门】之十三:浅谈ADO之Conmmand(上)
【新手入门】之十四:浅谈ADO之Command(下)
【新手入门】之十五:浅谈ADO之Recordset(上)
【新手入门】之十六:浅谈ADO之Recordset(下)
【新手入门】之十七:浅谈列表框的使用
【新手入门】之十八:双击列表框修改数据
【新手入门】之十九:从“书与女友恕不外借”谈起——浅谈“Bookmark”的使用
【新手入门】之二十:“书与书签”——bookmark属性答疑
【新手入门】之二十一:记录集的“凌迟”——逐条导出记录集

【新手进阶】之一:基础算法(一)
【新手进阶】之二:基础算法(二)
【新手进阶】之三:基础算法(三)
【新手进阶】之四:基础算法(四)
【新手进阶】之五:排序搜索(一)
【新手进阶】之六:排序搜索(二)
【新手进阶】之七:递归算法
【新手进阶】之八:冒泡排序
【新手进阶】之九:浅谈不绑定数据源操作记录
【新手进阶】之十:工作日的计算
【新手进阶】之十一:“庖丁解牛”和“纪昌学射”——浅谈表格式文本数据的导入
【新手进阶】之十二:从四脚腾空的奔马谈起——原来界面可以这样设计
【新手进阶】之十三:Outlook风格导航界面
【新手进阶】之十四:仓库管理系统

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享分享 分享淘帖1 订阅订阅
2#
发表于 2014-11-19 07:13:51 来自手机 | 只看该作者

向楼主学习,有几个问题问一下。
1,为什么例子里面没有类似于command的按钮,没有按钮,怎么激发代码了?
2,为什么代码是sub开头,一般不都是private sub command-click()开头吗?
主要这两个。谢谢楼主的文章,很收益。
3#
 楼主| 发表于 2014-11-19 08:57:23 | 只看该作者
本帖最后由 roych 于 2014-11-19 09:10 编辑
cfedf 发表于 2014-11-19 07:13
向楼主学习,有几个问题问一下。
1,为什么例子里面没有类似于command的按钮,没有按钮,怎么激发代码了 ...

1、按F5运行就可以了。
如果非要按钮,也可以设置个按钮,然后
private sub command1_click()
call 函数名
end sub2、首先,我建立的是模块级别的过程,默认为公共模块(Public,这个谓词可以不加),在其它位置直接调用即可。如果加上私有化(Private)则只能在该模块运行,在其它地方调用时就会出现“子过程或函数未定义”的编译错误。
private sub command1_click()表示的是私有化按钮单击过程事件。只能在所隶属的窗体上执行。——一般情况下,是无法在别的窗体上调用本窗体的单击事件,如果需要这么做,往往只能在模块级别上写一个公共函数,然后互相调用。

4#
发表于 2014-11-19 11:52:00 来自手机 | 只看该作者
roych 发表于 2014-11-19 08:57
1、按F5运行就可以了。
如果非要按钮,也可以设置个按钮,然后
private sub command1_click()

你太厉害了。这样就不用一个按钮一段代码,call一下,多省事情。我正在研究你的例子,非常好。我想ado我终于知道怎么回事了。我先练着,有问题向你请教,非常感谢你的热心帮助。
5#
 楼主| 发表于 2014-11-19 11:58:16 | 只看该作者
cfedf 发表于 2014-11-19 11:52
你太厉害了。这样就不用一个按钮一段代码,call一下,多省事情。我正在研究你的例子,非常好。我想ado我 ...

懒嘛。我向来是个懒人~~
6#
发表于 2014-11-19 20:45:13 | 只看该作者
roych 发表于 2014-11-19 11:58
懒嘛。我向来是个懒人~~

楼主您好,请教个问题,你的代码我在你的文件里运行没问题,可是我把你的代码用到我的ACCESS中测试出问题了,我是直接复制黏贴你的代码.结果是这样的提示.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
7#
 楼主| 发表于 2014-11-20 09:08:18 | 只看该作者
cfedf 发表于 2014-11-19 20:45
楼主您好,请教个问题,你的代码我在你的文件里运行没问题,可是我把你的代码用到我的ACCESS中测试出问题了, ...

应该是没有引用库的问题吧。在VBE里点击“工具/引用”,然后选择 ADO 2.8库(Microsoft  ActiveX Data Object……)

点评

你太厉害了,我都不知道怎么感谢你.这下可以用了.  发表于 2014-11-20 09:49
8#
发表于 2014-11-22 16:42:37 | 只看该作者
老师,什么时候发表其他的基础文章呀?
9#
 楼主| 发表于 2014-11-22 18:08:50 | 只看该作者
wanlong3390 发表于 2014-11-22 16:42
老师,什么时候发表其他的基础文章呀?


先去淘贴里看看呀。
10#
发表于 2015-6-10 15:38:43 | 只看该作者
本帖最后由 wu8313 于 2015-6-14 19:39 编辑

GetString 非常好,谢谢指点。
可以把某个ACC本地表的所有行 转化为 一个字符串 mystring1(形如:1001;1002;1003),传递给 存储过程的文本型输入参数, 然后在SQL里面把这个文本型参数用表值函数转化成表t1.从而实现批量插入,更新,删除 。比如,delete from T1 where 工号 in (select * from t1)



您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-12-26 22:53 , Processed in 0.125185 second(s), 38 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表