使用 powershell 在 MS-Access 中创建查询

Posted

技术标签:

【中文标题】使用 powershell 在 MS-Access 中创建查询【英文标题】:Use powershell to create queries in MS-Access 【发布时间】: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 在下面提供了我正在寻找的确切答案,以及其他一些可能对其他有类似问题的人有用的答案。谢谢。 【参考方案1】:

创建一个查询定义:

$dbe =new-Object -comobject DAO.DBEngine.120
$path="c:\path\to\db.mdb"
$db = $dbe.opendatabase($path)

$l_query = "select table1.* from table1"
$l_queryName="testquery"
$l_outputFile="z:\test.csv"

$db.CreateQueryDef($l_queryName, $l_query)
$db.closedatabase


$l_outputFile = "z:\test.csv"
$e_acExportDelim = 2 
$e_HasFieldNamesYes=-1
$l_exportSpec = ""

$l_accessApp = new-object -com access.application
$l_accessApp.OpenCurrentDatabase($path)
$l_accessApp.DoCmd.TransferText($e_acExportDelim,$l_exportSpec,$l_queryName,$l_outputFile,$e_HasFieldNamesYes)
            $l_accessApp.CloseCurrentDatabase()

$l_accessApp.CloseCurrentDatabase()

【讨论】:

我现在的代码,几乎完全一样。谢谢。如果我能弄清楚为什么$l_accessApp.CurrentDB$l_accessApp.DBEngine(0) 都不起作用。 查看上面问题的编辑:$l_accessApp.CurrentDB() 实际上工作,当您正确安装 DAO MS Access 时。【参考方案2】:

您可能想尝试一下这样的事情。您正在将信息提取到 CSV 中,而无需在 MS Access 中创建查询定义。

$OpenStatic = 3
$LockOptimistic = 3

$path = "C:\Path\To\dataBase.accdb"

$connection = New-Object -ComObject ADODB.Connection
$RecordSet = New-Object -ComObject ADODB.Recordset

$connection.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$Path" )

$Query = "SELECT SomeTable.SomeField From SomeTable;"

$RecordSet.Open($Query, $Connection, $OpenStatic, $LockOptimistic)

$RecordSet | Out-File  z:\output.csv

【讨论】:

【参考方案3】:

另一种方法。您是否接受了实际创建查询定义的想法?我的理解是你追求结果……不是这样吗?

#db path
$DBPath = "c:\path\to\db.mdb"

#SQL statement to run
$SQL = "select table1.* from table"

#Output file location
$Output = "z:\test.csv"

#Connection
$Con= New-Object -TypeName System.Data.OleDb.OleDbConnection

#Connection string
$con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= $path"

#create command and fill dataset
$ConCommand= $Con.CreateCommand()
$ConCommand.CommandText = $SQL
$OAdapt = New-Object -TypeName System.Data.OleDb.OleDbDataAdapter $ConCommand
$DS = New-Object -TypeName System.Data.DataSet
$OAdapt.Fill($DS)

#Export
$DS.Tables[0] | export-csv $Output -NoTypeInformation
$Con.Close()

【讨论】:

这种方法对我有用,只需要将 $connection 更改为 $con【参考方案4】:

ExportSpecification 是为了得到一些想要的输出而需要在这里播放的。必须使用向导从 Microsoft Access 中创建此规范。

使用确切的路径和规范名称,稍后您必须运行上面的脚本才能获得所需的输出。

【讨论】:

【参考方案5】:

你可以使用 DAO 吗?

$OpenStatic = 3
$LockOptimistic = 3


$dbe =new-Object -comobject DAO.DBEngine.120
$db = $dbe.opendatabase("C:\Path\To\dataBase.accdb")

$Query = "SELECT SomeTable.SomeField From SomeTable;"

$rs=$db.openrecordset($query)

$rs| Out-File  z:\output.csv

【讨论】:

$rs| Out-File z:\output.csv 不输出记录。 RyanL:如果您修复此答案的最后一行,它可能对其他人更有用。谢谢。

以上是关于使用 powershell 在 MS-Access 中创建查询的主要内容,如果未能解决你的问题,请参考以下文章

无法在MS-Access中的子中使用函数的变量

我可以在后端使用 MS-Access 而不是 MYSQL

如何在 ms-access 中使用 ISNULL 函数

使用 c# 和 oledb 查询更新 Ms-Access 2010 中的列值

在 ms-Access 中使用组合框创建搜索表单

使用 SQL 在 Ms-access 查询中运行 Total