我需要从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 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对象。)
答案 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中创建此规范。
使用确切的路径和规范名称,稍后您必须运行上面的脚本以获取所需的输出。