Microsoft ActiveX 資料物件延伸的資料定義語言和安全性 (ADOX) 是為使用所設計,與 Microsoft Jet 資料庫引擎。所以,ADOX 使用 Microsoft Jet OLE DB 提供者以外的 OLE DB 提供者可能會導致未預期的行為或不正確的結果。確切的行為是為其撰寫提供者資料庫的本質而定。如果提供者是存取其模型是完全不同的 Jet ADOX 行為從一個資料庫系統可能無法預測 (比方說 Jet 並不支援的 CATALOG 或 SCHEMA 概念)。
本文列出的一些已知問題當您嘗試使用 ADOX 與一個 OLE DB 提供者以外的 Microsoft Jet OLE DB 提供者時,可能會發生。
下列各點與 [ADOX 相關功能:
TABLES 集合ADOX 呼叫
OpenSchema 方法
adSchemaTables 與不受任何限制。如此一來 TABLES 集合包含目前使用者 (如同在連接字串中指定) 不論資料庫目錄與結構描述可存取的所有資料表。
COLUMNS 集合ADOX 會呼叫
OpenSchema 方法與
adSchemaColumns 以資料表名稱為一項限制。為結果 [COLUMNS 集合包含所有資料表的符合傳遞做為限制的資料表名稱也就是目前的使用者,不論資料庫目錄與結構描述可存取的所有資料行。
命名慣例唯一的命名慣例,ADOX 支援是 [object_name]。如此一來沒有任何方法來區別在不同的結構描述或目錄中的物件具有相同名稱。
ADOX 不支援下列命名慣例:
- [] database_name/catalog_name].[owner_name/schema_name].[object_name
-或者-
- [owner_name/schema_name] [object_name]
除非資料表指定為"ADOX_TAB"結構描述或資料庫擁有者沒有做為前置字元,下列範例將會失敗。
附註您必須變更使用者識別碼 = <username>值和密碼 = < 強式密碼 > 的值,以正確的值,才能執行這個程式碼。請確定該使用者 ID 都有適當的權限,可以在資料庫上執行這項作業。
Private Sub Command2_Click()
Dim tbl As New Table
Dim cat2 As New ADOX.Catalog
cat2.ActiveConnection = "Provider=MSDAORA;" & _
"Data Source=dseoracle8i;User Id=<username>;password=<strong password>;"
cat2.Tables.Delete "SCOTT.ADOX_TAB"
End Sub所有上述功能建立問題類似於:
- 區分大小寫
因為 ADOX 設計的是不區分大小寫在本質的 Jet ADOX 運作不正常與支援的大小寫區分的資料庫系統和 Oracle 一樣。ADOX 永遠會讓指定的集合上的不區分大小寫的搜尋。
- Count 屬性
當想藉由指定資料表名稱取得資料行的計數 ADOX 會傳回符合指定的資料表名稱,不論目錄和結構描述的所有資料表的所有資料行的總計數。
下列範例說明上述的行為:
注意: 您執行下列程式碼之前您必須在您的資料庫中建立必要的物件:
- 如果針對 Oracle 測試與 Microsoft OLE DB 提供者 (MSDAORA):
- '示範' 的結構描述或使用者帳戶建立資料表,如下所示:
create table COLTEST(col1 int)
- 現在,在建立資料表具有相同名稱 'COLTEST' 另一個結構描述或使用者帳戶,'SYSTEM',例如:
create table COLTEST(col1 int, col2 int, col3 int)
- 現在,授權給示範使用者,如下所示:
grant SELECT on SYSTEM.COLTEST to DEMO
- 如果測試與 Microsoft OLE DB 提供者為 SQL Server (SQLOLEDB):
- 第一次使用此程式碼:
create table pubs.demo.COLTEST(col1 int)
create table pubs.dbo.COLTEST(col1 int, col2 int, col3 int)
grant SELECT on dbo.COLTEST to DEMO
- 接下來,使用這段程式碼:
附註您必須變更使用者識別碼 = <username>值和密碼 = < 強式密碼 > 的值,以正確的值,才能執行這個程式碼。請確定使用者識別碼有適當的權限,才能執行這項作業在資料庫上。
Private Sub Command1_Click()
Dim cat1 As New ADOX.Catalog
Dim tbl1 As ADOX.Table
Dim col1 As ADOX.Column
Dim cnt As Integer
cat1.ActiveConnection = "Provider=MSDAORA;" & _
"Data Source=dseoracle8i;User Id=<username>;password=<strong password>;"
'To test with SQLOLEDB, comment out the preceding line and uncomment the following line:
'cat1.ActiveConnection = "Provider=SQLOLEDB.1;" & _
"Data Source=SQLSERVER11;User Id=<username>;password=<strong password>;initial catalog=pubs"
For Each tbl1 In cat1.Tables
If tbl1.Type = "TABLE" Then
If tbl1.Name = "COLTEST" Then
cnt = tbl1.Columns.Count
Debug.Print "Column Count of " &"'" & tbl1.Name &"' = " & cnt;
End If
End If
Next tbl1
End Sub
Count 屬性可能不包含其名稱中混合或降低字母大小寫,因為 ADOX 並不提供機制來指定區分大小寫的資料表。提供者所顯示的原狀,ADOX 只會傳遞資料表名稱。例如,考慮以混合大小寫名稱建立一個 Oracle 資料表 colTEST。ADOX 會將資料表名稱作為 colTEST 傳送不含封入它在雙引號內會讓提供者,以將它視為不區分大小寫的資料表。
在這種情況下會造成:
'COLTEST' 的資料行計數 = 4
- 依名稱建立索引
請考慮 Oracle 與相關的案例:
使用者 'SCOTT 有 prod 資料表'' 和 'PROD'。使用者 'JOHN' 有資料表 'PRod '和' PrOD'。 現在,像 Catalog.Tables("prod") 名稱參考資料表的結果就是不定。它取決於集合中的資料表的順序。無論使用何種 ADOX 尋找第一次的資料表 (使用不區分大小寫的搜尋) 是一個參考。
- 刪除 方法:
'示範' 在 Oracle 架構描述中考慮兩個資料表 '銷售' 和 '銷售'。現在,下列的範例可能會卸除 '銷售' 或 '銷售' 資料表,以其中較先發生者找到第一次為 ADOX TABLES 集合中不區分大小寫的搜尋。
附註您必須變更使用者識別碼 = <username>值和密碼 = < 強式密碼 > 的值,以正確的值,才能執行這個程式碼。請確定該使用者 ID 都有適當的權限,可以在資料庫上執行這項作業。
Private Sub Command1_Click()
Dim tbl As New Table
Dim cat2 As New ADOX.Catalog
'Open the catalog.
cat2.ActiveConnection = "Provider=sqloledb;" & _
"Data Source=jonnakuti9;User Id=<username>;password=<strong password>;initial catalog=pubs"
cat2.Tables.Delete "sales"
End Sub
取得更多資訊有關 ADOX 按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
198534?
(http://support.microsoft.com/kb/198534/EN-US/
)
資訊: ADOX 讀我檔案隨附 ADO 2.1 元件
272001?
(http://support.microsoft.com/kb/272001/EN-US/
)
ADOX 資料行集合的屬性屬性可能會造成失敗的 Append 方法