Office中國論壇/Access中國論壇
標題: 【新手入門】之十三:淺談ADO之Conmmand(上) [打印本頁]
作者: roych 時間: 2014-11-12 10:31
標題: 【新手入門】之十三:淺談ADO之Conmmand(上)
今天,我們來學(xué)習(xí)下大家可能最不熟悉的一個子集——Command(命令)。
命令的創(chuàng)建跟連接并沒什么區(qū)別,同樣可以這樣寫:
- Dim cmd As NewADODB.Command
復(fù)制代碼 或者
- Dim cmd AsADODB.Command
- Set cmd = NewADODB.Command
復(fù)制代碼 Command對象代表SQL命令,雷類似于Access中的查詢,但一般指定連接字符串和SQL語句,再用執(zhí)行方法即可處理。
現(xiàn)在我們回頭看看上一節(jié)講過的內(nèi)容。上一節(jié)里我說過了,對于操作查詢,連接可以直接通過Execute來執(zhí)行就可以,而對于選擇查詢則需要創(chuàng)建一個記錄集來存儲信息,然后才能讀取出來。
這一點對Command同樣適用,F(xiàn)在,假設(shè)E盤有一個MyExcel文件,想讀取里面的myExcel工作表中的某個值。我們該怎么做呢?
根據(jù)前面學(xué)到的知識,我們知道,首先需要創(chuàng)建一個記錄集來存儲數(shù)據(jù),于是:
- Dim rst As NewADODB.Recordset
復(fù)制代碼 由于需要執(zhí)行一個查詢命令,因此需要創(chuàng)建一個Command對象:
- Dim cmd As NewADODB.Command
復(fù)制代碼 然后為這個命令指定參數(shù):連接字符串和SQL命令。需要注意的是,對Excel文件常常需要加上美元符號($)作為工作表符:
- cmd.ActiveConnection= "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 4.0;DataSource=E:\myExcel.xls"
- cmd.CommandText= "select * from [myExcel$]"
復(fù)制代碼 最后把執(zhí)行的命令賦值給記錄集: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
復(fù)制代碼 接下來,我們來個有些難度的:用Command對象執(zhí)行參數(shù)查詢。為此,我們先來看看參數(shù)查詢的標準SQL語句:
- PARAMETERS 違規(guī)月份 Text ( 255 );
- SELECT *
- FROM myTable
- WHERE myTable.違規(guī)月份=[違規(guī)月份];
復(fù)制代碼 和大家一樣,我也很少用參數(shù)查詢。這里還是簡要說下吧:在Select前面加上這一個子句(別忘了輸入分號哦),標識著這是一個參數(shù)查詢,需要輸入一個文本類型的參數(shù):違規(guī)月份。當用戶輸入?yún)?shù)后,便用Where子句來接收輸入值,作為條件進行查詢。也就是說,“[違規(guī)月份]”是一個值,而不是myTable的一個字段。你也可以用別的參數(shù)名稱來代替“違規(guī)月份”,但需要跟前面的參數(shù)一致!夜室膺@樣寫,是為了考下大家是否知道這兩者的區(qū)別。
好了,扯遠了。我們回來看看這個任務(wù)。根據(jù)上面提到的原理,就需要用Parameters來處理參數(shù)傳遞的問題了。代碼如下:
- Sub parQuery()
- Dim rst As NewADODB.Recordset
- Dim cmd As NewADODB.Command
- Dim i As Long
- cmd.ActiveConnection= CurrentProject.Connection
- cmd.CommandText= "PARAMETERS 違規(guī)月份 Text ( 255 ); SELECT * FROMmyTable WHERE 違規(guī)月份 =[違規(guī)月份]"
- cmd.CommandType= adCmdText
- Set rst =cmd.Execute(parameters:="1月")
- ’也可以按參數(shù)順序來寫:Set rst = cmd.Execute(,"1月")
- Debug.Print rst(3)
- End Sub
復(fù)制代碼 似乎和前面幾乎沒太大區(qū)別。除了SQL語句外,唯一的區(qū)別就是在賦值給記錄集時使用了參數(shù)。另外,我們知道,問號(?)表示任意字符,因此,參數(shù)查詢同樣可以簡化為:
- SELECT * FROMmyTable WHERE 違規(guī)月份=?
復(fù)制代碼 同樣地,將這個語句換到上述的VBA語句里,同樣是一個參數(shù)查詢。這里就不再列出代碼了,大家可以自行測試。
作者: 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(數(shù)據(jù)流)。
那這幾個子集作用是什么?是用connection連接數(shù)據(jù)源,通過command來查詢,那recordset和record有什么用?
因為我是在access里面操作,最好能在access里面說。謝謝樓主。
作者: roych 時間: 2014-11-13 09:13
序言部分沒認真看吧?
Record其實是Recordset的一個子集,只是記錄集中的一條記錄或者只有一條記錄的記錄集。由于創(chuàng)建記錄集后就可以直接按要求選擇所需記錄,因此根本不必創(chuàng)建Record子集。Stream對象則代表數(shù)據(jù)流,一般用于文本類型或者長二進制等數(shù)據(jù)。
Connection部分是必須的。不管用Recordset還是Command,都需要先連接數(shù)據(jù)源。只是在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
這段代碼是不是不管什么時候都要用。還有代碼是寫在窗體里的文本控件框里嗎?我現(xiàn)在有點感覺了對ado,就是沒有法子去驗證想法。
作者: roych 時間: 2014-11-14 08:59
本帖最后由 roych 于 2014-11-14 09:01 編輯
這是創(chuàng)建了一個數(shù)據(jù)連接,需要執(zhí)行的命令文本或者記錄集都還沒有創(chuàng)建。如果需要展示數(shù)據(jù)或者執(zhí)行命令,還需要寫上SQL語句,或者將Command賦值給rst。這段代碼一般是寫在按鈕的單擊事件里。當然,也可以寫在模塊里。 等周末把Recordset部分寫完,你系統(tǒng)地學(xué)習(xí)完之后,應(yīng)該會有更大的收獲。
作者: cfedf 時間: 2014-11-14 12:00
好,期待你的大作,最好能演示一下或給個例子,只要知道在哪里寫代碼,就好辦了,F(xiàn)在對ado沒具體印象,我看人家視頻是在vb窗口連,沒有練習(xí)很無奈。徒有殺龍術(shù),卻無龍兒殺。無奈無奈。
作者: cfedf 時間: 2014-11-15 10:56
roych 發(fā)表于 2014-11-14 08:59
這是創(chuàng)建了一個數(shù)據(jù)連接,需要執(zhí)行的命令文本或者記錄集都還沒有創(chuàng)建。如果需要展示數(shù)據(jù)或者執(zhí)行 ...
向樓主學(xué)習(xí)一下,我把我的理解說一下,看看對不對,感謝樓主指導(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為長型
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
把adcmdtext賦值給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
作者: roych 時間: 2014-11-15 17:51
見紅色字體:
cmd.ActiveConnection=
CurrentProject.Connection
激活cmd,問題是cmd不是command嗎?
---這不是激活,而是把數(shù)據(jù)連接賦予cmd對象。
cmd.CommandText= "PARAMETERS
違規(guī)月份 Text ( 255 ); SELECT *
FROMmyTable WHERE 違規(guī)月份 =[違
規(guī)月份]"
cmd.commandtext是什么?
text(255)是什么?
----commandtext是需要執(zhí)行的SQL命令語句。沒有這個語句command對象不知道要執(zhí)行什么。
----text(255)表示的需要輸入的參數(shù)類型,也就是說,輸入的參數(shù)必須為文本類型,字符串長度不能超過255。
cmd.CommandType= adCmdText
把adcmdtext賦值給cmd.commandtext
----這是命令類型,adCmdText表示的是最常用的文本型,還有其它的類型(如果需要將記錄集保存到本地,——這一點將在Recordset里進行討論,則可以是其它類型)。
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)表示的是原記錄集的第四個字段。如果沒有那么多字段,這個將會出錯。同理,rst(0)即第一個字段,如此類推。有需要的話,還可以設(shè)置循環(huán)。我這里暫時略過。
End Sub
作者: cfedf 時間: 2014-11-17 07:52
來象你學(xué)習(xí),問一下,劉小軍多條件查詢,最后用的是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://mzhfr.cn/) |
Powered by Discuz! X3.3 |