PowerShell访问Access链接表提示链接规范不存在,如何解决?
我有一个.mdb数据库,其中包含一个链接至外部CSV文件的Linked_Table。在Access中可正常打开该表并执行SQL查询,但尝试用PowerShell(因VBScript已弃用)通过ADODB自动化加载数据时出现问题。
使用的PowerShell代码如下:
$adOpenStatic = 3 $adLockOptimistic = 3 $objConnection = New-Object -comobject ADODB.Connection $objRecordset = New-Object -comobject ADODB.Recordset $objConnection.Open(" Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\Data\My_Frontend.mdb ") $objRecordset.Open( "Select * from Linked_Table", $objConnection,$adOpenStatic,$adLockOptimistic) $objRecordset.MoveFirst() do { $objRecordset.Fields.Item("product").Value; $objRecordset.MoveNext() } until ($objRecordset.EOF -eq $True) $objRecordset.Close() $objConnection.Close()
查询普通表一切正常,但查询Linked_Table时出现错误:
The text file specification 'Patient-orders Link Specification' does not exist. You cannot import, export, or link using the specification.
我确认已保存对应的链接规范并用于链接/导入数据,现疑问:
- 为何会出现该错误?
- 如何解决此问题?
1. 错误原因
Access保存的文本链接规范存储在当前用户的Access配置文件中,而非嵌入到.mdb数据库文件内。用ADODB直接连接数据库时,PowerShell进程不会加载Access的用户配置,导致驱动找不到对应的链接规范。此外,ACE OLEDB驱动直接访问链接表时,不会自动触发Access的配置加载逻辑,必须显式指定规范或让驱动定位到规范存储位置。
2. 解决方法
方法一:在连接字符串中显式指定规范
修改ADODB连接字符串,添加CSV文件所在路径和链接规范名称参数:
$objConnection.Open(" Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\Data\My_Frontend.mdb; Jet OLEDB:Text Path = C:\实际CSV文件所在文件夹路径; Jet OLEDB:Text File Specification = Patient-orders Link Specification ")
需替换C:\实际CSV文件所在文件夹路径为你的CSV文件真实目录。
方法二:通过Access.Application对象执行查询
自动化Access应用程序加载数据库,这样会读取当前用户的Access配置,自然能识别已保存的链接规范:
$accessApp = New-Object -ComObject Access.Application $accessApp.OpenCurrentDatabase("C:\Data\My_Frontend.mdb") $recordset = $accessApp.CurrentDb.OpenRecordset("Select * from Linked_Table") $recordset.MoveFirst() do { $recordset.Fields.Item("product").Value $recordset.MoveNext() } until ($recordset.EOF -eq $True) $recordset.Close() $accessApp.CloseCurrentDatabase() $accessApp.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($accessApp) | Out-Null
方法三:重新创建链接表并嵌入格式规范(适用于可重新链接的场景)
在Access中重新链接CSV时,通过VBA代码显式定义列格式,把规范嵌入数据库系统表,避免依赖用户配置:
' 在Access中运行此VBA代码后保存数据库 DoCmd.TransferText acLinkDelim, , "Linked_Table", "C:\路径\到\你的\CSV文件.csv", True, "product;text,quantity;integer"
代码中最后一个参数为列格式定义,可根据实际CSV结构调整。
内容的提问来源于stack exchange,提问作者Phil

