Office中国论坛/Access中国论坛

标题: 【新手入门】之十三:浅谈ADO之Conmmand(上) [打印本页]

作者: roych    时间: 2014-11-12 10:31
标题: 【新手入门】之十三:浅谈ADO之Conmmand(上)
       今天,我们来学习下大家可能最不熟悉的一个子集——Command(命令)。
       命令的创建跟连接并没什么区别,同样可以这样写:
  1. Dim cmd As NewADODB.Command
复制代码
       或者
  1. Dim cmd AsADODB.Command
  2. Set cmd = NewADODB.Command
复制代码
      Command对象代表SQL命令,雷类似于Access中的查询,但一般指定连接字符串和SQL语句,再用执行方法即可处理。
现在我们回头看看上一节讲过的内容。上一节里我说过了,对于操作查询,连接可以直接通过Execute来执行就可以,而对于选择查询则需要创建一个记录集来存储信息,然后才能读取出来。
这一点对Command同样适用。现在,假设E盘有一个MyExcel文件,想读取里面的myExcel工作表中的某个值。我们该怎么做呢?
根据前面学到的知识,我们知道,首先需要创建一个记录集来存储数据,于是:
  1. Dim rst As NewADODB.Recordset
复制代码
      由于需要执行一个查询命令,因此需要创建一个Command对象:
  1. Dim cmd As NewADODB.Command
复制代码
      然后为这个命令指定参数:连接字符串和SQL命令。需要注意的是,对Excel文件常常需要加上美元符号($)作为工作表符:
  1. cmd.ActiveConnection= "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 4.0;DataSource=E:\myExcel.xls"
  2. cmd.CommandText= "select * from [myExcel$]"
复制代码
      最后把执行的命令赋值给记录集:Set rst = cmd.Execute并读取出来即可。完整代码如下:
  1. Sub myQuery()
  2. Dim cmd As NewADODB.Command
  3. Dim rst As NewADODB.Recordset
  4. cmd.ActiveConnection= "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 4.0;DataSource=E:\myExcel.xls"
  5. cmd.CommandText= "select * from [myExcel$]"
  6. Set rst =cmd.Execute
  7. Debug.Printrst(1)’在立即窗口上打印出来。
  8. End Sub
复制代码
      接下来,我们来个有些难度的:用Command对象执行参数查询。为此,我们先来看看参数查询的标准SQL语句:
  1. PARAMETERS 违规月份 Text ( 255 );
  2. SELECT  *
  3. FROM myTable
  4. WHERE myTable.违规月份=[违规月份];
复制代码
      和大家一样,我也很少用参数查询。这里还是简要说下吧:在Select前面加上这一个子句(别忘了输入分号哦),标识着这是一个参数查询,需要输入一个文本类型的参数:违规月份。当用户输入参数后,便用Where子句来接收输入值,作为条件进行查询。也就是说,“[违规月份]”是一个值,而不是myTable的一个字段。你也可以用别的参数名称来代替“违规月份”,但需要跟前面的参数一致。——我故意这样写,是为了考下大家是否知道这两者的区别。
       好了,扯远了。我们回来看看这个任务。根据上面提到的原理,就需要用Parameters来处理参数传递的问题了。代码如下:
  1. Sub parQuery()
  2. Dim rst As NewADODB.Recordset
  3. Dim cmd As NewADODB.Command
  4. Dim i As Long
  5. cmd.ActiveConnection= CurrentProject.Connection
  6. cmd.CommandText= "PARAMETERS 违规月份 Text ( 255 ); SELECT  * FROMmyTable WHERE 违规月份 =[违规月份]"
  7. cmd.CommandType= adCmdText
  8. Set rst =cmd.Execute(parameters:="1月")
  9. ’也可以按参数顺序来写:Set rst = cmd.Execute(,"1月")
  10.     Debug.Print rst(3)
  11. End Sub
复制代码
       似乎和前面几乎没太大区别。除了SQL语句外,唯一的区别就是在赋值给记录集时使用了参数。另外,我们知道,问号(?)表示任意字符,因此,参数查询同样可以简化为:
  1. SELECT * FROMmyTable WHERE 违规月份=?
复制代码
同样地,将这个语句换到上述的VBA语句里,同样是一个参数查询。这里就不再列出代码了,大家可以自行测试。
【新手入门】之一: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-13 07:23
没人讨论啊,那我来问几个问题,我是新手,可能问题很低级,希望楼主不要笑话。
作者: cfedf    时间: 2014-11-13 07:41
本帖最后由 cfedf 于 2014-11-13 07:52 编辑

    楼主在上文说到ado有五个子集,
ADO有五个子集。分别是
Connection(连接)、Command(命
令)、Recordset(记录集)、Record
(记录)和Stream(数据流)。
     那这几个子集作用是什么?是用connection连接数据源,通过command来查询,那recordset和record有什么用?
    因为我是在access里面操作,最好能在access里面说。谢谢楼主。


作者: roych    时间: 2014-11-13 09:13
cfedf 发表于 2014-11-13 07:41
楼主在上文说到ado有五个子集,
ADO有五个子集。分别是
Connection(连接)、Command(命

序言部分没认真看吧?
Record其实是Recordset的一个子集,只是记录集中的一条记录或者只有一条记录的记录集。由于创建记录集后就可以直接按要求选择所需记录,因此根本不必创建Record子集。Stream对象则代表数据流,一般用于文本类型或者长二进制等数据。
Connection部分是必须的。不管用Recordset还是Command,都需要先连接数据源。只是在Access里,默认有一个CurrentProject.Connection,所以不需要再次新建而已
作者: cfedf    时间: 2014-11-14 07:01
呵呵,问个具体的问题。

Sub parQuery()
Dim rst As NewADODB.Recordset
Dim cmd As NewADODB.Command
Dim i As Long
cmd.ActiveConnection=
CurrentProject.Connection
这段代码是不是不管什么时候都要用。还有代码是写在窗体里的文本控件框里吗?我现在有点感觉了对ado,就是没有法子去验证想法。
作者: roych    时间: 2014-11-14 08:59
本帖最后由 roych 于 2014-11-14 09:01 编辑
cfedf 发表于 2014-11-14 07:01
呵呵,问个具体的问题。

Sub parQuery()

       这是创建了一个数据连接,需要执行的命令文本或者记录集都还没有创建。如果需要展示数据或者执行命令,还需要写上SQL语句,或者将Command赋值给rst。这段代码一般是写在按钮的单击事件里。当然,也可以写在模块里。       等周末把Recordset部分写完,你系统地学习完之后,应该会有更大的收获。

作者: cfedf    时间: 2014-11-14 12:00
好,期待你的大作,最好能演示一下或给个例子,只要知道在哪里写代码,就好办了。现在对ado没具体印象,我看人家视频是在vb窗口连,没有练习很无奈。徒有杀龙术,却无龙儿杀。无奈无奈。
作者: cfedf    时间: 2014-11-15 10:56
roych 发表于 2014-11-14 08:59
这是创建了一个数据连接,需要执行的命令文本或者记录集都还没有创建。如果需要展示数据或者执行 ...

向楼主学习一下,我把我的理解说一下,看看对不对,感谢楼主指导。

Sub parQuery()
Dim rst As NewADODB.Recordset
定义rst为adodb.recordset

Dim cmd As NewADODB.Command
定义cmd为adodb.command

Dim i As Long
定义i为长型

cmd.ActiveConnection=
CurrentProject.Connection
激活cmd,问题是cmd不是command吗?

cmd.CommandText= "PARAMETERS
违规月份 Text ( 255 ); SELECT  *
FROMmyTable WHERE 违规月份 =[违
规月份]"
cmd.commandtext是什么?
text(255)是什么?

cmd.CommandType= adCmdText
把adcmdtext赋值给cmd.commandtext

Set rst =cmd.Execute(parameters:="1
月")
’也可以按参数顺序来写:Set rst =
cmd.Execute(,"1月")
执行cmd并把值给rst

Debug.Print rst(3)
打印rst(3),rst(3)是那里来的了?
End Sub

作者: roych    时间: 2014-11-15 17:51
cfedf 发表于 2014-11-15 10:56
向楼主学习一下,我把我的理解说一下,看看对不对,感谢楼主指导。

Sub parQuery()

见红色字体:
cmd.ActiveConnection=
CurrentProject.Connection
激活cmd,问题是cmd不是command吗?
---这不是激活,而是把数据连接赋予cmd对象。
cmd.CommandText= "PARAMETERS
违规月份 Text ( 255 ); SELECT  *
FROMmyTable WHERE 违规月份 =[违
规月份]"
cmd.commandtext是什么?
text(255)是什么?
----commandtext是需要执行的SQL命令语句。没有这个语句command对象不知道要执行什么。
----text(255)表示的需要输入的参数类型,也就是说,输入的参数必须为文本类型,字符串长度不能超过255。
cmd.CommandType= adCmdText
把adcmdtext赋值给cmd.commandtext
----这是命令类型,adCmdText表示的是最常用的文本型,还有其它的类型(如果需要将记录集保存到本地,——这一点将在Recordset里进行讨论,则可以是其它类型)。
Set rst =cmd.Execute(parameters:="1
月")
’也可以按参数顺序来写:Set rst =
cmd.Execute(,"1月")
执行cmd并把值给rst
--理解正确。
Debug.Print rst(3)
打印rst(3),rst(3)是那里来的了?
--rst(3)表示的是原记录集的第四个字段。如果没有那么多字段,这个将会出错。同理,rst(0)即第一个字段,如此类推。有需要的话,还可以设置循环。我这里暂时略过。
End Sub
作者: cfedf    时间: 2014-11-17 07:52
来象你学习,问一下,刘小军多条件查询,最后用的是dao,假如用ado,能查询吗?
作者: roych    时间: 2014-11-17 08:57
cfedf 发表于 2014-11-17 07:52
来象你学习,问一下,刘小军多条件查询,最后用的是dao,假如用ado,能查询吗?

基本没问题的。DAO与ADO有相当多交叉的属性和方法,只是写法有所差异而已。
作者: WFH6898    时间: 2015-11-13 09:29
有点深奥了,难懂
作者: cshiq    时间: 2016-1-17 06:00
浅谈ADO之Conmmand(上)
作者: Superleistung    时间: 2016-5-30 15:35
研究一下
作者: sunday1975    时间: 2016-11-29 14:32
小白白茫茫一片,多谢楼主分享




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