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