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