簡體   English   中英

從 PowerShell 調用 OleDbConnection.GetSchema 時出現問題

[英]Problem calling OleDbConnection.GetSchema from PowerShell

我正在制作一個 PowerShell 腳本來從 Access 數據庫中讀取架構信息。 我在調用帶有限制的OleDbConnection.GetSchema function 時遇到問題(例如只獲取用戶表,而不是系統表)。 在 C# 中工作的代碼是:

OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=filename.mdb");
connection.Open();
DataTable schema = connection.GetSchema("Tables", new string[] {null, null, null, "TABLE"});

如何正確翻譯最后一行以在 PowerShell 中工作?

我最初的嘗試是:

$schema = $connection.GetSchema('Tables', @($null, $null, $null, 'TABLE'))

失敗並出現OleDbException消息:“參數不正確。” 我將問題縮小到 null 值。 即使通過單個 null 限制:

$schema = $connection.GetSchema('Tables', @($null))

導致相同的異常。 傳入單個 null 限制應該與無限制調用GetSchema具有相同的效果,后者在 PowerShell 中確實有效。

如果您為其中一個限制傳遞了無效值,我得到的異常與您得到的異常相同,所以我假設$null沒有以某種方式被正確翻譯。 對於 Access 數據庫,前兩個限制(目錄和模式)必須為 null。有誰知道如何正確傳遞這些 null 值嗎? 我嘗試過的事情包括:

$connection.GetSchema('Tables',[string[]]@($null, $null, $null, 'TABLE'))

$connection.GetSchema('Tables',[string[]]@([string]$null, [string]$null, [string]$null, 'TABLE'))

[string[]] $restrictions = $null, $null, $null, 'TABLE'
$connection.GetSchema('Tables', $restrictions)

還嘗試使用 ACE 提供程序而不是 JET。 所有嘗試都導致相同的OleDbException消息:“參數不正確。”。

要使用 PowerShell 本機連接到 MSAccess,許多可用資源都會向您展示這一點。 例如:

function Test-DBAccess
{
    Param
    (
            $fileName = 'C:\scripts\test.accdb'
    )
    
    $conn = New-Object System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$filename;Persist Security Info=False")
    $cmd=$conn.CreateCommand()
    $cmd.CommandText="Select * from table1"
    $conn.open()
    $rdr = $cmd.ExecuteReader()
    $dt = New-Object System.Data.Datatable
    $dt.Load($rdr)
    $dt
}

因此,根據您的 C# 代碼,可以查看以下 MS 文檔以及您發布的鏈接:

GetSchema 和 Schema Collections

https://learn.microsoft.com/en-us/do.net/framework/data/ad.net/getschema-and-schema-collections

https://learn.microsoft.com/en-us/do.net/framework/data/ad.net/schema-restrictions

$connectionString = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Temp\Test.accdb'

$oCon = New-Object System.Data.OleDb.OleDbConnection $connectionString
$oCon.Open()


$oCon.GetSchema('Restrictions') | 
Get-Member
# Results
<#
   TypeName: System.Data.DataRow

Name               MemberType            Definition
----               ----------            ----------
AcceptChanges      Method                void AcceptChanges()
BeginEdit          Method                void BeginEdit()
CancelEdit         Method                void CancelEdit()
ClearErrors        Method                void ClearErrors()
Delete             Method                void Delete()
EndEdit            Method                void EndEdit()
Equals             Method                bool Equals(System.Object obj)
GetChildRows       Method                System.Data.DataRow[] GetChildRows(string relationName), System.Data.DataRow[] GetChildRows(string relationName, System.Data.Da...
GetColumnError     Method                string GetColumnError(int columnIndex), string GetColumnError(string columnName), string GetColumnError(System.Data.DataColumn ...
GetColumnsInError  Method                System.Data.DataColumn[] GetColumnsInError()
GetHashCode        Method                int GetHashCode()
GetParentRow       Method                System.Data.DataRow GetParentRow(string relationName), System.Data.DataRow GetParentRow(string relationName, System.Data.DataRo...
GetParentRows      Method                System.Data.DataRow[] GetParentRows(string relationName), System.Data.DataRow[] GetParentRows(string relationName, System.Data....
GetType            Method                type GetType()
HasVersion         Method                bool HasVersion(System.Data.DataRowVersion version)
IsNull             Method                bool IsNull(int columnIndex), bool IsNull(string columnName), bool IsNull(System.Data.DataColumn column), bool IsNull(System.Da...
RejectChanges      Method                void RejectChanges()
SetAdded           Method                void SetAdded()
SetColumnError     Method                void SetColumnError(int columnIndex, string error), void SetColumnError(string columnName, string error), void SetColumnError(S...
SetModified        Method                void SetModified()
SetParentRow       Method                void SetParentRow(System.Data.DataRow parentRow), void SetParentRow(System.Data.DataRow parentRow, System.Data.DataRelation rel...
ToString           Method                string ToString()
Item               ParameterizedProperty System.Object Item(int columnIndex) {get;set;}, System.Object Item(string columnName) {get;set;}, System.Object Item(System.Dat...
CollectionName     Property              string CollectionName {get;set;}
RestrictionDefault Property              string RestrictionDefault {get;set;}
RestrictionName    Property              string RestrictionName {get;set;}
RestrictionNumber  Property              int RestrictionNumber {get;set;}
#>


$oCon.GetSchema('Restrictions') 
# Results
<#
CollectionName RestrictionName   RestrictionDefault RestrictionNumber
-------------- ---------------   ------------------ -----------------
Columns        TABLE_CATALOG                                        1
Columns        TABLE_SCHEMA                                         2
Columns        TABLE_NAME                                           3
Columns        COLUMN_NAME                                          4
Indexes        TABLE_CATALOG                                        1
Indexes        TABLE_SCHEMA                                         2
Indexes        INDEX_NAME                                           3
Indexes        TYPE                                                 4
Indexes        TABLE_NAME                                           5
Procedures     PROCEDURE_CATALOG                                    1
Procedures     PROCEDURE_SCHEMA                                     2
Procedures     PROCEDURE_NAME                                       3
Procedures     PROCEDURE_TYPE                                       4
Tables         TABLE_CATALOG                                        1
Tables         TABLE_SCHEMA                                         2
Tables         TABLE_NAME                                           3
Tables         TABLE_TYPE                                           4
Views          TABLE_CATALOG                                        1
Views          TABLE_SCHEMA                                         2
Views          TABLE_NAME                                           3
#>

$oCon.GetSchema('Tables') | 
Get-Member
# Results
<#
   TypeName: System.Data.DataRow

Name              MemberType            Definition
----              ----------            ----------
AcceptChanges     Method                void AcceptChanges()
BeginEdit         Method                void BeginEdit()
CancelEdit        Method                void CancelEdit()
ClearErrors       Method                void ClearErrors()
Delete            Method                void Delete()
EndEdit           Method                void EndEdit()
Equals            Method                bool Equals(System.Object obj)
GetChildRows      Method                System.Data.DataRow[] GetChildRows(string relationName), ...
GetColumnError    Method                string GetColumnError(int columnIndex), string GetColumnError...
GetColumnsInError Method                System.Data.DataColumn[] GetColumnsInError()
GetHashCode       Method                int GetHashCode()
GetParentRow      Method                System.Data.DataRow GetParentRow(string relationName), ...
GetParentRows     Method                System.Data.DataRow[] GetParentRows(string relationName), ...
GetType           Method                type GetType()
HasVersion        Method                bool HasVersion(System.Data.DataRowVersion version)
IsNull            Method                bool IsNull(int columnIndex), bool IsNull(string columnName), ...
RejectChanges     Method                void RejectChanges()
SetAdded          Method                void SetAdded()
SetColumnError    Method                void SetColumnError(int columnIndex, string error), ...
SetModified       Method                void SetModified()
SetParentRow      Method                void SetParentRow(System.Data.DataRow parentRow), ...
ToString          Method                string ToString()
Item              ParameterizedProperty System.Object Item(int columnIndex) {get;set;}, ...
DATE_CREATED      Property              datetime DATE_CREATED {get;set;}
DATE_MODIFIED     Property              datetime DATE_MODIFIED {get;set;}
DESCRIPTION       Property              string DESCRIPTION {get;set;}
TABLE_CATALOG     Property              string TABLE_CATALOG {get;set;}
TABLE_GUID        Property              guid TABLE_GUID {get;set;}
TABLE_NAME        Property              string TABLE_NAME {get;set;}
TABLE_PROPID      Property              long TABLE_PROPID {get;set;}
TABLE_SCHEMA      Property              string TABLE_SCHEMA {get;set;}
TABLE_TYPE        Property              string TABLE_TYPE {get;set;} 
#>

所以,至於你的觀點...

我在調用帶有限制的 OleDbConnection.GetSchema function 時遇到問題(例如只獲取用戶表,而不是系統表)。

...這使我相信這可能對您有所幫助。

獲取所有表:

$connectionString = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Temp\Test.accdb'

$oCon = New-Object System.Data.OleDb.OleDbConnection $connectionString
$oCon.Open()

$oCon.GetSchema('Tables')
# Results
<#
TABLE_CATALOG : 
TABLE_SCHEMA  : 
TABLE_NAME    : MSysAccessStorage
TABLE_TYPE    : ACCESS TABLE
TABLE_GUID    : 
DESCRIPTION   : 
TABLE_PROPID  : 
DATE_CREATED  : 31-Jul-09 14:04:43
DATE_MODIFIED : 31-Jul-09 14:04:43

TABLE_CATALOG : 
TABLE_SCHEMA  : 
TABLE_NAME    : MSysACEs
TABLE_TYPE    : SYSTEM TABLE
TABLE_GUID    : 
DESCRIPTION   : 
TABLE_PROPID  : 
DATE_CREATED  : 31-Jul-09 14:04:43
DATE_MODIFIED : 31-Jul-09 14:04:43

...

TABLE_CATALOG : 
TABLE_SCHEMA  : 
TABLE_NAME    : Table1
TABLE_TYPE    : TABLE
TABLE_GUID    : 
DESCRIPTION   : 
TABLE_PROPID  : 
DATE_CREATED  : 09-Dec-22 17:38:28
DATE_MODIFIED : 09-Dec-22 17:38:51
#>

獲取用戶表:

$oCon.GetSchema('Tables') | 
Where-Object {$PSItem.TABLE_TYPE -eq 'TABLE'}

# Results
<#
TABLE_CATALOG : 
TABLE_SCHEMA  : 
TABLE_NAME    : Table1
TABLE_TYPE    : TABLE
TABLE_GUID    : 
DESCRIPTION   : 
TABLE_PROPID  : 
DATE_CREATED  : 09-Dec-22 17:38:28
DATE_MODIFIED : 09-Dec-22 17:38:51
#>

如果以上方法不能滿足您的需求,那么您可以通過Add-Type cmdlet 將 C# 嵌入到 PowerShell 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM