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

时间:2017-06-21 17:22:17

标签: powershell ms-access

我需要从Microsoft Access DB自动化一些数据提取。数据库由第三方提供给我,因此我无法控制数据库收到时的内容。我需要使用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 QueryCreate 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对象。)

5 个答案:

答案 0 :(得分:1)

创建querydef:

$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()

答案 1 :(得分:0)

你可能想尝试这样的东西。您在不在MS Access中创建查询定义的情况下将信息提取到CSV中。

$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

答案 2 :(得分:0)

你能用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

答案 3 :(得分:0)

一种不同的方法。你是否嫁给了实际创建查询def的想法?我的理解是你在结果之后......是不是这样?

#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()

答案 4 :(得分:0)

ExportSpecification是需要在此处播放以便获得所需输出的内容。必须使用向导在Microsoft Access中创建此规范。

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