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)有很多的記錄?,F(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ù)庫中。
在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)有很多的記錄?,F(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ù)庫中。