ADO在excel中的應用基礎(chǔ)資料_第1頁
ADO在excel中的應用基礎(chǔ)資料_第2頁
ADO在excel中的應用基礎(chǔ)資料_第3頁
ADO在excel中的應用基礎(chǔ)資料_第4頁
ADO在excel中的應用基礎(chǔ)資料_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第12課ADO在EXCEL中應用基礎(chǔ)(QEE用)一、ADO的概念這一部分是不得不講,卻又很難講清的部分,當你以后能熟練使用 ADO的時候,你可能會把這些“概念”全部忘掉了,但如果你從未了解過 ADO的這些概念,它會始終困擾你,甚至影響你繼續(xù)學習的信心。但是要想完全真正理解這些概念, 對我們幾乎是不可能的。 我的理論水平也非常有限, 下面只就ADO涉及的最常用的概念給出一些盡可能“易于理解”的說明,首先聲明:這些概念不是官方的嚴謹敘述,更象是“演義” ,目的只是讓初學的朋友知道“是那么回事”或者產(chǎn)生一個“朦朦朧朧的印象”,如果有對ADO相關(guān)理論感性趣的朋友,請參考MSDN(MicrosoftDeveloperNetwork)的文檔。概念1:什么是ADO?ActiveXDataObjects:ActiveX數(shù)據(jù)對象我從未見過有人給出“ActiveX”的漢語翻譯,不過僅從后面的兩個英文單詞,我們已經(jīng)可以知道ADO是一種數(shù)據(jù)對象。數(shù)據(jù)對象嘛,其作用就是用來管理數(shù)據(jù)的。當然管理數(shù)據(jù)的不一定非得是數(shù)據(jù)對象,數(shù)據(jù)對象也不是可以管理所有的數(shù)據(jù)。(繞口令呵)對數(shù)據(jù)的管理我們可以不使用任何對象,而只使用普通的代碼來完成;也可以使用數(shù)據(jù)對象來做,至于選用何種方式,主要取決于哪種方式更適合(有時也取決于寫代碼者的偏好)!問題是,怎么知道哪種方式更適合呢,當然你必要要了解各種方式,今天我們要了解的是ADO!在這個概念中,我已經(jīng)初步回答了 ADO的作用。更多的進一步的回答我放在后面的實戰(zhàn)中:-)。概念2:什么是 ActiveX?在很早以前,我曾經(jīng)問過我的一個朋友: ActiveX是什么意思?他回答是: 一種商標的名字。當時我確實注意到, ActiveX 后面有一個 (R),我是學經(jīng)濟類專業(yè)的,知道 (R)是注冊商標的意思。所以在很長時間我不再去追究它的具體含義,商標的名字有什么好研究的。再后來,無意中看到了些關(guān)于ActiveX更多的介紹,現(xiàn)在,我還是覺得我朋友給我的解釋最好,大道至簡!科學的東西從來都不復雜。但我還是要給大家介紹一下我所看的相關(guān)介紹,先要來了解另一個概念。概念3:什么是 OLE?OLE是ObjectLinkingandEmbedding,對象鏈接與嵌入技術(shù)OLE是封裝了一些軟件(對象)的庫文件,這個庫文件通常稱為“部件” ,它有幾個特征:(1)它是可運行代碼2)它是可被其它外部應用程序調(diào)用的代碼3)外部程序可以重復調(diào)用庫中的代碼,通常稱為代碼重用大家可以看出,上面的三個特征都與“類”有關(guān),這就是為什么說“類”是部件的基礎(chǔ)的原因。扯遠了,趕緊回來。那么OLE和ActiveX有什么關(guān)系呢?當發(fā)展到網(wǎng)絡(luò)時代的時候,OLE需要能夠與Web瀏覽器交互,嵌入到網(wǎng)頁中,隨網(wǎng)頁傳送到客戶的瀏覽器上,并在客戶端執(zhí)行。這個時候,OLE的基礎(chǔ)技術(shù)也有了發(fā)展,就是我們常聽說的COM(ComponentObjectModel,部件對象模型),我們不再去討論 COM了,不然就越說越遠了。按照一般的升級命名原則,這時應該叫OLE2.0,但微軟給OLE改名了,它就是ActiveX。所以可以說,ActiveX其實就是 OLE2.0,或者是支持網(wǎng)頁技術(shù)的 OLE。大家知道,由于互聯(lián)網(wǎng)本身具有安全問題,訪問速度遠低于本地訪問速度等一些特殊性,ActiveX部件通常還有如下特征:1)一般都提供“代碼簽名”或要求注冊使用,以保證其安全性。2)占用內(nèi)存盡可能小,效率(速度)盡可能高。但這也不是絕對的,隨著網(wǎng)速的提升,很多ActiveX部件的制作要求也在下降。到這兒,大家再統(tǒng)起來看看ActiveXDataObjects,是不是對這幾個詞有了一個是“朦朧”的印象了~~~概念4:什么是關(guān)系數(shù)據(jù)庫?ADO管理的是數(shù)據(jù),其實這里的數(shù)據(jù)通常情況下是“關(guān)系數(shù)據(jù)” ,這些“關(guān)系數(shù)據(jù)”的集合稱為關(guān)系數(shù)據(jù)庫。何謂“關(guān)系”,簡而言之,即“表格” 。這樣,關(guān)系數(shù)據(jù)庫的含義就是由“表格”組成的數(shù)據(jù)庫。這樣解釋可能出乎很多朋友的意料,但這個解釋肯定錯不了。我不再去細說這個“表格”,說的多了,只會讓人糊涂。只說一些我們后面有用的:表格的列一般稱為字段,每一列(字段)都具有相同的類型表格的行一般稱為記錄。一行稱為一條記錄。大家記住一點:當我們打算使用ADO來管理EXCEL數(shù)據(jù)時,這個數(shù)據(jù)區(qū)域一定要可以被看做“表格”,它的每一列要保證相同的類型,舉個例子說,不能有些是日期,而另外一些是文本或數(shù)字類型。概念5:什么是 SQL?SQL:StucturedQueryLanguage結(jié)構(gòu)化查詢語言ADO管理數(shù)據(jù),是通過連接OLEDB驅(qū)動來完成的(OLEDatabase這個詞不用解釋了吧,大家看名字就知道是干什么活的),真正的數(shù)據(jù)管理者是OLEDB,管理嘛,當然要使用語言了,OLEDB使用的語言就是SQL。所以,SQL對我們來說,是使用OLEDB的核心,也就成為使用ADO的核心內(nèi)容,你要發(fā)布管理數(shù)據(jù)的“命令”必須使用SQL語言。不會SQL就無法管理數(shù)據(jù),也就談不上使用ADO。這里我們知道了ADO和SQL的關(guān)系了。簡單介紹SQL的歷史。SQL是關(guān)系數(shù)據(jù)庫研究的產(chǎn)物,他是美國的一位博士于上世紀70年代最先提出,80年代美國國家標準局(ANSI)制訂發(fā)布了SQL美國國家標準,并被國際標準化組織(ISO)所接受。這樣,隨著SQL標準地位的確定,很多數(shù)據(jù)庫廠家都紛紛采用,SQL也就成了最流行的數(shù)據(jù)庫語言。但各家在采用SQL,都對“標準”SQL進行了擴充和改動,形成了很多“方言”,OLEDB采用的SQL也是方言之一。其它概念我們將在后面遇到時再講。請大家多看幾遍。以后就可以放下這些概念問題,而把更多的注意力放在ADO的實際應用上。5分鐘后,我們進入ADO的實戰(zhàn)。問:WORD中郵件合并打印功能是不是就是用了您說的 OLE?答:是。大家看看 ,能理解多少就理解多少二、ADO代碼步驟從現(xiàn)在起,我們需要同步互動。請打開你下載的《模擬數(shù)據(jù) .xls》,進入VBE,插入一個模塊,先寫下這樣一個框架SubAdo0()EndSub我們下面以“查詢”為例介紹 ADO的工作步驟。使用 ADO工作共有五個步驟:步驟1:創(chuàng)建ADO對象。我們只介紹最常用兩個ADO對象Connection和Recordset,Record(記錄)對象表示Recordset(記錄集)對象中的一條記錄,我們也會提到。Connection對象代表打開的、與數(shù)據(jù)源的連接。Recordset對象表示的是來自基本表或命令執(zhí)行結(jié)果的記錄全集。上面的概念來自 ADO的幫助文檔,現(xiàn)在覺得抽象不要緊, 關(guān)鍵是后面學會怎么用它們就行。創(chuàng)建ADO對象方法 1:使用VBA的CreateObject函數(shù)。DimcnnAsObject,rstAsObjectSetcnn=CreateObject("ADODB.Connection")Setrst=CreateObject("ADODB.Recordset")上面語句為我們創(chuàng)建了兩個 ADO對象。創(chuàng)建ADO對象方法 2:添加工程引用這個方法首先通過 VBE“工具”菜單 -引用,在“引用”列表中找到MicrosoftActiveXDataObjects2.xLibrary勾選后確定。應盡量選擇高一點版本。然后就可以使用下面的代碼創(chuàng)建 ADO對象:DimcnnAsADODB.ConnectionSetcnn=NewADODB.Connection也可以在聲明是直接創(chuàng)建,上面代碼寫為:DimcnnAsNewADODB.Connection創(chuàng)建ADO對象的方法使用上面的兩種方法之一即可,第二種方法的好處是可以在編輯代碼時“自動列出對象成員”,后面的代碼我們將采用這種方法?,F(xiàn)在,請在你的 SubAdo0中寫入如下代碼(后三行我們后面會用到)DimcnnAsNewADODB.ConnectionDimrstAsNewADODB.RecordsetDimSqlAsStringDimiAsIntegerDimjAsInteger

:步驟

2:建立連接創(chuàng)建了ADO對象后,首先要做的就是為 Connection對象指定連接的數(shù)據(jù)源。ADO持的

建立連接是通過 OLEDB進行的,OLEDB的驅(qū)動種類有很多,對OLEDB連接方式有兩種:

EXCEL

而言,支ODBC(OpenDatabaseConnectivety)開放數(shù)據(jù)庫連接JET(JointEngineTechnology

)連接引擎技術(shù)ODBC是早期的 OLEDB驅(qū)動,它對系統(tǒng)的底層依賴和限制過多,且以“效率最低”著稱,相對而言,JET更為靈活高效,所以我們只介紹 JET連接。不是 ODBC沒用,對早期的某些數(shù)據(jù)源,因為 JET沒有提供支持,或者你的機器上沒有 JET驅(qū)動(可能性不大),還是必須使用ODBC的。建立連接是通過使用Connection對象的

Connection對象的 OpenProvider和ConnectionString

方法來完成的,在打開連接前,需要先設(shè)置屬性。下面代碼為前面創(chuàng)建的 cnn對象建立連接:Withcnn.ConnectionString = "Extended Properties='Excel 8.0;Hdr=Yes;';Data Source=" &ThisWorkbook.FullName.OpenEndWith上面with語句體中,第一句為面說明一下第二句:

cnn

指定OLE DB驅(qū)動提供者為

,下ExtendedProperties='Excel8.0;Hdr=Yes; 表示要連接的數(shù)據(jù)源是 EXCEL文件,Hdr=Yes表示后面對數(shù)據(jù)源進行查詢時,將要查詢的“表”區(qū)域的第一行做為表頭區(qū), 即每一列的第一行作為“字段名”,第二行起為數(shù)據(jù)區(qū)。如果 Hdr=No,則表示全部為數(shù)據(jù)區(qū),這時需要“字段名”第一列系統(tǒng)默認為 f1,第二列為 f2,依此類推。后面的ThisWorkbook.FullName 表示數(shù)據(jù)源文件的全路徑,這里是連接自身文件,如果是其它EXCEL文件,只需要替換一下這兒的ThisWorkbook.FullName即可。上面連接 Hdr=Yes

是系統(tǒng)的默認設(shè)置,所以一般不需要寫出來,

ConnectionString

屬性的設(shè)置可以簡化為:.ConnectionString="ExtendedProperties=Excel8.0;DataSource="&ThisWorkbook.FullName注意如果存在兩個以上的“ExtendedProperties”,等號后面必須用引號引起來,而且上面連接表達式中的分號是不能省略的。如果不想先設(shè)置Connection對象的Provider和ConnectionString屬性在打開連接,也可以在使用Open方法打開連接的時候完成這些設(shè)置。上面的連接代碼可以寫成這樣:這種寫法看起來更簡潔,我們后面將采用這種寫法。請將上行代碼寫到你 SubAdo0中Open方法 (ADOConnection)打開到數(shù)據(jù)源的連接。語法connection.OpenConnectionString,UserID,Password,Options參數(shù)ConnectionString 可選,字符串,包含連接信息。UserID 可選,字符串,包含建立連接時所使用用戶名。Password 可選,字符串,包含建立連接時所使用密碼。Options 可選,決定該方法是連接是異步還是同步返回。大家流覽一下就可以了說明一下:其實ADO對不同數(shù)據(jù)源如ACCESS,VFP的操作,步驟都是相同的,甚至后面要講的SQL語句的使用也是相同的,唯一差別就表現(xiàn)在連接的方式上,或者說連接字符串的表達上,對其它數(shù)據(jù)源的連接可以課后看看下面的連接:步驟3:構(gòu)造并執(zhí)行 SQL語句,得到結(jié)果集現(xiàn)在我們先舉一個例子:請將下行代碼寫到你 SubAdo0中:Sql="Select 班級,姓名 From[一年級$]"上面Sql語句的意思是從“一年級”表中查詢(提取)所有記錄的班級和姓名兩個字段。SQL語法我們下一部分會詳細講。構(gòu)造了Sql語句后,就是執(zhí)行查詢,得到結(jié)果集。也有兩種方法:方法1:使用Connection對象的Execute方法Setrst=cnn.Execute(Sql)通過上面語句,我們就可以執(zhí)行查詢,并將結(jié)果保存到 rst對象中。Execute方法 (ADOConnection)執(zhí)行指定的查詢、 SQL語句、存儲過程或特定提供者的文本等內(nèi)容。語法connection.ExecuteCommandText,RecordsAffected,Options返回值返回 Recordset對象引用。參數(shù)CommandText 字符串,通常為要執(zhí)行的 SQL語句、表名。RecordsAffected 可選,長整型變量,提供者向其返回操作所影響的記錄數(shù)目。Options 可選,長整型值,指示提供者應如何計算 CommandText參數(shù)。后面兩個可選參數(shù)我們一般用不到去設(shè)置,這里不做介紹。使用Connection對象的Execute方法返回的結(jié)果集,始終為只讀、僅向前的游標。也無法取得返回結(jié)果集合中的記錄數(shù)。一般在只需將結(jié)果一次性寫入工作表中(CopyFromRecordset)時使用,它的好處是寫法簡潔。如果需要處理返回結(jié)果的更多操作,應使用下面的方法。方法2:使用Recordset對象的Open方法Setrst=cnn.Execute(Sql)通過上面語句,我們就可以執(zhí)行查詢,并將結(jié)果保存到 rst對象中。Open方法 (ADORecordset)打開游標。語法recordset.OpenSource,ActiveConnection,CursorType,LockType,Options參數(shù)Source 可選,變體型,通常為 SQL語句、表名。ActiveConnection 可選。變體型,一般為有效 Connection對象變量名。CursorType 可選,CursorTypeEnum值,打開 Recordset時使用游標類型。LockType 可選。打開 Recordset時使用的鎖定(并發(fā))類型。Options 可選,長整型值,用于指示提供者如何計算 Source參數(shù)。應該說這五個參數(shù)都比較有用,但我們最常用的就是前面三個參數(shù),后面兩個參數(shù)不用管它們就可以了。我只貼一部分幫助內(nèi)容,大家實際看幫助時,不要被這么多幫助內(nèi)容嚇到,通過實際使用就容易理解它們了。學習ADO和其它的知識一樣,也是需要理論和實踐交互的過程,實際應用后再回頭去看幫助中的一些理論內(nèi)容,可以理解的更深,提高也會更快。這里我們遇到了一個詞:游標(Cursor)。游標是數(shù)據(jù)庫的組件,在數(shù)據(jù)庫中,對數(shù)據(jù)的操作我們直觀的感覺是對“表”或者記錄(集)進行的,但在系統(tǒng)內(nèi)部記錄的留覽和更新都是通過游標來進行的。通俗點講,游標就是“數(shù)據(jù)指針” 。下面說明一下第三個參數(shù) CursorType,游標可以并且一般也需要在打開前確定起類型。 打開游標是可以指定的類型有四種:AdOpenForwardOnly (默認值)打開僅向前類型游標。AdOpenKeyset打開鍵集類型游標。AdOpenDynamic 打開動態(tài)類型游標。AdOpenStatic打開靜態(tài)類型游標。如果需要計算返回記錄集的記錄數(shù)( RecordCount),需要將游標指定為 adOpenStatic或adOpenKeyset類型,如果需要對游標進行更新,則需要指定為adOpenKeyset或AdOpenDynamic類型。請將下行代碼寫到你 SubAdo0中:rst.OpenSql,cnn,adOpenKeyset后面還有兩個步驟大家休息 10分鐘步驟4:處理查詢結(jié)果處理查詢結(jié)果通常是將查詢結(jié)果寫入工作表中或控件(比如 Listview)中。處理1:CopyFromRecordset方法簡便處理如果只需要將查詢的結(jié)果寫入工作表中, 可以使用Range對象的CopyFromRecordset方法簡便處理:Sheet7.Range("A2").CopyFromRecordsetrst上面A2是要寫入工作表區(qū)域的左上角單元格。CopyFromRecordset方法(Range對象)將一個ADO或DAO Recordset對象的內(nèi)容復制到工作表中,復制的起始位置在指定區(qū)域的左上角。句法Rng.CopyFromRecordset(Data,MaxRows,MaxColumns)參數(shù)Data:Void類型,必選。復制到指定區(qū)域的 Recordset對象。MaxRows:Variant類型,可選。復制到工作表的記錄個數(shù)上限。如果省略該參數(shù),將復制Recordset對象的所有記錄。MaxColumns:Variant類型,可選。復制到工作表的字段個數(shù)上限。如果省略該參數(shù),將復制Recordset對象的所有字段。處理2:更為細致的處理當查詢結(jié)果不是寫入工作表中, 或者雖是寫入工作表中但不是按查詢結(jié)果的方式時。 這時需要對更為細致的處理,比如逐條記錄、逐個字段進行處理。Fori=1Torst.RecordCountSheet7.Cells(i+1,j+1)=rst.Fields(j)Nextjrst.MoveNextNexti大家仔細看一下上面的代碼,應該不難理解的。簡單地解釋一下:rst.RecordCount是記錄結(jié)果集中的記錄數(shù),前面我們已經(jīng)提過。是記錄結(jié)果集中的字段數(shù), Fields是字段集對象,由單個的 Field字段組成,表示Recordset對象的列的集合。 Fields成員的下標從 0開始,0表示第一個字段。上面代碼我們都假定第一行為預先設(shè)定好的表頭, 代碼中不再考慮。有時需要將字段名寫入表頭,請看下面的代碼:Sheet7.Cells(1,i)=rst.Fields(i-1).NameNexti請將上面代碼寫入 SubAdo0中。處理3:記錄定位1)Move系列方法上面已經(jīng)用到了 Recordset對象的MoveNext方法。rst.MoveNext 移動游標到下一記錄。 在使用MoveNext移動游標時,一般需要通過 Recordset對象的EOF置為True。

屬性先進行判斷游標是否到了記錄尾。當游標到了記錄尾時, EOF屬性會被設(shè)上面的代碼可以這樣寫:i=1DoWhileNotrst.EOFSheet7.Cells(i+1,j+1)=rst.Fields(j)Nextji=i+1Loop請將上面代碼寫入 SubAdo0中。與EOF對應的是BOF,用來判斷游標是否到了記錄首。大家對照一下兩段代碼看看,加深一下體會與MoveNext類似的還有 MoveFirst、MoveLast和MovePrevious

方法,在指定

Recordset

對象中移動到第一個、最后一個或前一個記錄并使該記錄成為當前記錄。此外,移動記錄還可以使用 Move方法。Move方法(Recordset對象)移動Recordset對象中當前記錄的位置。語法recordset.MoveNumRecords,Start參數(shù)NumRecords 長整型,指定當前記錄位置移動的記錄數(shù)。Start 可選,字符串或變體型,指定從哪兒開始移動。也可為下值之一:AdBookmarkCurrent(0)默認。從當前記錄開始。AdBookmarkFirst(1)從首記錄開始。AdBookmarkLast(2)從尾記錄開始。在Recordset對象中定位游標位置,除了上面的幾個 Move方法外,常用的還有:2)使用Recordset對象的AbsolutePosition屬性。AbsolutePosition屬性可以設(shè)置或返回游標當前的記錄位置。下面代碼將游標當前位置當前位置保存在變量c中,然后設(shè)置為第10條記錄:c=rst.AbsolutePositionrst.AbsolutePosition=10糾正:下面代碼將游標當前位置保存在變量 c中,然后將當前位置設(shè)置為第 10條記錄:這種保存現(xiàn)場的做法 ,經(jīng)常用吧?3)使用Recordset對象的Bookmark屬性。Bookmark屬性可以設(shè)置或返回游標當前當前記錄的書簽。 Recordset對象的每一條記錄都有唯一的“書簽”值。下面代碼先將游標當前位置設(shè)置為第 10條記錄,然后將當前記錄的書簽保存到變量 c中,然后移動到下一條記錄(實際使用時一般是進行其它的處理操作) ,最后在通過設(shè)置 Bookmark屬性將記錄定位到原來的第 10條記錄。rst.AbsolutePosition=10c=rst.Bookmarkrst.MoveNextrst.Bookmark=c與使用AbsolutePosition屬性的區(qū)別是,使用Bookmark屬性時,往往不知道或不關(guān)心記錄所處的實際位置。4)Find方法Find方法(Recordset對象)搜索 Recordset中滿足指定標準的記錄。 如果滿足標準,則記錄集位置設(shè)置在找到的記錄上,否則位置將設(shè)置在記錄集的末尾。語法Find(criteria,SkipRows,searchDirection,start)參數(shù)criteria 字符串,包含指定用于搜索的列名、比較操作符和值的語句。SkipRows 可選,長整型值,默認值為零,指定當前行或 start書簽的位移以開始搜索。searchDirection可選的SearchDirectionEnum值,指定搜索應從當前行還是下一個有效行開始。其值可為adSearchForward(1)或adSearchBackward(-1)。搜索是在記錄集的開始還是末尾結(jié)束由searchDirection值決定。start 可選,變體型書簽,用作搜索的開始位置。下面代碼搜索所有記錄,將姓陳的同學名單寫入 Sheet7的第3列:i=2rst.MoveFirstrst.Find"姓名 Like'陳*'"DoWhileNotrst.EOFSheet7.Cells(i,3)=rst.Fields("姓名")rst.Find"姓名 Like'陳*'",1,adSearchForwardi=i+1Loop請將上面代碼寫入 SubAdo0中。步驟5:關(guān)閉并釋放 ADO對象使用ADO完成了全部工作后,應該關(guān)閉并釋放創(chuàng)建的請將下面代碼寫到你SubAdo0中:

ADO

對象。rst.Closecnn.CloseSetrst=NothingSetcnn=Nothing至此,我們完成了一個實例,也介紹完了

ADO

代碼的全部步驟。大家休息

10分鐘。上面的代碼并沒有完全寫進我們的

SubAdo0

中,大家可以自己試驗一下運行結(jié)果。完整的代碼:SubADO0()DimcnnAsNewADODB.ConnectionDimrstAsNewADODB.RecordsetDimSqlAsStringDimiAsIntegerDimjAsIntegerSql="Select 班級,姓名 From[一年級$]"rst.OpenSql,cnn,adOpenKeysetSheet7.Cells(1,i)=rst.Fields(i-1).NameNextii=1DoWhileNotrst.EOFSheet7.Cells(i+1,j+1)=rst.Fields(j)Nextji=i+1rst.MoveNextLoopi=2rst.MoveFirstrst.Find"姓名 Like'陳*'"DoWhileNotrst.EOFSheet7.Cells(i,3)=rst.Fields("姓名")rst.Find"姓名 Like'陳*'",1,adSearchForwardi=i+1Looprst.Closecnn.CloseSetrst=NothingSetcnn=NothingEndSub大家如果覺得如何 ?我以前就會我當場就可以學會了現(xiàn)在沒完全理解,但課后看看筆記應該學會沒有問題天書,我不可能學會三、構(gòu)建 SQL語句只有學完這部分

,你才能說會

ADO從上面我們對 ADO工作步驟的了解,已經(jīng)知道要讓 ADO有效工作,關(guān)鍵是我們給它發(fā)出什么樣的 SQL指令。在概念部分,我們已經(jīng)簡單介紹了 SQL的有關(guān)情況。現(xiàn)在我們來詳細探討它。SQL語句從功能上可以分為兩大類:數(shù)據(jù)定義語言( DDL)和數(shù)據(jù)操縱語言( DML)。前者主要用于對數(shù)據(jù)庫中表及字段, 還有我們沒有提到的索引的創(chuàng)建、 刪除、修改;后者用于對記錄的查詢、更新、插入、刪除等操作。就 EXCEL而言,我們通常使用的是 DML部分語句。下面將對常用的語句進行介紹。(一)簡單查詢句法1:Select查詢表達式 From數(shù)據(jù)區(qū)域前面我們使用的 SQL語句就屬于此類。查詢表達式請粘貼下面的過程:SubAdo1()DimcnnAsNewADODB.ConnectionDimSqlAsStringSql="Select*from[一年級$]"Sheet7.[a2].CopyFromRecordsetcnn.Execute(Sql)cnn.CloseSetcnn=NothingEndSub大家可以運行看看 ,我放慢速度查詢表達式可以是下列之一或其組合,對多種方式的組合,用逗號擱開:1)星號(*)表示“數(shù)據(jù)區(qū)域”的所有字段。2)字段名3)常量表達式4)任何有效的計算表達方式句法1:Select

查詢表達式

From

數(shù)據(jù)區(qū)域指的是上面的

"查詢表達式

"下面是一些 SQL語句,請分別替換 SubAdo1的Sql句,并查看運行結(jié)果。Sql="Select'一年級',*from[一年級$]"Sql="Select 姓名,語文+數(shù)學+英語 from[一年級$]"Sql="Select 姓名,iif(語文>=60,'及格','不及格')from[一年級$]"上面的每一句分別替換原來的Sql="Select*from[一年級$]"并結(jié)合前面講的 "查詢表達式"理論看'一年級'----(3)常量表達式語文+數(shù)學+英語 ----(4)任何有效的計算表達方式iif(語文>=60,'及格','不及格') ----(4)任何有效的計算表達方式大家要學會怎樣寫查詢表達式 才行學會了沒?(1or0)下一個知識點使用AS重新命名列名稱當查詢表達式使用(2)字段名時,字段名就是其本身,使用(3)常量表達式和(4)任何有效的計算表達方式時,系統(tǒng)將為該字段重新命名一個字段名,這個字段名通常沒有意義,這時可以在表達式中使用AS為字段重新命名,當然對字段名也可以通過使用AS為其重新命名。使用AS通常在需要使用字段名的場合(在對HDR=NO的EXCEL數(shù)據(jù)源更為常見),如我們前面提過的將字段名寫入第一行,也可用在多表查詢時簡化構(gòu)造語句或者因特殊處理需要。后面我們或許會看到有關(guān)的例子。AS并不對查詢結(jié)果造成實質(zhì)影響。我們前面提過的將字段名寫入第一行這時需要每個字段都有名字,對沒有名字的字段如:iif(語文>=60,'及格','不及格')可以在查詢語句中使用AS為其命名下面是使用

AS

的一個例子:Sql="Select 班級,姓名 AS名字,語文+數(shù)學+英語這句語句不再測試了 ,大家結(jié)合前面的介紹印正一下誰解釋一下?查詢1年級每個同學的總成績

AS

總成績

from[一年級

$]"句法

1:Select

查詢表達式

From

數(shù)據(jù)區(qū)域繼續(xù)下面解釋 數(shù)據(jù)區(qū)域數(shù)據(jù)區(qū)域請粘貼下面的過程:SubAdo2()DimcnnAsNewADODB.ConnectionDimSqlAsStringSql="Select*from[一班$]"Sheet7.[a2].CopyFromRecordsetcnn.Execute(Sql)cnn.CloseSetcnn=NothingEndSub理解其中的

SQL

句,并運行句法

1:Select

查詢表達式

From

數(shù)據(jù)區(qū)域數(shù)據(jù)區(qū)域可以是下列之一:(1)當要查詢的數(shù)據(jù)區(qū)域是從工作表的第一行、第一列開始的整個表格時,可以使用表名$]的形式(2)如果不是( 1)的情形,則需要使用 [工作表名$區(qū)域范圍]的形式

[工作'A:C

列Sql="Select*from[

一班$A:C]"'《不規(guī)范表》的

A2:H19Sql="Select*from[不規(guī)范表$A2:H19]"上面兩中方式中的方括號和美元符號不能省略。3)如果工作表中定義了名稱,則可以直接使用名稱。'《不規(guī)范表》的A2:H19已經(jīng)定義名稱為DATASql="Select*fromDATA"4)數(shù)據(jù)區(qū)域是多個區(qū)域的情況我們后面再講10分鐘時間,大家看完并將每一個 SQL句替換SUBADO2的,運行看其結(jié)果好,繼續(xù)下一個知識點使用DISTINCT 刪除重復記錄《不規(guī)范表》的K2:R24區(qū)域有重復的記錄,如果希望重復的記錄只顯示一條,可以使用DISTINCT進行限定。Sql="Selectdistinct*from[

不規(guī)范表

$K2:R24]"大家試試當我寫到這兒的時候

,覺得前面的鋪墊已足夠多

,所以直接給出用法事例

,不在多說前面講的句法1:Select

查詢表達式

From

數(shù)據(jù)區(qū)域數(shù)據(jù)區(qū)域可以是下列之一:下一個 知識點使用

Top限制返回行數(shù)如果記錄返回的行數(shù)比較多,可以使用排續(xù)配合使用。下面語句返回前 20條記錄。

Top

限制返回的行數(shù),通常和后面介紹的

Order

bySql="Selecttop20*from[

一班$]"下面語句返回全部符合條件記錄的

1%。Sql="Selecttop1percent*from[

一班$]"句法

1Select

查詢表達式

F

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論