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