PowerShell中调用OleDbConnection.GetSchema带限制参数的问题
PowerShell调用OleDbConnection.GetSchema传入null限制条件报错的解决方法
问题背景
编写PowerShell脚本读取Access数据库架构时,调用OleDbConnection.GetSchema并传入限制条件(仅获取用户表)遇到OleDbException,错误提示“参数不正确”。对应的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下的初步尝试(包括强制转换[string[]]、更换ACE驱动)均失败:
# 报错的尝试代码 $schema = $connection.GetSchema('Tables', @($null, $null, $null, 'TABLE'))
问题原因
PowerShell中的$null是通用空值,放入string[]数组时会被自动转换为[string]::Empty(空字符串),而非.NET方法期望的string类型null。Access的OleDb驱动要求前两个限制条件(目录、架构)必须为真正的null,因此触发参数错误异常。
解决方案
方法1:使用[NullString]::Value生成字符串类型null
通过System.NullString::Value创建符合要求的null值,确保传递给.NET方法的是正确的字符串类型空值:
using namespace System # 构造限制条件数组,前三个位置用NullString::Value表示null $restrictions = [string[]]@( [NullString]::Value, [NullString]::Value, [NullString]::Value, 'TABLE' ) $schema = $connection.GetSchema('Tables', $restrictions)
方法2:直接初始化.NET字符串数组
利用.NET字符串数组初始化时默认元素为null的特性,直接创建数组并赋值最后一个元素:
# 创建长度为4的string数组,前三个元素默认是null $restrictions = New-Object string[] 4 # 设置第四个限制条件为'TABLE',仅获取用户表 $restrictions[3] = 'TABLE' $schema = $connection.GetSchema('Tables', $restrictions)
验证效果
两种方法均可正确传递null限制条件,成功获取Access数据库的用户表架构,不会再抛出OleDbException。
内容的提问来源于stack exchange,提问作者Joel Davies
相关产品推荐
相关产品推荐

