繁体   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