Posted: 2005/2月/16 11:50上午 | IP記錄
|
|
|
使用連接對像
與數據庫的所通信都要通過一個打開的連接來進行。在對一個數據庫進行數據的插入和讀取之前,必須先打開與這個數據庫的連接。這種 打開和關閉一個連接的操作與打電話的過程有相似之處。在你能夠與SQL Sever進行通信之前,你必須先呼叫它。
這一節講如何使用ADO連接對象。首先你將學習如何打開和關閉一個對數據庫的連接。接下來,你將學會如何通過一個打開的連接執行 SQL語句。最後,你將學習如何用連接對像創建事務處理。
打開和關閉數據庫連接
要打開與一個數據庫的連接,你可以創建連接對象的一個實例。創建了這個實例之後,你就可以調用連接對象的open方法,打開一個 連接。這裡有一個例子:
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
MyConn.Open 「FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn」
MyConn.Execute 「INSERT Mytable (mycolumn) VALUES (『Hello World!』)」
MyConn.Close
%>
在這個例子中,創建了連接對象的一個實例MyConn。然後調用連接對象的open方法。接下來,調用連接對象的Execute 方法,執行了一個SQL語句。最後,關閉這個連接。
每次打開一個新連接時都要輸入文件數據源的路徑和名字,這實在是個另人厭煩的工作。你可以把這個字符串分配給一個session 變量或者在一個包含文件中把它定義為一個常量。這樣,你只需要鍵入一個變量名即可,而不必輸入文件數據源的完整名稱。要定義一個 包含有文件數據源名字的session變量,你可以在文件Global.asa中定義。例如,你可以把下面的內容添加到文件Gl obal.asa的session_onstart腳本中:
session(「connectionstring」)=」FILEDSN=d:\Program Files\Common
Files\ODBC\Data Sources\MyData.dsn」
注意
要瞭解使用session變量的更多信息,請參閱第16章「使用Active Sever Pages Sessions」。
建立了這個session變量後,你就可以用如下的腳本打開一個連接:
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
MyConn.Open Session(「connectionstring」)
%>
把文件數據源的名字分配給一個session變量的另一個好處是,你將來可以很容易地改變數據源。如果你需要使用另外一個數據源 ,你只要改變文件Global.asa中的一個session變量的值即可。
使用完一個連接後,你應該關閉它。這就像掛斷一個電話,從而釋放佔用的線路。連接對象的close方法可以關閉一個連接。關閉了 一個連接後,你就不能在用這個連接與數據庫進行通信。因此,依賴這個連接支持的其它對象也不能再與數據庫相通信。
通過打開的連接執行SQL語句
通過打開的連接執行SQL語句,要用到Execute方法。這個方法有兩種形式:一種形式用來從數據庫中返回信息,當不需要返回 信息時,則使用另一種形式。
下面的例子演示了如何使用Execute方法執行一個沒有返回結果的SQL語句:
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
MyConn.Open 「FILEDSN=d:\Program Files\Common Files\
OBDC\Data Sources\MyData.dsn」
MyConn.Execute 「INSERT Mytable (MyColumn) VALUES(『Hello World!』)」
MyConn.Close
%>
在這個例子中,用Execute方法執行了一個SQL SELECT 語句。因為沒有返回結果,Execute方法不使用括號。
你也可以用Execute方法從一個查詢返回結果。如下例所示:
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn」
Set RS=MyConn.Execute(「SELECT * FROM Mytable」)
MyConn.Close
%>
在這個例子中,使用了Execute()方法以返回一個SQL SELECT查詢的結果。與上一個例子不同,這個Execute方法使用了括號。當你要返回結果時,千萬別忘了使用括號,否則你 會收到錯誤信息 Expected end of statement.
這個SQL查詢的結果被讀取到記錄集對象的一個實例RS中。該記錄集由Execute()方法自動創建。你將在下一章中學習如何 使用記錄集。
Execute方法包含兩個可選參數。你可以給一個RecordsAffected參數,用來保存被執行的SQL語句所操作的記 錄個數。你還可以給一個Options參數,用來提供被執行的SQL語句的有關信息。下面的例子同時使用了這兩種可選參數:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn」
MyConn.Execute 「UPDATE Mytable Set Mycolumn=』Goodbye!』」,HowMany,adCMDText
Response.Write(HowMany)
MyConn.Close
%>
在這個腳本中,執行了一個SQL UPDATE語句,改變了表Mytable中所有記錄的值。Execute方法帶有兩個參數。第一個參數是RecordAffe cted參數。在這個例子中,變量HowMany被作為RecordAffected參數。這個SQL語句執行後,變量HowM any中將存有該語句所操作的記錄數。例如,如果表中有32條記錄被更新,變量HowMany的值將是32。
上例中Execute方法的第二個參數是Options參數。在這個例子中,Options參數被指定為常量adCMDText 。這個常量用來告訴ADO,它應該把字符串的內容解釋為命令文本,而不是一個表的名字或一個存儲過程。通過告訴ADO被執行的字 符串的內容的有關信息,這個常量使得ADO更高效地執行這個命令。(要瞭解命令的更多信息,請參見第24章「使用命令」。)
你可以使用下面的常量作為Options參數:
adCMDTable。被執行的字符串包含一個表的名字。
adCMDText。被執行的字符串包含一個命令文本。
adCMDStoredProc。被執行的字符串包含一個存儲過程名。
adCMDUnknown。不指定字符串的內容。(這是缺省值。)
在你能夠在一個ASP網頁中使用這些常量之前,你必須先包含一個名為ADOVBS.inc的特殊文件。文件ADOVBS.inc 中包含ADO使用的所有VBSript常量。上例中第一行的INCLUDE語句包含了文件ADOVBS.inc。
在你安裝ASP時,這個文件應該已經被自動安裝了。一般來說,它會被安裝在c:\Program Files\Common Files\System\ADO目錄下。但是,你也許不得不使用WINDOWS NT任務欄中的Find命令,找到這個文件的確切位置,找到它之後,把這個文件拷貝到你的Active Sever Pages目錄中。
注意
如果你使用Jscript,而不是VBSript,ADO常量的包含文件應該是ADOJAVAS.inc。
打開一個連接後,你需要調用Execute方法多少次,你就可以調用多少次。
例如,下面的腳本向表Mytable中輸入了32個字符串:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn」
FOR i=1 TO 32
MySQL=」INSERT Mytable (Mycolumn) VALUES (『 This is entry 「&i&」 』)」
MyConn.Execute MySQL, HowMany,adCMDText
NEXT
MyConn.Close
%>
這段腳本使用了一個FOR……NEXT循環,向表Mytable中插入了32條記錄。變量MySQL包含Execute方法使用 的SQL命令字符串。注意書寫SQL字符串時如何使用單引號和雙引號。單引號用來標記SQL語句內部的引用。雙引號用來指定VB Sript內字符串的開始和結束。
用Execute方法幾乎可以這些所有的SQL命令。例如,下面的腳本創建了一個表,然後添加數據,清除數據,最後刪除這個表:
<!--#INCLUDE VIRTUAL=」ADOVBS.inc」-->
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn」
『 create a new table
MySQL=」CREATE TABLE newtable (mycolumn VARCHAR(255))」
MyConn.Execute MySQL
『 populate the table
MySQL=」INSERT newtable (mycolumn) VALUES(『hello』)」
MyConn.Execute MySQL
『truncate the table
MySQL=」TRUNCATE TABLE newtable」
MyConn.Execute MySQL
『drop the table
MySQL=」DROP TABLE newtable」
MyConn.Execute MySQL
Myconn.Close
%>
創建事務處理
當一組語句構成一個事務處理時,如果一個語句沒有執行成功,則所有的語句都不成功。如果你需要更新多個表中的數據,你不希望對一 個表的操作失敗,而對其它表的操作成功了。這時所有事務處理是有用的。
例如,假設某個時間有人在你的站點上買了東西,有關的交易信息存儲在兩個表中 。一個表用來保存買者的信用卡信息,另一個表包含了要買的商品的信息。
現在,假如有一個人正試圖從你的站點上買東西。他的信用卡號碼已經輸入了第一個表中。但是,就在這時,發生了意外情況,一道閃電 擊中了你的服務器,使第二個表沒有被更新。在這種情況下,當然最後是兩個表都沒有被更新過。你當然不想收這個人的錢去買他不想買 的東西。使用事務處理,你可以防止第二個表沒有被更新而第一個表被更新的情況出現:
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn」
MyConn.BeginTrans
MyConn.Execute 「INSERT CreditCard (CCNum) VALUES (『5555-55-444-44-4444』)」
MyConn.Execute 「INSERT Shipping (Address) VALUES(『Paris,France』)」
MyConn.CommitTrans
MyConn.Close
%>
在這個例子中,用BeginTrans方法和CommitTrans方法來標記事務處理的開始和結束。在BeginTrans方 法被調用之後,CommitTRans方法被調用之前,不管出現什麼錯誤,兩個表都不會被更新。
你也可以恢復一個事務處理的操作(操作作廢)。要做到這一點,應使用RollBackTrans方法。考慮如下的腳本:
<%
Set MyConn=Sever.CreateObject(「ADODB.Connection」)
MyConn.Open 「FILEDSN=d:\Program Files\
Common Files\ODBC\Data Sources\MyData.dsn」
MyConn.BeginTrans
MyConn.Execute 「INSERT CreditCard (CCNum) VALUES (『5555-55-444-44-4444』)」
MyConn.Execute 「INSERT Shipping (Address) VALUES(『Paris,France』)」
IF WEEKDAYNAME(WEEKDAY(DATE))=」Sunday」 THEN
MyConn.RollBackTrans
ELSE
MyConn.CommitTrans
END IF
MyConn.Close
%>
在這個例子中,使用了RollBackTrans方法,如果是星期天,就取消事務處理所做的操作。在星期天兩個表都不能被更新。
總結
這一章介紹了Activex數據對象。第一節是ADO的概述。在第二節,你學會了如何配置服務器以使用ADO。最後,向你介紹了 最重要的ADO對像之一:連接對象。
|