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