用DAO訪問遠程數(shù)據(jù)庫可以通過三步來實現(xiàn),即數(shù)據(jù)連接、數(shù)據(jù)處理和斷開連接。下面主要介紹數(shù)據(jù)連接和數(shù)據(jù)處理的具體操作。
數(shù)據(jù)連接
DAO通過鏈接遠程表的方式來進行數(shù)據(jù)連接。這樣,數(shù)據(jù)雖然駐留在遠程數(shù)據(jù)源上,但在本地的數(shù)據(jù)庫中可以存儲與遠程數(shù)據(jù)的永久性連接,同時緩存鏈接的表結(jié)構(gòu)信息,從而在下一次訪問該表時, 不用再次從服務(wù)器中檢索這些結(jié)構(gòu)信息,加快了連接速度。一旦鏈接了一個表,該鏈接便會保留在各會話期間,直到連接斷開。鏈接遠程表的具體操作是:
用 OpenDatabase 方法打開將要包含該鏈接的本地數(shù)據(jù)庫,用 CreateTableDef 方法在該數(shù)據(jù)庫中創(chuàng)建一個新的TableDef對象,將 TableDef 對象的 Connect 屬性設(shè)置為一個合法的連接字符串,標識要訪問的遠程數(shù)據(jù)庫類型、數(shù)據(jù)文件的路徑以及用戶名和遠程數(shù)據(jù)源密碼等。將 TableDef 對象的 SourceTableName 屬性設(shè)置為遠程數(shù)據(jù)庫中要訪問的表的名稱。 添加 TableDef 對象到 TableDefs 集合中。
實現(xiàn)鏈接遠程表操作的代碼如下:
Public Sub LinkTable(strDB As String, strRoDB As String, _
strCn As String, strTdf As String, linkTdfName As String)
Dim linkTdf As New TableDef
Set dbs = OpenDatabase(strDB)
linkTdf.Name = linkTdfName 100
tempTable = UCase(linkTdf.Name)
For i = 0 To dbs.TableDefs.Count - 1
If UCase(dbs.TableDefs(i).Name) = tempTable Then
If MsgBox(linkTdfName + " 已存在,是否刪除 ?", _
vbQuestion + vbYesNo) = vbYes Then
dbs.TableDefs.Delete linkTdf.Name
Exit For
Else: MsgBox "重新輸入新表名"
linkTdfName = InputBox(" 新表名")
GoTo 100
End If
End If
Next i
Set linkTdf = dbs.CreateTableDef(linkTdfName) '鏈接遠程表
linkTdf.Connect = ";database=" + strCn
linkTdf.SourceTableName = strTdf
dbs.TableDefs.Append linkTdf
End Sub
上述過程用來實現(xiàn)遠程表的連接,它有5個參數(shù),其中strRoDB是要訪問的遠程數(shù)據(jù)庫名(包括路徑);strTdf 是該數(shù)據(jù)庫中的表名;strDB 是要鏈接的本地數(shù)據(jù)庫(包括路徑);linkTdfName 是本地數(shù)據(jù)庫的一個新表名,用來建立遠程表的鏈接;strCn 是指定連接信息的字符串。需要特別注意的是,除了在訪問遠程 Microsoft Jet 數(shù)據(jù)庫時,連接字符串要以分號(;)開頭外,指定連接信息的字符串都必須以所訪問的遠程數(shù)據(jù)庫類型開頭。DAO可以訪問的遠程數(shù)據(jù)源有以下三類:
Microsoft Jet 數(shù)據(jù)源,如:Access 數(shù)據(jù)。
IISAM(可安裝的索引化順序訪問方法)格式數(shù)據(jù)源,如:FoxPro、Paradox、dBASE 數(shù)據(jù)。
ODBC 數(shù)據(jù)源,如:SQL Server 數(shù)據(jù)、Oracle 數(shù)據(jù)。
例如:設(shè)網(wǎng)絡(luò)服務(wù)器名為server,共享目錄為 C:\Sales 的 FoxPro數(shù)據(jù)庫,連接字符串應(yīng)為strCn="FoxPro3.0;database=\\server\c$\Sales\Region1"
此外,DAO 通過 Microsoft Jet 數(shù)據(jù)庫引擎訪問遠程數(shù)據(jù)時,還可以用 OpenDatabase 方法直接打開遠程表。在本地數(shù)據(jù)庫中并未存儲與遠程數(shù)據(jù)源建立連接所需要的信息。如果使用鏈接方式訪問數(shù)據(jù),則不必在每次會話開始時提供連接信息,從而可以提高效率。
數(shù)據(jù)處理
數(shù)據(jù)連接建立后,可以用 OpenRecordset 方法打開一個記錄集,并可用 DBGrid 控件和 Data 控件方便地瀏覽整個記錄集。如果使用表類型(Table-type)記錄對象,則對應(yīng)的是一個實際存在的數(shù)據(jù)庫表,在多用戶環(huán)境下,其它用戶對數(shù)據(jù)的修改會立即反映到表中;如果使用動態(tài)集類型(Dynaset-type)記錄對象,則對應(yīng)的既可以是一個表中全部記錄,又可以是一個查詢的結(jié)果,并且可以更新記錄集中的記錄;如果使用快照類型(Snapshot-type)記錄對象,則對應(yīng)的可以是表中的全部記錄,也可以是一個查詢結(jié)果,但不能進行記錄的增加、刪除和修改操作。此外,還可以建立其它類型的記錄對象,如僅向前型(ForwardOnly-type)記錄對象和動態(tài)型(Dynamic-type)記錄對象。
下面是打開動態(tài)集記錄對象并顯示記錄的代碼:
Public Sub rst_display(strDB As String, strRst As String, strForm As Form)
Set dbs = OpenDatabase(strDB)
Set rst = dbs.OpenRecordset(strRst, dbOpenDynaset)
strForm!Data1.DatabaseName = dbs.Name
strForm!Data1.RecordSource = rst.Name
strForm!Data1.Refresh
strForm!DBGrid1.ReBind
End Sub
上述過程有三個參數(shù),其中 strDB 用來指定本地數(shù)據(jù)庫名(包括路徑),linkTdfName 是在本地數(shù)據(jù)庫中新建的鏈接遠程表的表名,strForm 是網(wǎng)格控件和數(shù)據(jù)控件所在的窗體名。調(diào)用此過程可以基于新表建立一個動態(tài)集類型的記錄對象,并可在網(wǎng)格中瀏覽各個記錄。
斷開連接可以通過關(guān)閉應(yīng)用程序或設(shè)置連接超時來實現(xiàn)。注意:如果對數(shù)據(jù)庫對象使用 Close方法,則由于在 Miscrosoft Jet 數(shù)據(jù)庫引擎內(nèi)部緩存了連接,實際上連接并未取消。
數(shù)據(jù)連接
DAO通過鏈接遠程表的方式來進行數(shù)據(jù)連接。這樣,數(shù)據(jù)雖然駐留在遠程數(shù)據(jù)源上,但在本地的數(shù)據(jù)庫中可以存儲與遠程數(shù)據(jù)的永久性連接,同時緩存鏈接的表結(jié)構(gòu)信息,從而在下一次訪問該表時, 不用再次從服務(wù)器中檢索這些結(jié)構(gòu)信息,加快了連接速度。一旦鏈接了一個表,該鏈接便會保留在各會話期間,直到連接斷開。鏈接遠程表的具體操作是:
用 OpenDatabase 方法打開將要包含該鏈接的本地數(shù)據(jù)庫,用 CreateTableDef 方法在該數(shù)據(jù)庫中創(chuàng)建一個新的TableDef對象,將 TableDef 對象的 Connect 屬性設(shè)置為一個合法的連接字符串,標識要訪問的遠程數(shù)據(jù)庫類型、數(shù)據(jù)文件的路徑以及用戶名和遠程數(shù)據(jù)源密碼等。將 TableDef 對象的 SourceTableName 屬性設(shè)置為遠程數(shù)據(jù)庫中要訪問的表的名稱。 添加 TableDef 對象到 TableDefs 集合中。
實現(xiàn)鏈接遠程表操作的代碼如下:
Public Sub LinkTable(strDB As String, strRoDB As String, _
strCn As String, strTdf As String, linkTdfName As String)
Dim linkTdf As New TableDef
Set dbs = OpenDatabase(strDB)
linkTdf.Name = linkTdfName 100
tempTable = UCase(linkTdf.Name)
For i = 0 To dbs.TableDefs.Count - 1
If UCase(dbs.TableDefs(i).Name) = tempTable Then
If MsgBox(linkTdfName + " 已存在,是否刪除 ?", _
vbQuestion + vbYesNo) = vbYes Then
dbs.TableDefs.Delete linkTdf.Name
Exit For
Else: MsgBox "重新輸入新表名"
linkTdfName = InputBox(" 新表名")
GoTo 100
End If
End If
Next i
Set linkTdf = dbs.CreateTableDef(linkTdfName) '鏈接遠程表
linkTdf.Connect = ";database=" + strCn
linkTdf.SourceTableName = strTdf
dbs.TableDefs.Append linkTdf
End Sub
上述過程用來實現(xiàn)遠程表的連接,它有5個參數(shù),其中strRoDB是要訪問的遠程數(shù)據(jù)庫名(包括路徑);strTdf 是該數(shù)據(jù)庫中的表名;strDB 是要鏈接的本地數(shù)據(jù)庫(包括路徑);linkTdfName 是本地數(shù)據(jù)庫的一個新表名,用來建立遠程表的鏈接;strCn 是指定連接信息的字符串。需要特別注意的是,除了在訪問遠程 Microsoft Jet 數(shù)據(jù)庫時,連接字符串要以分號(;)開頭外,指定連接信息的字符串都必須以所訪問的遠程數(shù)據(jù)庫類型開頭。DAO可以訪問的遠程數(shù)據(jù)源有以下三類:
Microsoft Jet 數(shù)據(jù)源,如:Access 數(shù)據(jù)。
IISAM(可安裝的索引化順序訪問方法)格式數(shù)據(jù)源,如:FoxPro、Paradox、dBASE 數(shù)據(jù)。
ODBC 數(shù)據(jù)源,如:SQL Server 數(shù)據(jù)、Oracle 數(shù)據(jù)。
例如:設(shè)網(wǎng)絡(luò)服務(wù)器名為server,共享目錄為 C:\Sales 的 FoxPro數(shù)據(jù)庫,連接字符串應(yīng)為strCn="FoxPro3.0;database=\\server\c$\Sales\Region1"
此外,DAO 通過 Microsoft Jet 數(shù)據(jù)庫引擎訪問遠程數(shù)據(jù)時,還可以用 OpenDatabase 方法直接打開遠程表。在本地數(shù)據(jù)庫中并未存儲與遠程數(shù)據(jù)源建立連接所需要的信息。如果使用鏈接方式訪問數(shù)據(jù),則不必在每次會話開始時提供連接信息,從而可以提高效率。
數(shù)據(jù)處理
數(shù)據(jù)連接建立后,可以用 OpenRecordset 方法打開一個記錄集,并可用 DBGrid 控件和 Data 控件方便地瀏覽整個記錄集。如果使用表類型(Table-type)記錄對象,則對應(yīng)的是一個實際存在的數(shù)據(jù)庫表,在多用戶環(huán)境下,其它用戶對數(shù)據(jù)的修改會立即反映到表中;如果使用動態(tài)集類型(Dynaset-type)記錄對象,則對應(yīng)的既可以是一個表中全部記錄,又可以是一個查詢的結(jié)果,并且可以更新記錄集中的記錄;如果使用快照類型(Snapshot-type)記錄對象,則對應(yīng)的可以是表中的全部記錄,也可以是一個查詢結(jié)果,但不能進行記錄的增加、刪除和修改操作。此外,還可以建立其它類型的記錄對象,如僅向前型(ForwardOnly-type)記錄對象和動態(tài)型(Dynamic-type)記錄對象。
下面是打開動態(tài)集記錄對象并顯示記錄的代碼:
Public Sub rst_display(strDB As String, strRst As String, strForm As Form)
Set dbs = OpenDatabase(strDB)
Set rst = dbs.OpenRecordset(strRst, dbOpenDynaset)
strForm!Data1.DatabaseName = dbs.Name
strForm!Data1.RecordSource = rst.Name
strForm!Data1.Refresh
strForm!DBGrid1.ReBind
End Sub
上述過程有三個參數(shù),其中 strDB 用來指定本地數(shù)據(jù)庫名(包括路徑),linkTdfName 是在本地數(shù)據(jù)庫中新建的鏈接遠程表的表名,strForm 是網(wǎng)格控件和數(shù)據(jù)控件所在的窗體名。調(diào)用此過程可以基于新表建立一個動態(tài)集類型的記錄對象,并可在網(wǎng)格中瀏覽各個記錄。
斷開連接可以通過關(guān)閉應(yīng)用程序或設(shè)置連接超時來實現(xiàn)。注意:如果對數(shù)據(jù)庫對象使用 Close方法,則由于在 Miscrosoft Jet 數(shù)據(jù)庫引擎內(nèi)部緩存了連接,實際上連接并未取消。

