[英]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.