: 問題的提出
在Visual Basic中常用的數據訪問接口有下列三種數據庫訪問對象(DAOData Access Object)遠程數據庫對象(RDORemote Data Object)和ActiveX數據對象(ADOActiveX Data Object )數據庫訪問技術一直在不斷進步而這三種接口的每一種都分別代表了該技術的不同發展階段最新的是ADO它是比RDO和DAO更加簡單然而更加靈活的對象模型正因如此越來越多的人在用VB開發數據庫軟件時使用ADO作為數據訪問接口在開發過程中我們通常的使用的方法是先使用數據庫管理系統(例如Microsoft Access)或VB中的可視化數據管理器建立好數據庫和數據表結構然後在程序中通過使用ADODC數據庫控件或引用ADO對象與數據庫中的表建立連接再通過數據庫感知控件(例如文本框DataGrid等)來進行數據庫的各種操作在這種開發過程中我們有時需要面對這樣一個問題如何讓用戶在程序運行過程中動態地建立自己所需的數據庫和數據表以提高程序的靈活性呢?在程序運行過程中建立自己所需的數據庫和數據表其本質就是用代碼(或者說通過編程)來建立數據庫和數據表眾所周知在Foxpro或ASP編程中這是很容易的一件事件那麼在VB數據庫編程中又是怎樣來操作的呢?在VB數據庫編程中如果使用DAO作為數據庫訪問接口技術則可以用CreateDatabase結合CreateTableDef方法來實現目前已有不少書和雜志都講到了這種方法本文就不再講述了但你如果使用的是最新的數據庫訪問接口技術ADO你卻發現目前的書和雜志上沒有文章講到如何用代碼來建立數據庫和數據表的方法可有時我們非常需要用到這種方法下面我們就來解決這個問題
: ADO與ADOX
我們先來對ADO 和ADOX進行簡單的認識在VB中使用ADO開發數據庫應用程序時我們要引用對象庫Microsoft ActiveX Data Objects Library 這個東西的簡稱就是ADO它是VB數據庫最核心的對象群也是VB數據庫開發人員經常所引用的對象庫在VB中你可以看到它的各種版本從版到版都有很多人對它已經很熟悉在此我們不再詳細介紹如果要在程序運行過程中創建數據庫和表我們還要引用對象庫Microsoft ADO Ext For DDL Security簡稱為ADOX其庫文件名為是MsadoxdllADOX是對 ADO 對象和編程模型的擴展它將 ADO 擴展為包括創建修改和刪除模式對象如表格和過程它還包括安全對象用於維護用戶和組以及授予和撤消對象的權限ADOX的對象如下表所示
對象 說明
Catalog 包含描述數據源模式目錄的集合
Column 表示表索引或關鍵字的列
Group 表示在安全數據庫內有訪問權限的組帳號
Index 表示數據庫表中的索引
Key 表示數據庫表中的主關鍵字外部關鍵字或唯一關鍵字
Procedure 表示存儲的過程
Table 表示數據庫表包括列索引和關鍵字
User 表示在安全數據庫內具有訪問權限的用戶帳號
View 表示記錄或虛擬表的過濾集
ADOX常用方法有Append(包括ColumnsGroupsIndexesKeysProceduresTablesUsersViews)Create(創建新的目錄)Delete(刪除集合中的對象)Refresh(更新集合中的對象)等等有關 ADOX 的詳細信息請在 中參閱 Microsoft 發布的有關 ADOX說明的 Web 頁
: 在原有數據表的基礎上產生新的數據表
如果僅僅是在已有的數據表的基礎上產生新的數據表我們只要引用對象庫Microsoft ActiveX Data Objects Library再利用Select…Into語句就可以了例如有一個名為Wagemdb的數據庫數據庫中有一個名為工資表數據表該數據表的字段有編號姓名基本工資津貼應發工資扣款實發工資等這個表中已經有很多的記錄現在我們把其中的實發工資大於的記錄篩選出來組成一個新表新表的名稱由用戶從文本框中輸入新表中我們只要三個字段它們是編號姓名實發工資我們用下列程序就可以實現
(事先在窗體中添加一個文本框Text和一個命令按鈕Command)
Dim conn As New ADODBConnection
Dim rs As New ADODBRecordset
Dim command As New mand
Private Sub Command_Click()
Dim bm As String
Dim sql As String
If TextText <> Then
bm = Trim(TextText)
sql= Select 編號姓名實發工資 Into + bm + From 工資表 Where 實發工資>
Set commandActiveConnection = conn
commandCommandText = sql
commandExecute
Else
MsgBox 你必須輸入一個名字
End If
Private Sub Form_Load()
Dim str As String
str = AppPath
If Right(str ) <>\ Then
str = str + \
End If
pstr = Provider=MicrosoftJetOLEDB;
pstr = pstr & Persist Security Info=False;
pstr = pstr & Data Source= & str & wagemdb
connOpen pstr
rsCursorLocation = adUseClient
rsOpen 工資表 conn adOpenKeyset adLockPessimistic
Set DataGridDataSource = rs
End Sub
當然我們還可以把程序設計得更好比如讓用戶先在窗口中任意選擇所需的字段和一些條件然後再組合生成一個新表但無論如何這種操作只能在從原表的基礎上產生一個新表不能產生一個數據庫文件並且新表和原表放在同一個數據庫中
: 建立新的數據庫和表
前面講到的方法有一定的局限性它不能讓用戶產生自己所需的數據庫文件即使能產生數據表也只能在原有表的基礎上生成我們現在的目的就是讓用戶利用ADO對象在程序運行過程中創建數據庫和表就好象他利用Access來建立數據庫和表一樣為此我們應該引用對象庫Microsoft ActiveX Data Objects Library和Microsoft ADO Ext For DDL Security
我們不妨用一個實例來說明具體的操作過程和方法我們的實例要達到目的是在程序運行過程中建立一個數據庫數據庫的名稱由用戶輸入然後在數據庫中建立一個名為MyTable的數據表數據表中有三個字段它們分別是編號(整數型) 姓名(字符型寬度為)住址 (字符型寬度為)接著在數據表中添加一條記錄最後在DataGrid控件中把記錄的內容顯示出來並且讓用戶在DataGrid控件中任意修改添加記錄
首先在VB中新建一個窗體然後在工程菜單中引用對象庫Microsoft ActiveX Data Objects Library和Microsoft ADO Ext For DDL Security接著定義三個窗體級的對象變量和一個窗體級的字符串變量它們的具體定義是
Dim cat As New ADOXCatalog 不用cat用另外一個名字也可以
Dim conn As New ADODBConnection
Dim rs As New ADODBRecordset
Dim pstr As String 定義該變量是為了後面的書寫方便
為了更靈活地創建數據庫我們可以在窗體中加入一個通用對話框一個DataGrid控件三個命令按鈕它們的標題分別是創建數據庫和表查看更新通用對話框的作用是給用戶輸入數據庫文件名和決定數據庫的存放位置 創建數據庫和表命令按鈕對應的代碼是
Private Sub Command_Click()
Dim fm As String fm變量用來獲取用戶輸入的文件名
CommonDialogFilter = MDB文件(*mdb)|*mdb|AllFiles(**)|**|
CommonDialogFilterIndex =
CommonDialogInitDir = D:\Jthpaper
CommonDialogFlags =
CommonDialogAction =
If CommonDialogFileName = Then
MsgBox 你必須輸入一個文件名請重新保存一次!
Exit Sub
Else
fm = CommonDialogFileName
End If
pstr = Provider=MicrosoftJetOLEDB; 不能把這裡的改為
pstr = pstr & Data Source= & fm
catCreate pstr 創建數據庫
Dim tbl As New Table
catActiveConnection = pstr
tblName = MyTable 表的名稱
tblColumnsAppend 編號 adInteger 表的第一個字段
tblColumnsAppend 姓名 adVarWChar 表的第二個字段
tblColumnsAppend 住址 adVarWChar 表的第三個字段
catTablesAppend tbl 建立數據表
connOpen pstr
rsCursorLocation = adUseClient
rsOpen MyTable conn adOpenKeyset adLockPessimistic
rsAddNew 往表中添加新記錄
rsFields()Value =
rsFields()Value = 孫悟空
rsFields()Value = 廣州市花果山
rsUpdate
End Sub
上面程序中有一個需要說明的地方這就是語句pstr = Provider=MicrosoftJetOLEDB;這個語句表示Microsoft Jet OLEDB驅動程序的版本是這是目前最新的版本利用它你可以用VB中的ADO對象訪問Access及其以下版本所建立的數據庫你不能把這裡的改為否則程序不能正常運行在VB中版本的Microsoft Jet OLEDB驅動程序對應的是Access數據庫換而言之用這種方法建立的數據庫和表跟用Access所建立的數據庫和表是同一類型的你只能直接用Access來打開雖然你可以用VB來訪問這種數據庫和其中的數據表但你不能用Access或VB中的可視化數據管理器來直接打開
在程序運行時只要用戶單擊該命令按鈕就可以創建自己所需的數據庫查看命令按鈕對應的代碼是
Private Sub Command_Click()
Set DataGridDataSource = rs
End Sub
更新命令按鈕對應的代碼是
Private Sub Command_Click()
rsUpdateBatch
End Sub
我們這個實例只是用來說明問題在實際應用當中你可以把它進一步改進例如你在窗體中再增加一些文本框和組合框供用戶輸入或選擇數據表的名稱字段的名稱字段的寬度和小數位數這樣用戶就可以自主地決定數據庫的所有內容了程序的靈活性也就大大提高了
: 結束語
如果你使用的是最新的數據訪問接口技術ADO(Microsoft強烈建議大家使用這種最新技術)你又想在程序運行過程中創建數據庫文件和數據表此時你應該在Visual Basic 中引用對象庫Microsoft ActiveX Data Objects Library和Microsoft ADO Ext For DDL Security然後使用ADOX對象的CreateAppend等方法就可以實現 這種方法使用的Microsoft Jet OLEDB驅動程序的版本是因此使用這種方法建立的數據庫文件和數據表可以直接使用Access打開筆者在VB數據庫軟件開發過程中已多次使用這種方法該方法在提高程序的靈活性和滿足用戶的特殊需要方面有很大的作用
From:http://tw.wingwit.com/Article/program/net/201311/13882.html