VisualBasic數據庫操作方法小結
|
筆者和同事們在使用VB對數據庫操作應用時,總結了如下的幾種方法,供初學者參考,希望能對大家有所啟發。
1、數據庫打開/關閉方法的選擇
在通常情況下,數據庫的打開操作是在程序代碼中使用OpenDatabase方法實現,其格式如下:
Set database=workspace.OpenDatabase(dbname,options,readonly,connect)
可以通過指定數據庫名字、打開方式、連接信息等參數打開一個現已存在的數據庫,使用Close方法即可關閉該數據庫。由于涉及VB代碼的編寫,其軟件編制工作比較復雜。 另一方面,VB的數據控件(Data Control)也可以執行數據庫的打用關閉操作。我們可以在數據控件的屬性窗口中預先填好數據庫打開的相關參數,一旦該數據控件啟動,數據庫便會自動以指定的方式打開,而當該數據控件終止時,對應的數據庫也將自動關閉。對于按這二種方式打開的數據庫,其后的數據庫訪問操作沒有什么本質的區別。
以上兩種數據庫打用關閉的方法各有千秋:使用OpenDatabase方法可以在程序運行中動態地設置數據庫打開參數,并且可以多次以不同的方式打開和關閉同一個數據庫,具有相當大的靈活性。而如果使用數據控件,則不需要另外編寫VB代碼,只要在程序編制時預先設置數據庫的相關參數,程序開始運行后便會自動地以我們指定的方式打開數據庫,并在程序終止時自動關閉該數據庫,因此顯得相當方便。在實際應用中,可以視情況的不同而采用不同的處理方法:如果要求數據庫在程序運行中始終處于打開狀態并且其打開方式保持不變(如一直處于只讀狀態),那么,可以采用數據控件方法打開數據庫;如果要求數據庫在程序運行中時而打開時而關閉,或者經常在只讀和讀寫方式間來回切換,則只能采用OpenDatabase方法編寫程序代碼。
2、通過相對路徑指定數據庫文件
在很多情況下,不管采用上述哪一種方法打開數據庫,都必須在程序設計時就指定需要打開的數據庫文件。但是,我們通常不能保證該軟件完成后一定會被安裝在每臺機器的同一目錄下。因此該數據庫文件的絕對路徑一般在設計時還難以完全確定,只能采用相對路徑的辦法來解決這個問題。
在VB中,App對象是一個全局對象,用來提供當前應用程序的相關信息,其Path屬性反映的是當前應用程序的可執行文件(.exe)所在的絕對路徑,并且只在程序運行時才有效。通過使用App對象的Path屬性,可以方便地獲得當前程序所在的目錄路徑。因此,如果把數據庫文件存放在與程序路徑相關的目錄下,便可以在程序設計時就指定數據庫文件的相對路徑,當程序運行時,通過App對象的Path屬性動態地獲取其絕對路徑。
下面的一段代碼,用來在程序開始運行時獲取程序的路徑,并賦值給變量AppPath,然后在數據控件Data1的Database Name屬性中與數據庫文件的相對路徑"DatabaseSample.Mdb"結合,組成數據庫文件的絕對路徑。這段代碼通常出現在Form-Load中:
| Dim AppPath As String ' 設置路徑變量 AppPath=App.Path ' 獲取程序路徑 If Right(AppPath,1)<>""Then AppPath=AppPath+"" ' 若路徑尾部沒有"",則添加之 Data1.Database Name=AppPath+"DatabaseSample.mdb" ' 與相對路徑結合,組成絕對路徑 |
3、用SQL語句完成數據庫操作
SQL也就是結構化查詢語言,是用于數據庫查詢的一種通用標準語言,在現今的大多數數據庫軟件系統中均得到支持。1句SQL語句通常可以完成以前由許多條語句才能完成的復雜的數據庫查詢操作,具有較高的工作效率。
在VB中,SQL語句往往作為某些特定方法的參數而得以執行(沒有FoxPro等數據庫軟件那樣直截了當),比如可以把SQL語句作為Execute方法的1個字符串參數而執行,其格式如下:
| object.Execute SQL-statement,options |
在其中的SQL-statement字符串中,可以使用標準的SQL語句,如:SELECT、INSERT、DELETE及UPDATE等。下面的例子是在數據庫對象DB中執行SQL語句,從當前數據庫的EMployees數據表中,選擇字段LastName='King'的所有記錄,并將這些記錄的LastName和FirstName這2個字段的內容,保存到同一數據庫的Backup數據表中:
| DB.Execute("SELECT LastName,FirstName INTO Backup FORM Employees WHERE LastName='King';") |
4、For語句在數據庫中的應用
For語句是幾乎所有高級語言都有的語句,通常用來完成指定次數的循環,在循環中可以完成一些指定的工作。而在VB中,For語句還可以用來對某個集合中的每1個元素循環執行若干操作,而不必預先設定循環次數,其格式如下:
| For Each element In group [statements] Next[element] |
For語句的這一特點可用于按照指定條件搜索整個數據庫。以下的代碼便可以對數據庫對象DB所指的數據庫中的所有數據表進行搜索,并完成指定的操作:
| For Each Td In DB.Table Defs ' 循環搜索數據庫中的所有數據表 ... ... ' 對數據表執行指定的操作 Next |
5、復制數據庫的結構定義
在數據庫應用中,經常需要在程序運行時動態地把一個數據庫的結構定義完整地復制到另一個數據庫中。由于新型的數據庫可以同時包含若干個數據表,而每個數據表的結構定義又不近相同,因此,如果通過逐個定義數據表中所有字段的類型、長度的方法復制數據庫結構,則該程序將變得相當冗長和復雜,日后的維護也比較困難。但是,通過綜合運用上述的幾種應用方法,用相當短的VB語句完成同樣的工作,實且程序也易于理解和維護。
程序清單如下:
| Sub CopyDBStrnc(src As String,dst As String) ' 定義子程序Copy DBStrnc,用于復制數據庫結構 ' 調用參數: ' src--源數據庫的文件名 ' dst--目的數據庫的文件名 Dim DB As Database,Td As TableDef,SQLstr As String ' 定義變量: ' DB--數據庫對象 ' Td--數據表定義對象 ' SQLstr--SQL語句變量 Set DB=Create Database(dst,dbLangGeneral) ' 創建目的數據庫dst ' 關閉目的數據庫dst DB.Close Set db=OpenDatabase(src,False,True) ' 以共享、只讀方式打開源數據庫src For Each Td In DB.TableDefs ' 循環搜索源數據庫DB中的所有數據表定義 If(Td.Attributes And dbSyste mObect)=0 Then ' 忽略系統數據表,只針對用戶定義的數據表進行搜寫 SQLstr="SELECT * INTO"+Td.Name+"IN"+dst+"'FROM"+ Td.Name+"'IN"+src+"'WHERE False' ' 對SQL語句變量賦值,完成以下功能: ' 從源數據庫src的數據表中選擇所有字段 ' 存入目的數據庫dst的同名數據表中 ' 選擇數據表的字段定義,不包括任何記錄 DB.Execute(SQLstr) ' 執行SQL語句 End If Next ' 結束循環搜索 DB.Close ' 關閉源數據庫 Exit Sub ' 結束子程序定義 |