VB程序中用ADO對象動態(tài)創(chuàng)建數(shù)據(jù)庫和表
摘要: 本文闡述了在VB程序中利用ADO對象動態(tài)創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表的方法,這些方法在開發(fā)VB數(shù)據(jù)庫應(yīng)用程序中很有實用價值,,它可以提高數(shù)據(jù)庫程序靈活性,。 關(guān)鍵詞:數(shù)據(jù)庫、數(shù)據(jù)表,、ADO,、ADOX 1: 問題的提出 在Visual Basic中,常用的數(shù)據(jù)訪問接口有下列三種:數(shù)據(jù)庫訪問對象(DAO,,Data Access Object)、遠程數(shù)據(jù)庫對象(RDO,,Remote Data Object)和ActiveX數(shù)據(jù)對象(ADO,,ActiveX Data Object )。數(shù)據(jù)庫訪問技術(shù)一直在不斷進步,,而這三種接口的每一種都分別代表了該技術(shù)的不同發(fā)展階段,。最新的是ADO,它是比RDO和DAO更加簡單,,然而更加靈活的對象模型,。正因如此,越來越多的人在用VB開發(fā)數(shù)據(jù)庫軟件時使用ADO作為數(shù)據(jù)訪問接口,。在開發(fā)過程中,,我們通常的使用的方法是:先使用數(shù)據(jù)庫管理系統(tǒng)(例如:Microsoft Access)或VB中的可視化數(shù)據(jù)管理器建立好數(shù)據(jù)庫和數(shù)據(jù)表結(jié)構(gòu),,然后在程序中通過使用ADODC數(shù)據(jù)庫控件或引用ADO對象與數(shù)據(jù)庫中的表建立連接,再通過數(shù)據(jù)庫感知控件(例如:文本框,、DataGrid等)來進行數(shù)據(jù)庫的各種操作,。在這種開發(fā)過程中,我們有時需要面對這樣一個問題:如何讓用戶在程序運行過程中動態(tài)地建立自己所需的數(shù)據(jù)庫和數(shù)據(jù)表以提高程序的靈活性呢,?在程序運行過程中建立自己所需的數(shù)據(jù)庫和數(shù)據(jù)表,,其本質(zhì)就是用代碼(或者說通過編程)來建立數(shù)據(jù)庫和數(shù)據(jù)表。眾所周知,,在Foxpro或ASP編程中,,這是很容易的一件事件。那么在VB數(shù)據(jù)庫編程中又是怎樣來操作的呢,?在VB數(shù)據(jù)庫編程中,,如果使用DAO作為數(shù)據(jù)庫訪問接口技術(shù),則可以用CreateDatabase結(jié)合CreateTableDef方法來實現(xiàn),,目前已有不少書和雜志都講到了這種方法,,本文就不再講述了;但你如果使用的是最新的數(shù)據(jù)庫訪問接口技術(shù)ADO,,你卻發(fā)現(xiàn)目前的書和雜志上沒有文章講到如何用代碼來建立數(shù)據(jù)庫和數(shù)據(jù)表的方法,,可有時我們非常需要用到這種方法,下面我們就來解決這個問題,。 2: ADO與ADOX 我們先來對ADO 和ADOX進行簡單的認識,。在VB6中,使用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序時,,我們要引用對象庫"Microsoft ActiveX Data Objects 2.5 Library",, 這個東西的簡稱就是ADO,它是VB6數(shù)據(jù)庫最核心的對象群,,也是VB數(shù)據(jù)庫開發(fā)人員經(jīng)常所引用的對象庫,,在VB6中你可以看到它的各種版本,從2.0版到2.6版都有,,很多人對它已經(jīng)很熟悉,,在此我們不再詳細介紹。如果要在程序運行過程中創(chuàng)建數(shù)據(jù)庫和表,,我們還要引用對象庫"Microsoft ADO Ext 2.1. For DDL Security",,簡稱為ADOX,其庫文件名為是:Msadox.dll,。ADOX是對 ADO 對象和編程模型的擴展,,它將 ADO 擴展為包括創(chuàng)建、修改和刪除模式對象,,如表格和過程,。它還包括安全對象,,用于維護用戶和組,以及授予和撤消對象的權(quán)限,。ADOX的對象如下表所示:
對象 |
說明 |
Catalog |
包含描述數(shù)據(jù)源模式目錄的集合,。 |
Column |
表示表、索引或關(guān)鍵字的列,。 |
Group |
表示在安全數(shù)據(jù)庫內(nèi)有訪問權(quán)限的組賬號,。 |
Index |
表示數(shù)據(jù)庫表中的索引。 |
Key |
表示數(shù)據(jù)庫表中的主關(guān)鍵字,、外部關(guān)鍵字或唯一關(guān)鍵字,。 |
Procedure |
表示存儲的過程。 |
Table |
表示數(shù)據(jù)庫表,,包括列,、索引和關(guān)鍵字。 |
User |
表示在安全數(shù)據(jù)庫內(nèi)具有訪問權(quán)限的用戶賬號,。 |
View |
表示記錄或虛擬表的過濾集,。 |
ADOX常用方法有:Append(包括Columns、Groups,、Indexes,、Keys、Procedures,、Tables,、Users、Views),、Create(創(chuàng)建新的目錄),、Delete(刪除集合中的對象)、Refresh(更新集合中的對象)等等,。有關(guān) ADOX 的詳細信息,,請在 http://www.microsoft.com/data/ado 中參閱 Microsoft 發(fā)布的有關(guān) ADOX說明的 Web 頁。
3: 在原有數(shù)據(jù)表的基礎(chǔ)上產(chǎn)生新的數(shù)據(jù)表
如果僅僅是在已有的數(shù)據(jù)表的基礎(chǔ)上產(chǎn)生新的數(shù)據(jù)表,,我們只要引用對象庫"Microsoft ActiveX Data Objects 2.5 Library"再利用Select…Into語句就可以了,。例如:有一個名為Wage.mdb的數(shù)據(jù)庫,數(shù)據(jù)庫中有一個名為"工資表"數(shù)據(jù)表,,該數(shù)據(jù)表的字段有:編號、姓名,、基本工資,、津貼、應(yīng)發(fā)工資,、扣款,、實發(fā)工資等,,這個表中已經(jīng)有很多的記錄。現(xiàn)在我們把其中的實發(fā)工資大于2000的記錄篩選出來組成一個新表,,新表的名稱由用戶從文本框中輸入,,新表中我們只要三個字段,它們是:編號,、姓名,、實發(fā)工資。我們用下列程序就可以實現(xiàn):
(事先在窗體中添加一個文本框Text1和一個命令按鈕Command1)
Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim command As New ADODB.command
Private Sub Command1_Click() Dim bm As String Dim sql As String If Text1.Text <>"" Then bm = Trim(Text1.Text) sql= "Select 編號,姓名,實發(fā)工資 Into " + bm + " From 工資表 Where 實發(fā)工資>2000" Set command.ActiveConnection = conn command.CommandText = sql command.Execute Else MsgBox "你必須輸入一個名字" End If
Private Sub Form_Load() Dim str As String str = App.Path If Right(str, 1) <>"\" Then str = str + "\" End If pstr = "Provider=Microsoft.Jet.OLEDB.3.51;" pstr = pstr & "Persist Security Info=False;" pstr = pstr & "Data Source=" & str & "wage.mdb" conn.Open pstr rs.CursorLocation = adUseClient rs.Open "工資表", conn, adOpenKeyset, adLockPessimistic Set DataGrid1.DataSource = rs End Sub
當然,,我們還可以把程序設(shè)計得更好,,比如:讓用戶先在窗口中任意選擇所需的字段和一些條件,然后再組合生成一個新表,。但無論如何,,這種操作只能在從原表的基礎(chǔ)上產(chǎn)生一個新表,不能產(chǎn)生一個數(shù)據(jù)庫文件,,并且新表和原表放在同一個數(shù)據(jù)庫中,。
4: 建立新的數(shù)據(jù)庫和表
前面講到的方法有一定的局限性,它不能讓用戶產(chǎn)生自己所需的數(shù)據(jù)庫文件,,即使能產(chǎn)生數(shù)據(jù)表也只能在原有表的基礎(chǔ)上生成,。我們現(xiàn)在的目的就是讓用戶利用ADO對象在程序運行過程中創(chuàng)建數(shù)據(jù)庫和表,就好象他利用Access來建立數(shù)據(jù)庫和表一樣,。為此,,我們應(yīng)該引用對象庫"Microsoft ActiveX Data Objects 2.5 Library"和"Microsoft ADO Ext 2.1. For DDL Security" 我們不妨用一個實例來說明具體的操作過程和方法。我們的實例要達到目的是:在程序運行過程中建立一個數(shù)據(jù)庫,,數(shù)據(jù)庫的名稱由用戶輸入,。然后在數(shù)據(jù)庫中建立一個名為"MyTable"的數(shù)據(jù)表,數(shù)據(jù)表中有三個字段,,它們分別是:"編號"(整數(shù)型),、 "姓名"(字符型,寬度為8),、"住址" (字符型,,寬度為50),接著在數(shù)據(jù)表中添加一條記錄,,最后在DataGrid控件中把記錄的內(nèi)容顯示出來,,并且讓用戶在DataGrid控件中任意修改、添加記錄,。 首先在VB中新建一個窗體,,然后在"工程"菜單中引用對象庫"Microsoft ActiveX Data Objects 2.5 Library"和"Microsoft ADO Ext 2.1. For DDL Security"。接著定義三個窗體級的對象變量和一個窗體級的字符串變量,它們的具體定義是:
Dim cat As New ADOX.Catalog '不用cat用另外一個名字也可以 Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim pstr As String '定義該變量是為了后面的書寫方便
為了更靈活地創(chuàng)建數(shù)據(jù)庫,,我們可以在窗體中加入一個通用對話框,、一個DataGrid控件,三個命令按鈕,,它們的標題分別是:創(chuàng)建數(shù)據(jù)庫和表,、查看、更新,。通用對話框的作用是給用戶輸入數(shù)據(jù)庫文件名和決定數(shù)據(jù)庫的存放位置,。 "創(chuàng)建數(shù)據(jù)庫和表"命令按鈕對應(yīng)的代碼是:
Private Sub Command1_Click() Dim fm As String 'fm變量用來獲取用戶輸入的文件名 CommonDialog1.Filter = "MDB文件(*.mdb)|*.mdb|AllFiles(*.*)|*.*|" CommonDialog1.FilterIndex = 1 CommonDialog1.InitDir = "D:\Jthpaper" CommonDialog1.Flags = 6 CommonDialog1.Action = 2 If CommonDialog1.FileName = "" Then MsgBox "你必須輸入一個文件名,請重新保存一次,!" Exit Sub Else fm = CommonDialog1.FileName End If pstr = "Provider=Microsoft.Jet.OLEDB.4.0;" '不能把這里的4.0改為3.51 pstr = pstr & "Data Source=" & fm cat.Create pstr '創(chuàng)建數(shù)據(jù)庫 Dim tbl As New Table cat.ActiveConnection = pstr tbl.Name = "MyTable" '表的名稱 tbl.Columns.Append "編號", adInteger '表的第一個字段 tbl.Columns.Append "姓名", adVarWChar, 8 '表的第二個字段 tbl.Columns.Append "住址", adVarWChar, 50 '表的第三個字段 cat.Tables.Append tbl '建立數(shù)據(jù)表 conn.Open pstr rs.CursorLocation = adUseClient rs.Open "MyTable", conn, adOpenKeyset, adLockPessimistic rs.AddNew '往表中添加新記錄 rs.Fields(0).Value = 9801 rs.Fields(1).Value = "孫悟空" rs.Fields(2).Value = "廣州市花果山" rs.Update End Sub
上面程序中有一個需要說明的地方,,這就是語句:pstr = "Provider=Microsoft.Jet.OLEDB.4.0;",這個語句表示Microsoft Jet OLEDB驅(qū)動程序的版本是4.0,,這是目前最新的版本,,利用它你可以用VB中的ADO對象訪問Access2000及其以下版本所建立的數(shù)據(jù)庫。你不能把這里的"4.0"改為"3.51",,否則程序不能正常運行,;在VB6中,3.51版本的Microsoft Jet OLEDB驅(qū)動程序?qū)?yīng)的是Access97數(shù)據(jù)庫,。換而言之,,用這種方法建立的數(shù)據(jù)庫和表跟用Access2000所建立的數(shù)據(jù)庫和表是同一類型的,你只能直接用Access2000來打開,,雖然你可以用VB6來訪問這種數(shù)據(jù)庫和其中的數(shù)據(jù)表,,但你不能用Access97或VB6中的"可視化數(shù)據(jù)管理器"來直接打開。 在程序運行時只要用戶單擊該命令按鈕就可以創(chuàng)建自己所需的數(shù)據(jù)庫,。"查看"命令按鈕對應(yīng)的代碼是:
Private Sub Command3_Click() Set DataGrid1.DataSource = rs End Sub "更新"命令按鈕對應(yīng)的代碼是: Private Sub Command4_Click() rs.UpdateBatch End Sub
我們這個實例只是用來說明問題,,在實際應(yīng)用當中你可以把它進一步改進,例如:你在窗體中再增加一些文本框和組合框,,供用戶輸入或選擇數(shù)據(jù)表的名稱,、字段的名稱、字段的寬度和小數(shù)位數(shù),。這樣,,用戶就可以自主地決定數(shù)據(jù)庫的所有內(nèi)容了,程序的靈活性也就大大提高了,。 5: 結(jié)束語 如果你使用的是最新的數(shù)據(jù)訪問接口技術(shù)ADO(Microsoft強烈建議大家使用這種最新技術(shù)),,你又想在程序運行過程中創(chuàng)建數(shù)據(jù)庫文件和數(shù)據(jù)表,此時,,你應(yīng)該在Visual Basic 6.0中引用對象庫"Microsoft ActiveX Data Objects 2.5 Library"和"Microsoft ADO Ext 2.1. For DDL Security",,然后使用ADOX對象的Create,、Append等方法就可以實現(xiàn)。 這種方法使用的Microsoft Jet OLEDB驅(qū)動程序的版本是4.0,,因此,使用這種方法建立的數(shù)據(jù)庫文件和數(shù)據(jù)表可以直接使用Access2000打開,。筆者在VB數(shù)據(jù)庫軟件開發(fā)過程中已多次使用這種方法,,該方法在提高程序的靈活性和滿足用戶的特殊需要方面有很大的作用。
|