Office Space:撰寫 Microsoft Office 應用程式指令碼的秘訣

Office Space

歡迎蒞臨《Office Space》專欄,這裡提供撰寫 Microsoft® Office 應用程式指令碼的秘訣。每週四我們將刊登新的秘訣,若要參閱以前討論過的秘訣,請造訪 Office Space 過往文件。如果您有關於 Microsoft Office 指令碼方面的問題,請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

在 Microsoft Access 資料庫中加入新資料錄以及修改現有的資料錄

告訴您一個祕密吧:Scripting Guy 有心情好的時候,也有心情不好的時候 (嗯,跟您們好像沒兩樣吧)。有時候我們是精神抖擻的走進辦公室準備工作;有時候 (好啦,是大部份的時候啦) 卻不是這麼回事。身為《Office Space》專欄讀者的您,要如何判斷今天到底是 Scripting Guy 的好日子還是壞日子呢?給您一個提示吧:只要 Scripting Guy 決定「進一步詳述前一篇專欄」時,您就知道他們今天偷懶,甚至連新玩意都懶得想。

那跟這禮拜的專欄有什麼關係呢?啊?當然沒關係,一點關係也沒有... 不過既然您提了,這禮拜我們就決定繼續前一篇專欄,就是那篇告訴您如何連接到 Microsoft Access 資料庫並讀取裡面的資料的文章嘍。今天我們要進行下一步,告訴您如何將資料錄加入 Access 資料庫中。接下來,還會告訴您如何修改現有的資料錄。

好啦,我們承認啦,這禮拜的專欄,我們的確不想動腦筋思考全新的主題。不過我們還是要替自己辯解一下,能夠將資料加入資料庫中,就像能夠從資料庫擷取資料一樣實用 (就算不比前者實用,至少還是很有用嘛)。所以就算我們有一點點偷懶,至少所講的主題還是很重要的。另外,您也可以把它想成是一整個系列中的第二篇文章,別擔心,我們不會草草了事!

就因為我們有點偷懶嘛,所以我們決定不再重複說明連接 Access 資料庫的基本概念。如果您需要簡單回顧一下,請參閱上禮拜的專欄。今天我們就直接切入正題,告訴您如何將新資料錄加入現有的資料庫中。

首先,我們假設您在 C:\Scripts 資料夾中,有一個名叫 Inventory.mdb 的 Access 資料庫。同時也假設這個資料庫有一個名叫 GeneralProperties 的表格,該表格含有下列欄位:

  • ComputerName

  • Department

  • OperatingSystem

  • Owner

當然啦,如果您沒有這麼一個資料庫,則下列範例指令碼也就沒有一個能用。但這不表示您無法從這些指令碼學到任何東西,只是無法執行它們,叫它們做任何動作罷了。

知道這一點之後,接下來就讓我們看看在資料庫加入新資料錄的指令碼吧:


On Error Resume Next

Const adOpenStatic = 3
Const adLockOptimistic = 3

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open _
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source = c:\scripts\inventory.mdb" 

objRecordSet.Open "SELECT * FROM GeneralProperties" , _
    objConnection, adOpenStatic, adLockOptimistic

objRecordSet.AddNew
objRecordSet("ComputerName") = "atl-ws-99"
objRecordSet("Department") = "Human Resources"
objRecordSet("OperatingSystem") = "Microsoft Windows XP Professional"
objRecordSet("Owner") = "Ken Myer"
objRecordSet.Update

objRecordSet.Close
objConnection.Close


附註:有一點要注意的是,這並不是在資料庫加入新資料錄的唯一途徑。比方說,SQL 迷也可以使用 Insert Into 查詢。我們使用 AddNew 方法,只是因為它比較單純;Insert Into 查詢可能會變得相當複雜,尤其當您要處理的欄位、儲存在變數的值、以及不同資料類型的欄位非常多時更是如此。既然今天是懶惰日嘛,我們就採用簡單的方法吧。


這個指令碼是藉由連接資料庫 C:\Scripts\Inventory.mdb 加以啟動。雖然我們說過不會再討論這個部份,不過這就是下面幾行程式碼所要做的動作;


Const adOpenStatic = 3
Const adLockOptimistic = 3

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open _
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source = c:\scripts\inventory.mdb"


連線之後,接下來就使用 Recordset 物件的 Open 方法來執行 SQL 查詢,從 GeneralProperties 表格擷取所有的資料錄;這就是下述程式碼所做的動作:


objRecordSet.Open "SELECT * FROM GeneralProperties" , _
    objConnection, adOpenStatic, adLockOptimistic


這個動作會產生一個資料錄集,讓我們在裡面加入新資料錄。這就是下述程式碼所做的動作:


objRecordSet.AddNew
objRecordSet("ComputerName") = "atl-ws-99"
objRecordSet("Department") = "Human Resources"
objRecordSet("OperatingSystem") = "Microsoft Windows XP Professional"
objRecordSet("Owner") = "Ken Myer"
objRecordSet.Update


一開始我們先呼叫 AddNew 方法,讓它設定一個空的範本,不過並未真正在資料庫加入任何東西 (這時候我們所做的工作,完全都在記憶體中進行)。接下來的幾行,則是針對這筆新資料錄,指定值給個別的欄位 (當然,這些欄位就是 GeneralProperties 表格中的欄位)。比方說,下面這一行會將 ComputerName 欄位值設為 atl-ws-99:


objRecordSet("ComputerName") = "atl-ws-99"


請注意,被指派的值 (atl-ws-99) 會以雙引號括住,因為 ComputerName 是文字欄位,原本就是要指派字串值給它。如果資料庫欄位是數值或布林值 (true/false),就不能用雙引號括住:


objRecordSet("IsLaptop") = False
objRecordSet("NumberOfPrcoessors") = 2


不過這一點您早就知道了吧!

最後我們再呼叫 Update 方法,實際將新資料錄寫到資料庫中:


objRecordSet.Update


別忘了那行程式碼,如果您忘了,「記憶體中」的資料錄集還是會加以更新而納入新資料錄,但是實際的資料庫仍然沒有改變。

正如您所見,在 Access 資料庫加入新資料錄,就是這麼簡單。但是修改現有的資料錄呢?舉個例說,假設我們才剛把電腦 atl-ws-99 加到資料庫不久,Ken Myer 就從人力資源部門轉調到財務部門了。也就是說,我們必須立即更新那部電腦的部門欄位。到底這有多難呢?

放心,一點都不難。同樣的,更新資料庫資料錄的方法也有好幾種,不過這次我們要採用我們覺得最簡單的方法來更新資料錄:搜尋資料錄、更新適當的欄位,然後再呼叫 Update 方法。這就是下面這個程式碼所做的動作:


On Error Resume Next

Const adOpenStatic = 3
Const adLockOptimistic = 3

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open _
    "Provider = Microsoft.Jet.OLEDB.4.0; " & _
        "Data Source = c:\scripts\inventory.mdb" 

objRecordSet.Open "SELECT * FROM GeneralProperties" , _
    objConnection, adOpenStatic, adLockOptimistic

strCriteria = "ComputerName = 'atl-ws-99'"

objRecordSet.Find strCriteria
objRecordset.Fields.Item("Department") = "Finance"
objRecordset.Update

objRecordSet.Close
objConnection.Close


您可能已經注意到了,這個指令碼的前半段,與加入新資料錄的指令碼一模一樣,我們先連接到資料庫,再利用 Open 方法傳回一個含 GeneralProperties 表格中所有資料錄的資料錄集。其實,在看到下一行之前,這兩個指令碼其實沒什麼不一樣:


strCriteria = "ComputerName = 'atl-ws-99'"


這行程式碼就是將搜尋準則指派給 strCriteria 變數。我們想要更新 atl-ws-99 這部電腦的資料錄,如您預期般,這就是我們的搜尋準則,格式為 FieldName = Value,或 ComputerName = 'atl-ws-99'

搜尋準則建立之後,再呼叫 Find 方法,在資料錄集找出該筆資料錄:


objRecordSet.Find strCriteria


接著再使用這兩行程式碼更新 Department 欄位,然後儲存您所做的變更:


objRecordset.Fields.Item("Department") = "Finance"
objRecordset.Update


請注意,我們在參考 Department 欄位時所用的語法不太尋常:objRecordset.Fields.Item("Department")。不過別擔心,您用就是了。從好的方面來說,雖然看起來怪怪的,但至少和從資料庫讀取時參考欄位所用的方式一樣 (請參考上禮拜的主題)。

同時也不要漏掉 Update 方法;同樣的,除非您呼叫 Update,否則資料庫中的資料錄仍然不會改變。

前面我們說過,還有其他方法可以修改現有的資料錄,不過那些方法改天再討論吧。到底改到哪一天呢?我這麼說好了:就是下次我們懶蟲上身,懶得為專欄想新主題的那一天吧。啊,您八成也猜出是什麼主題了。

顯示: