|
楼主 |
发表于 2016-4-20 22:31
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 hyefeifei 于 2016-5-16 15:01 编辑
凡是学sql的,几乎都是从scott数据库开始的,以后的讲解也要以这个库为例证,所以在这里把这个库提供给大家,见附件:
38-46.rar
(1.53 MB, 下载次数: 77)
在继续讲更新之前,先讲一下recordset的find方法和filter属性。
图一:
大家看图一这个表,deptno是部门编号,假如我想知道部门30所有人的工资,该如何做?
当然你会说用:
Select ename, sal from emp where deptno=30
就可以直接得到30部门的人员工资。
但这里我们要使用临时表得到结果,程序片断如下:
Set rst = CreateObject("adodb.recordset")
strSQL = "select * from emp"
rst.cursorlocation = adUseClient
rst.Open strSQL, Conn, adOpenStatic, adLockOptimistic, adCmdText
rst.Find "deptno=30"
Do While Not rst.EOF
Debug.Print rst!ename, rst!sal
rst.Find "deptno=30", 1
Loop
|
下面我们依次解释一下这段程序:
1.Strsql=”select * from emp”,要知道,临时表必须先用select语句把数据取回,才能操作,但这一句把所有数据都取回了,实际工作中表的数据可能好几十万,显然必须用where加以限定才可以,即你只需把要处理的数据取回即可,比如说你是财务人员,通常会把当月数据取回。
2.rst.cursorlocation=adUseClient,这句是设定客户端临时表,这句不加,会有什么后果?因为服务器端临时表是默认的,所以省了这句,就会形成服务器端临时表,当你继续后面的操作时,比如说这里后面要执行find方法,程序就会连到服务器,用sql服务器的系统存储过程创建游标,移动游标取数据,每次取几条数据,由recordset的cachesize属性决定,默认每次取1,操作完成后释放游标。
你注意到后面的程序,在do loop循环里使用find方法,这意味着频繁连数据库,移动游标取数据。
所以结论是:虽然服务器端临时表也可以用find方法,但你应该或者说建议你只有在客户端临时表时才用find方法,这也适用于后面要讲到的filter属性。
3.rst.Open strSQL, Conn, adOpenStatic, adLockOptimistic, adCmdText
Recordset的open方法,第三个参数为以什么方法形成临时表,adopenstatic为静态临时表,当cursorlocation属性为adUseClient时,也就是说对本地临时表,这个参数无论取什么值,都是静态临时表,或者说这个参数可省略。
因为建议大家做程序时,总是要用客户端临时表,所以这个参数无所谓,但还是建议大家明确地取adopenstatic,表明为静态临时表。
adLockOptimistic这个参数好象前面讲了,有空再细讲,这里就不说了。
adCmdText:它是告诉ado,strsql里放的是sql语句,这个参数如果你取别的值,比如adCmdTable,那么,程序要改为:
strSQL = "emp"
rst.cursorlocation = adUseClient
rst.OpenstrSQL, Conn, adOpenStatic, adLockOptimistic, adCmdTable
……
当执行到open方法时,ado会把命令翻译为标准的sql语句select * from emp提交给服务器。建议不要这样做,这种简单的sql语句还是我们直接提供好了,不要让ado费事再转一次。当然复杂的语句它也转不了。
4.rst.Find "deptno=30",find是个方法,但这句你写成rst.find=”deptno=30”时,程序也能正常运行,不知为何。
5.rst.Find "deptno=30", 1,循环里一定要加这句,否则成死循环了。执行find方法,当找到符合条件的记录时,它会把这个记录置为当前记录,第二个参数设定从当前记录向后多少条记录开始查找,省略时,当然是从当前记录查找,设为1是,是说要从当前记录的下1条记录开始查找,2时为从当然记录的下2条记录开始查找,依此类推。
|
|
|