趙志娟
(上海電氣集團(tuán)上海電機(jī)廠有限公司,上海 200240)
產(chǎn)生于20世紀(jì)90年代初的萬(wàn)維網(wǎng)(World Wide Web)在迅速發(fā)展的今天,是互聯(lián)網(wǎng)非常重要的信息資源網(wǎng),遵循超文本傳輸協(xié)議,以超文本或超媒體的形式傳送各種各樣的信息,為用戶提供具有友好的圖形化界面,以查閱互聯(lián)網(wǎng)上的各類信息。信息的實(shí)現(xiàn)方式就是通過(guò)各類編程語(yǔ)言。本文以ASP、ACCESS為例討論兩種程序數(shù)據(jù)庫(kù)的訪問(wèn)和程序錯(cuò)誤的處理。
ASP(Active Server Pages)是一套微軟開(kāi)發(fā)的服務(wù)器端腳本環(huán)境,它內(nèi)含于IIS(Internet Information Server)或 PWS(Personal Web Server)中,是微軟公司開(kāi)發(fā)的代替CGI腳本程序的一種應(yīng)用,可以與數(shù)據(jù)庫(kù)和其它程序進(jìn)行交互,是一種簡(jiǎn)單、方便的編程工具,是運(yùn)行動(dòng)態(tài)、交互的Web服務(wù)器應(yīng)用程序。
ASP的工作原理框圖如圖1所示。當(dāng)客戶端瀏覽器上某用戶申請(qǐng)一個(gè)*.asp的文件(ASP文件的后綴名為.asp)時(shí),Web服務(wù)器就會(huì)響應(yīng)該HTTP請(qǐng)求,并調(diào)用ASP引擎,解釋被申請(qǐng)文件,最后輸出標(biāo)準(zhǔn)的HTML格式文件傳送給客戶端瀏覽器,由瀏覽器解釋運(yùn)行,并顯示出結(jié)果。
圖1 ASP工作原理框圖
當(dāng)遇到任何與ActiveX Scripting兼容的腳本(如VBScript和JavaScript)時(shí),ASP引擎會(huì)調(diào)用相應(yīng)的腳本引擎進(jìn)行處理。若腳本指令中含有訪問(wèn)數(shù)據(jù)庫(kù)的請(qǐng)求,就通過(guò)ODBC與后臺(tái)數(shù)據(jù)庫(kù)相連,由數(shù)據(jù)庫(kù)訪問(wèn)組件執(zhí)行訪問(wèn)操作等。由于ASP腳本是在服務(wù)器端解釋執(zhí)行的,所以其所有相關(guān)的發(fā)布工作都由Web服務(wù)器負(fù)責(zé)。
Access是微軟公司推出的基于Windows的桌面關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS,即 Relational Database Management System),是 Office系列應(yīng)用軟件之一,支援部分面向?qū)ο?OOP)技術(shù),但是未能成為一種完整的面向?qū)ο箝_(kāi)發(fā)工具。其特點(diǎn)如下:
① 提供表、查詢、窗體、報(bào)表、頁(yè)、宏、模塊七種用來(lái)建立數(shù)據(jù)庫(kù)系統(tǒng)的對(duì)象;
② 提供多種向?qū)?、生成器、模板,把?shù)據(jù)存儲(chǔ)、數(shù)據(jù)查詢、界面設(shè)計(jì)、報(bào)表生成等操作規(guī)范化;
③ 能夠存取 Access/Jet、Microsoft SQL Server、Oracle(甲骨文軟件公司),或者任何 ODBC兼容數(shù)據(jù)庫(kù)內(nèi)的資料。
2.1.1 在ASP中建立數(shù)據(jù)庫(kù)連接
ASP中使用ADO對(duì)象進(jìn)行數(shù)據(jù)庫(kù)的連接和調(diào)用。ADO稱為“Active數(shù)據(jù)對(duì)象”,是基于組件的數(shù)據(jù)庫(kù)編程接口,提供訪問(wèn)各種數(shù)據(jù)類型的連接機(jī)制,與編程語(yǔ)言無(wú)關(guān)的COM(Component Object Model)組件系統(tǒng),是統(tǒng)一數(shù)據(jù)訪問(wèn)方式OLE DB的一個(gè)中間層,是 OLE DB/ODBC的使用者。它提供了對(duì)OLE DB數(shù)據(jù)源的應(yīng)用程序級(jí)的訪問(wèn)。在ASP中,可以使用ADO通過(guò)OLE DB的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序直接訪問(wèn)數(shù)據(jù)庫(kù),也可以編寫(xiě)緊湊簡(jiǎn)明的腳本以便連接到ODBC兼容的數(shù)據(jù)庫(kù)。
1)用ODBC方式連接數(shù)據(jù)庫(kù)
ODBC(Open Database Connectivity,開(kāi)放數(shù)據(jù)庫(kù)連接)是微軟開(kāi)放的服務(wù)結(jié)構(gòu)中有關(guān)數(shù)據(jù)庫(kù)的一個(gè)組成部分。通過(guò)ODBC方式建立的應(yīng)用程序,不依賴于任何數(shù)據(jù)庫(kù)管理系統(tǒng),不直接與任何DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))交互。
2)ODBC工作原理
ODBC驅(qū)動(dòng)程序類似于Windows下的打印機(jī)驅(qū)動(dòng)程序,通過(guò)ODBC驅(qū)動(dòng)程序管理器統(tǒng)一對(duì)應(yīng)用程序?qū)?shù)據(jù)庫(kù)的訪問(wèn)進(jìn)行規(guī)范化管理:
① ODBC的所有驅(qū)動(dòng)程序都是動(dòng)態(tài)連接庫(kù)DLL(Dynamic Link Library),由 ODBCADM.DLL驅(qū)動(dòng)程序管理器統(tǒng)一進(jìn)行管理。
② 任何DBMS,只要提供了并符合ODBC接口規(guī)范的DLL庫(kù),便可以加載到系統(tǒng)中被ODBC建立的應(yīng)用程序所訪問(wèn)。
③ ODBC.DLL通過(guò)WINDOWS系統(tǒng)注冊(cè)表(或ODBC.INI文件)中的數(shù)據(jù)源 (Data Source)了解到對(duì)某個(gè)數(shù)據(jù)庫(kù)應(yīng)調(diào)用哪個(gè)DLL。每個(gè)數(shù)據(jù)源對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序庫(kù)(DBMS或ISAM文件)。
3)ODBC接口支持的SQL語(yǔ)句
ODBC驅(qū)動(dòng)程序有兩類,第一類含有SQL語(yǔ)句處理功能,第二類則沒(méi)有SQL語(yǔ)言處理功能。
4)創(chuàng)建系統(tǒng)DSN
使用ODBC連接數(shù)據(jù)庫(kù),必須提供一條使ADO定位、標(biāo)識(shí)和與數(shù)據(jù)庫(kù)通訊的途徑。那么ODBC就使用數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序Data Source Name(DSN,數(shù)據(jù)源)定位和標(biāo)識(shí)特定的ODBC兼容數(shù)據(jù)庫(kù),DSN包含數(shù)據(jù)庫(kù)配置、用戶安全性和定位信息。
① 創(chuàng)建文件DSN
建立文件DSN,關(guān)于數(shù)據(jù)庫(kù)的配置將保留在一個(gè).dsn文件中,ODBC數(shù)據(jù)源通過(guò)讀取.dsn文件中的配置來(lái)建立和數(shù)據(jù)庫(kù)的連接。
② 創(chuàng)建無(wú)DSN的連接
利用ADO連接數(shù)據(jù)庫(kù)除了使用ODBC數(shù)據(jù)源DSN外,也可以創(chuàng)建無(wú)DSN的ODBC連接和基于OLE DB。
(ⅰ)無(wú)DSN的連接
對(duì)于SQL Server2005數(shù)據(jù)庫(kù),一般需要用到Driver和Server兩個(gè)參數(shù),連接方法如下:
(ⅱ)通過(guò)OLE DB的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序直接訪問(wèn)數(shù)據(jù)庫(kù)
一般OLE DB的數(shù)據(jù)庫(kù)連接需要用到Provider和Data Source兩個(gè)參數(shù),連接方法如下:
5)ADO對(duì)象中的主要對(duì)象
ADO對(duì)象結(jié)構(gòu)如圖2示,主要對(duì)象是Connection對(duì)象,Command對(duì)象,Recordset對(duì)象。其中Connection對(duì)象為連接對(duì)象,Command對(duì)象為命令對(duì)象,Recordset對(duì)象為記錄集對(duì)象。本文討論Connection和Recordset對(duì)象。
圖2 ADO對(duì)象結(jié)構(gòu)圖
Connection對(duì)象代表了打開(kāi)的、與數(shù)據(jù)源的連接,該對(duì)象代表與數(shù)據(jù)源進(jìn)行的唯一連接會(huì)話。ASP在Connection對(duì)象的基礎(chǔ)使用Command對(duì)象及Recordset對(duì)象來(lái)對(duì)Connection對(duì)象所連接的數(shù)據(jù)庫(kù)進(jìn)行插入、刪除、更新和查詢等操作。
② Connection對(duì)象的創(chuàng)建
(ⅰ)在ADO中建立對(duì)象需要用到Server對(duì)象的CreateObject方法,格式:Set Connection對(duì)象 =Server.CreateObject(“ADODB.Connection”)。
(ⅱ)創(chuàng)建了Connection對(duì)象后,就可以調(diào)用Open函數(shù)來(lái)打開(kāi)數(shù)據(jù)庫(kù)。Open函數(shù)的格式:Conn.Open“參數(shù)1=值;參數(shù)2=值;參數(shù)3=值……”
(ⅲ)Execute方法執(zhí)行SQL命令或存儲(chǔ)過(guò)程,有返回記錄的格式為:Set Rs=Connection對(duì)象.Execute(CommandText,RecordsAffected,Options);無(wú)返回記錄的格式為:Connection對(duì)象.Execute(CommandText,RecordsAffected,Options)
③ Recordset對(duì)象
Recordset對(duì)象表示來(lái)自基本表或命令執(zhí)行結(jié)果的記錄全集,其所指的當(dāng)前記錄為集合內(nèi)的單條記錄,通過(guò)使用Recordset對(duì)象,則可以方便自如地操作Command對(duì)象返回的結(jié)果。
④ Recordset對(duì)象的創(chuàng)建
(ⅰ)標(biāo)準(zhǔn)的Recordset對(duì)象的標(biāo)準(zhǔn)建立語(yǔ)句如下:SetRecordset對(duì) 象 = Server.CreateObject(“ADODB.Recordset”),也可以使用 Connection 對(duì)象和Command對(duì)象的Execute方法返回Recordset對(duì)象
(ⅱ)需要調(diào)用Recordset對(duì)象的Open方法打開(kāi)打開(kāi)一個(gè)數(shù)據(jù)庫(kù),格式如下:Recordset對(duì)象.Open Source, ActiveConnection, CursorType, LockType,Options
(ⅲ)Recordset對(duì)象的操作步驟:第一步,創(chuàng)建Connection對(duì)象,打開(kāi)數(shù)據(jù)連接;第二步,創(chuàng)建Recordset對(duì)象;第三步,打開(kāi)Recordset取得數(shù)據(jù);第四步,關(guān)閉Recordset對(duì)象;第五步,關(guān)閉與數(shù)據(jù)庫(kù)的連接。
2.1.2 ACCESS訪問(wèn)數(shù)據(jù)庫(kù)
1)VBA數(shù)據(jù)庫(kù)訪問(wèn)接口
ACCESS程序訪問(wèn)數(shù)據(jù)庫(kù)是通過(guò)VBA數(shù)據(jù)庫(kù)訪問(wèn)接口,與后臺(tái)數(shù)據(jù)庫(kù)進(jìn)行連接。VBA有三種數(shù)據(jù)庫(kù)訪問(wèn)的接口,分別為ODBC(Open Database Con-nectivity)開(kāi)放式數(shù)據(jù)庫(kù)連接,DAO(Data Access Objects)數(shù)據(jù)訪問(wèn)對(duì)象。
2)ADO對(duì)象結(jié)構(gòu)見(jiàn)圖3。
圖3 ACCESS ADO對(duì)象結(jié)構(gòu)圖
首先創(chuàng)建對(duì)象變量,然后用對(duì)象的方法和屬性訪問(wèn)數(shù)據(jù)庫(kù)。
用ADO訪問(wèn)數(shù)據(jù)庫(kù)的一般語(yǔ)句和步驟:
ASP和ACCESS通過(guò)調(diào)用ADO組件進(jìn)行數(shù)據(jù)庫(kù)連接,主要是寫(xiě)法上有不同。Access的Connection對(duì)象連接舉例,以TestDB.mdb為例:
1)DSN方式
2)無(wú)DSN方式
3)基于OLE DB的連接
使用ADO對(duì)象時(shí)發(fā)生的運(yùn)行錯(cuò)誤都收集在Errors集合中。Errors集合無(wú)須有Set語(yǔ)句創(chuàng)建,它由系統(tǒng)自動(dòng)創(chuàng)建。如果沒(méi)有錯(cuò)誤,則它是一個(gè)空集合。如果非空,則其中每個(gè)成員是一個(gè)Error對(duì)象。
Errors集合只有一個(gè)屬性,就是 Count,表示Errors集合中Error對(duì)象的個(gè)數(shù)。
Error集合的方法:Item方法,用于獲取Error對(duì)象;Clear方法,用來(lái)清除Errors集合中的所有Error對(duì)象。
VBA提供了On Error語(yǔ)句,用來(lái)控制當(dāng)有錯(cuò)誤發(fā)生時(shí)程序的處理,啟動(dòng)一個(gè)錯(cuò)誤處理程序并指定該子程序在一個(gè)過(guò)程中的位置。一個(gè)錯(cuò)誤處理程序不是Sub過(guò)程或Function過(guò)程,它是一段用行號(hào)標(biāo)記的代碼。
On Error語(yǔ)句的語(yǔ)法,On Error語(yǔ)句的語(yǔ)法有三種:
1)On Error GoTo行號(hào)
啟動(dòng)錯(cuò)誤處理程序,如果發(fā)生一個(gè)運(yùn)行時(shí)錯(cuò)誤,控件會(huì)轉(zhuǎn)到行號(hào)所指位置,執(zhí)行其中的代碼。指定的行號(hào)必須在一個(gè)過(guò)程中,這個(gè)過(guò)程與 On Error語(yǔ)句所在的過(guò)程相同,當(dāng)程序發(fā)生錯(cuò)誤,跳轉(zhuǎn)到指定的行號(hào)位置執(zhí)行。
2)On Error Resume Next
當(dāng)一個(gè)運(yùn)行錯(cuò)誤發(fā)生時(shí),不考慮錯(cuò)誤,繼續(xù)執(zhí)行下一條語(yǔ)句。訪問(wèn)對(duì)象時(shí)要使用這種形式而不使用On Error GoTo語(yǔ)句。
3)On Error GoTo 0
關(guān)閉錯(cuò)誤處理,禁止當(dāng)前過(guò)程中任何已啟動(dòng)的錯(cuò)誤處理程序。
本文討論了如何在ASP、ACCESS中實(shí)現(xiàn)數(shù)據(jù)庫(kù)的連接,如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫(xiě)。并介紹了在ASP中連接數(shù)據(jù)庫(kù)的幾種方法,基于ODBC DSN數(shù)據(jù)源的連接,無(wú)DSN的連接及數(shù)據(jù)庫(kù)開(kāi)發(fā)常用的Connection對(duì)象、Recordset對(duì)象,并對(duì)ACCESS可采用基于ODBC DSN數(shù)據(jù)源的連接,無(wú)DSN的連接等進(jìn)行了舉例,對(duì)比了ASP、ACCESS程序錯(cuò)誤處理的方式。