使用 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 中创建查询的主要内容,如果未能解决你的问题,请参考以下文章