Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開始

12下一頁(yè)
返回列表 發(fā)新帖
查看: 18028|回復(fù): 14
打印 上一主題 下一主題

[ADO/DAO] 【新手入門】之十三:淺談ADO之Conmmand(上)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2014-11-12 10:31:25 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
       今天,我們來學(xué)習(xí)下大家可能最不熟悉的一個(gè)子集——Command(命令)。
       命令的創(chuàng)建跟連接并沒什么區(qū)別,同樣可以這樣寫:
  1. Dim cmd As NewADODB.Command
復(fù)制代碼
       或者
  1. Dim cmd AsADODB.Command
  2. Set cmd = NewADODB.Command
復(fù)制代碼
      Command對(duì)象代表SQL命令,雷類似于Access中的查詢,但一般指定連接字符串和SQL語(yǔ)句,再用執(zhí)行方法即可處理。
現(xiàn)在我們回頭看看上一節(jié)講過的內(nèi)容。上一節(jié)里我說過了,對(duì)于操作查詢,連接可以直接通過Execute來執(zhí)行就可以,而對(duì)于選擇查詢則需要?jiǎng)?chuàng)建一個(gè)記錄集來存儲(chǔ)信息,然后才能讀取出來。
這一點(diǎn)對(duì)Command同樣適用,F(xiàn)在,假設(shè)E盤有一個(gè)MyExcel文件,想讀取里面的myExcel工作表中的某個(gè)值。我們?cè)撛趺醋瞿兀?/div>
根據(jù)前面學(xué)到的知識(shí),我們知道,首先需要?jiǎng)?chuàng)建一個(gè)記錄集來存儲(chǔ)數(shù)據(jù),于是:
  1. Dim rst As NewADODB.Recordset
復(fù)制代碼
      由于需要執(zhí)行一個(gè)查詢命令,因此需要?jiǎng)?chuàng)建一個(gè)Command對(duì)象:
  1. Dim cmd As NewADODB.Command
復(fù)制代碼
      然后為這個(gè)命令指定參數(shù):連接字符串和SQL命令。需要注意的是,對(duì)Excel文件常常需要加上美元符號(hào)($)作為工作表符:
  1. cmd.ActiveConnection= "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 4.0;DataSource=E:\myExcel.xls"
  2. cmd.CommandText= "select * from [myExcel$]"
復(fù)制代碼
      最后把執(zhí)行的命令賦值給記錄集: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
復(fù)制代碼
      接下來,我們來個(gè)有些難度的:用Command對(duì)象執(zhí)行參數(shù)查詢。為此,我們先來看看參數(shù)查詢的標(biāo)準(zhǔn)SQL語(yǔ)句:
  1. PARAMETERS 違規(guī)月份 Text ( 255 );
  2. SELECT  *
  3. FROM myTable
  4. WHERE myTable.違規(guī)月份=[違規(guī)月份];
復(fù)制代碼
      和大家一樣,我也很少用參數(shù)查詢。這里還是簡(jiǎn)要說下吧:在Select前面加上這一個(gè)子句(別忘了輸入分號(hào)哦),標(biāo)識(shí)著這是一個(gè)參數(shù)查詢,需要輸入一個(gè)文本類型的參數(shù):違規(guī)月份。當(dāng)用戶輸入?yún)?shù)后,便用Where子句來接收輸入值,作為條件進(jìn)行查詢。也就是說,“[違規(guī)月份]”是一個(gè)值,而不是myTable的一個(gè)字段。你也可以用別的參數(shù)名稱來代替“違規(guī)月份”,但需要跟前面的參數(shù)一致!夜室膺@樣寫,是為了考下大家是否知道這兩者的區(qū)別。
       好了,扯遠(yuǎn)了。我們回來看看這個(gè)任務(wù)。根據(jù)上面提到的原理,就需要用Parameters來處理參數(shù)傳遞的問題了。代碼如下:
  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 違規(guī)月份 Text ( 255 ); SELECT  * FROMmyTable WHERE 違規(guī)月份 =[違規(guī)月份]"
  7. cmd.CommandType= adCmdText
  8. Set rst =cmd.Execute(parameters:="1月")
  9. ’也可以按參數(shù)順序來寫:Set rst = cmd.Execute(,"1月")
  10.     Debug.Print rst(3)
  11. End Sub
復(fù)制代碼
       似乎和前面幾乎沒太大區(qū)別。除了SQL語(yǔ)句外,唯一的區(qū)別就是在賦值給記錄集時(shí)使用了參數(shù)。另外,我們知道,問號(hào)(?)表示任意字符,因此,參數(shù)查詢同樣可以簡(jiǎn)化為:
  1. SELECT * FROMmyTable WHERE 違規(guī)月份=?
復(fù)制代碼
同樣地,將這個(gè)語(yǔ)句換到上述的VBA語(yǔ)句里,同樣是一個(gè)參數(shù)查詢。這里就不再列出代碼了,大家可以自行測(cè)試。
【新手入門】之一:If分支語(yǔ)句
【新手入門】之二:分支語(yǔ)句總結(jié)
【新手入門】之三:循環(huán)語(yǔ)句For
【新手入門】之四:循環(huán)語(yǔ)句Do和死循環(huán)
【新手入門】之五:公共變量與傳址過程、傳值過程
【新手入門】之六:“悲歡離合總無(wú)情”——淺談Split和Join
【新手入門】之七:嵌套與并列——再談If流程問題
【新手入門】之八:“連就連”——淺談“&”和“+”連接符的區(qū)別

【新手入門】之九:從百錢百雞談起——淺談“規(guī)劃求解”兼答lingjiang問
【新手入門】之十:書到用時(shí)方恨少——自定義菜單(Access 2003)的制作
【新手入門】之十一:淺談ADO之序言
【新手入門】之十二:淺談ADO之Connection
【新手入門】之十三:淺談ADO之Conmmand(上)
【新手入門】之十四:淺談ADO之Command(下)
【新手入門】之十五:淺談ADO之Recordset(上)
【新手入門】之十六:淺談ADO之Recordset(下)
【新手入門】之十七:淺談列表框的使用
【新手入門】之十八:雙擊列表框修改數(shù)據(jù)
【新手入門】之十九:從“書與女友恕不外借”談起——淺談“Bookmark”的使用
【新手入門】之二十:“書與書簽”——bookmark屬性答疑
【新手入門】之二十一:記錄集的“凌遲”——逐條導(dǎo)出記錄集

【新手進(jìn)階】之一:基礎(chǔ)算法(一)
【新手進(jìn)階】之二:基礎(chǔ)算法(二)
【新手進(jìn)階】之三:基礎(chǔ)算法(三)
【新手進(jìn)階】之四:基礎(chǔ)算法(四)
【新手進(jìn)階】之五:排序搜索(一)
【新手進(jìn)階】之六:排序搜索(二)
【新手進(jìn)階】之七:遞歸算法
【新手進(jìn)階】之八:冒泡排序
【新手進(jìn)階】之九:淺談不綁定數(shù)據(jù)源操作記錄
【新手進(jìn)階】之十:工作日的計(jì)算
【新手進(jìn)階】之十一:“庖丁解!焙汀凹o(jì)昌學(xué)射”——淺談表格式文本數(shù)據(jù)的導(dǎo)入
【新手進(jìn)階】之十二:從四腳騰空的奔馬談起——原來界面可以這樣設(shè)計(jì)
【新手進(jìn)階】之十三:Outlook風(fēng)格導(dǎo)航界面
【新手進(jìn)階】之十四:倉(cāng)庫(kù)管理系統(tǒng)

本帖被以下淘專輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖1 訂閱訂閱
2#
發(fā)表于 2014-11-13 07:23:46 來自手機(jī) | 只看該作者
沒人討論啊,那我來問幾個(gè)問題,我是新手,可能問題很低級(jí),希望樓主不要笑話。
3#
發(fā)表于 2014-11-13 07:41:26 來自手機(jī) | 只看該作者
本帖最后由 cfedf 于 2014-11-13 07:52 編輯

    樓主在上文說到ado有五個(gè)子集,
ADO有五個(gè)子集。分別是
Connection(連接)、Command(命
令)、Recordset(記錄集)、Record
(記錄)和Stream(數(shù)據(jù)流)。
     那這幾個(gè)子集作用是什么?是用connection連接數(shù)據(jù)源,通過command來查詢,那recordset和record有什么用?
    因?yàn)槲沂窃赼ccess里面操作,最好能在access里面說。謝謝樓主。

4#
 樓主| 發(fā)表于 2014-11-13 09:13:01 | 只看該作者
cfedf 發(fā)表于 2014-11-13 07:41
樓主在上文說到ado有五個(gè)子集,
ADO有五個(gè)子集。分別是
Connection(連接)、Command(命

序言部分沒認(rèn)真看吧?
Record其實(shí)是Recordset的一個(gè)子集,只是記錄集中的一條記錄或者只有一條記錄的記錄集。由于創(chuàng)建記錄集后就可以直接按要求選擇所需記錄,因此根本不必創(chuàng)建Record子集。Stream對(duì)象則代表數(shù)據(jù)流,一般用于文本類型或者長(zhǎng)二進(jìn)制等數(shù)據(jù)。
Connection部分是必須的。不管用Recordset還是Command,都需要先連接數(shù)據(jù)源。只是在Access里,默認(rèn)有一個(gè)CurrentProject.Connection,所以不需要再次新建而已
5#
發(fā)表于 2014-11-14 07:01:41 來自手機(jī) | 只看該作者
呵呵,問個(gè)具體的問題。

Sub parQuery()
Dim rst As NewADODB.Recordset
Dim cmd As NewADODB.Command
Dim i As Long
cmd.ActiveConnection=
CurrentProject.Connection
這段代碼是不是不管什么時(shí)候都要用。還有代碼是寫在窗體里的文本控件框里嗎?我現(xiàn)在有點(diǎn)感覺了對(duì)ado,就是沒有法子去驗(yàn)證想法。
6#
 樓主| 發(fā)表于 2014-11-14 08:59:54 | 只看該作者
本帖最后由 roych 于 2014-11-14 09:01 編輯
cfedf 發(fā)表于 2014-11-14 07:01
呵呵,問個(gè)具體的問題。

Sub parQuery()

       這是創(chuàng)建了一個(gè)數(shù)據(jù)連接,需要執(zhí)行的命令文本或者記錄集都還沒有創(chuàng)建。如果需要展示數(shù)據(jù)或者執(zhí)行命令,還需要寫上SQL語(yǔ)句,或者將Command賦值給rst。這段代碼一般是寫在按鈕的單擊事件里。當(dāng)然,也可以寫在模塊里。       等周末把Recordset部分寫完,你系統(tǒng)地學(xué)習(xí)完之后,應(yīng)該會(huì)有更大的收獲。
7#
發(fā)表于 2014-11-14 12:00:37 來自手機(jī) | 只看該作者
好,期待你的大作,最好能演示一下或給個(gè)例子,只要知道在哪里寫代碼,就好辦了,F(xiàn)在對(duì)ado沒具體印象,我看人家視頻是在vb窗口連,沒有練習(xí)很無(wú)奈。徒有殺龍術(shù),卻無(wú)龍兒殺。無(wú)奈無(wú)奈。
8#
發(fā)表于 2014-11-15 10:56:52 來自手機(jī) | 只看該作者
roych 發(fā)表于 2014-11-14 08:59
這是創(chuàng)建了一個(gè)數(shù)據(jù)連接,需要執(zhí)行的命令文本或者記錄集都還沒有創(chuàng)建。如果需要展示數(shù)據(jù)或者執(zhí)行 ...

向樓主學(xué)習(xí)一下,我把我的理解說一下,看看對(duì)不對(duì),感謝樓主指導(dǎo)。

Sub parQuery()
Dim rst As NewADODB.Recordset
定義rst為adodb.recordset

Dim cmd As NewADODB.Command
定義cmd為adodb.command

Dim i As Long
定義i為長(zhǎng)型

cmd.ActiveConnection=
CurrentProject.Connection
激活cmd,問題是cmd不是command嗎?

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

cmd.CommandType= adCmdText
把a(bǔ)dcmdtext賦值給cmd.commandtext

Set rst =cmd.Execute(parameters:="1
月")
’也可以按參數(shù)順序來寫:Set rst =
cmd.Execute(,"1月")
執(zhí)行cmd并把值給rst

Debug.Print rst(3)
打印rst(3),rst(3)是那里來的了?
End Sub
9#
 樓主| 發(fā)表于 2014-11-15 17:51:20 | 只看該作者
cfedf 發(fā)表于 2014-11-15 10:56
向樓主學(xué)習(xí)一下,我把我的理解說一下,看看對(duì)不對(duì),感謝樓主指導(dǎo)。

Sub parQuery()

見紅色字體:
cmd.ActiveConnection=
CurrentProject.Connection
激活cmd,問題是cmd不是command嗎?
---這不是激活,而是把數(shù)據(jù)連接賦予cmd對(duì)象。
cmd.CommandText= "PARAMETERS
違規(guī)月份 Text ( 255 ); SELECT  *
FROMmyTable WHERE 違規(guī)月份 =[違
規(guī)月份]"
cmd.commandtext是什么?
text(255)是什么?
----commandtext是需要執(zhí)行的SQL命令語(yǔ)句。沒有這個(gè)語(yǔ)句command對(duì)象不知道要執(zhí)行什么。
----text(255)表示的需要輸入的參數(shù)類型,也就是說,輸入的參數(shù)必須為文本類型,字符串長(zhǎng)度不能超過255。
cmd.CommandType= adCmdText
把a(bǔ)dcmdtext賦值給cmd.commandtext
----這是命令類型,adCmdText表示的是最常用的文本型,還有其它的類型(如果需要將記錄集保存到本地,——這一點(diǎn)將在Recordset里進(jìn)行討論,則可以是其它類型)。
Set rst =cmd.Execute(parameters:="1
月")
’也可以按參數(shù)順序來寫:Set rst =
cmd.Execute(,"1月")
執(zhí)行cmd并把值給rst
--理解正確。
Debug.Print rst(3)
打印rst(3),rst(3)是那里來的了?
--rst(3)表示的是原記錄集的第四個(gè)字段。如果沒有那么多字段,這個(gè)將會(huì)出錯(cuò)。同理,rst(0)即第一個(gè)字段,如此類推。有需要的話,還可以設(shè)置循環(huán)。我這里暫時(shí)略過。
End Sub
10#
發(fā)表于 2014-11-17 07:52:08 來自手機(jī) | 只看該作者
來象你學(xué)習(xí),問一下,劉小軍多條件查詢,最后用的是dao,假如用ado,能查詢嗎?
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2025-7-13 02:21 , Processed in 0.120444 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表