【发布时间】:2017-06-21 17:22:16
【问题描述】:
我需要自动从 Microsoft Access 数据库中提取一些数据。数据库是由第三方提供给我的,因此我无法控制收到数据库时的内容。我需要使用 Powershell 自动从数据库中提取数据。
有什么方法可以使用 powershell 在 accessDB 中创建查询?从本质上讲,这就是我正在寻找的代码的本质:
$l_dbPath = "C:\Path\To\dataBase.accdb"
$l_accessApp = new-object -com access.application
$l_accessApp.OpenCurrentDatabase($l_dbPath)
$l_query = "SELECT SomeTable.SomeField From SomeTable;"
$l_queryName = "Export_Query"
$l_accessApp.CurrentDB().CreateQueryDef($l_queryName, $l_query)
$l_outputFile = "C:\temp\output.csv"
$e_acExportDelim = 2 #$l_accessApp.Enumerations.AcTextTransferType.acExportDelim #arg. this does not seem to exist...
$e_HasFieldNamesYes=-1
$l_exportSpec = ""
$l_accessApp.DoCmd.TransferText($e_acExportDelim,$l_exportSpec,$l_queryName,$l_outputFile,$e_HasFieldNamesYes)
$l_accessApp.CloseCurrentDatabase()
但是,$l_accessApp.CurrentDB.CreateQueryDef($l_queryName, $l_query) 行失败,因为$l_accessApp.CurrentDB() 返回 null,而不是当前 DB。我找不到从 Powershell 访问 CreateQueryDef 的方法。
我查看了Programmatically Build Access Query、Create a query dynamically through code in MSAccess 2003 [VBA]、Use Powershell to create access 2007 Queries? 和其他帖子,但没有发现任何有用的信息。
感谢您的帮助。
编辑:
事实证明,我上面的代码确实有效!一直以来的问题只是我没有一台同时安装了 DAO 和 Access 的机器。在不同机器上测试了单独的组件(使用 DAO 和 Access),并获得 IT 支持给我一台实际安装了 DAO 和 Access 的机器后,上面的代码确实有效。 (安装并加载了 MS Access,但未安装 DAO,$l_accessApp.CurrentDB() 返回 $null。安装 DAO 后,它返回一个 DBEngine 对象,如预期的那样。)
【问题讨论】:
-
为什么要在数据库中创建查询?只需连接到它并进行自己的提取..即:遍历行/列并创建文本文件..
-
还有其他原因我不能按照你的建议去做。我只想说,我真正需要的,我正在寻找的,是如何通过
$l_accessApp.OpenCurrentDatabase($l_dbPath)从 powershell 访问 CreateQueryDef -
RyanL 在下面提供了我正在寻找的确切答案,以及其他一些可能对其他有类似问题的人有用的答案。谢谢。
标签: powershell ms-access