【问题标题】:Use powershell to create queries in MS-Access使用 powershell 在 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 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 对象,如预期的那样。)

【问题讨论】:

  • 为什么要在数据库中创建查询?只需连接到它并进行自己的提取..即:遍历行/列并创建文本文件..
  • 还有其他原因我不能按照你的建议去做。我只想说,我真正需要的,我正在寻找的,是如何通过$l_accessApp.OpenCurrentDatabase($l_dbPath) 从 powershell 访问 CreateQueryDef
  • RyanL 在下面提供了我正在寻找的确切答案,以及其他一些可能对其他有类似问题的人有用的答案。谢谢。

标签: powershell ms-access


【解决方案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:如果您修复此答案的最后一行,它可能对其他人更有用。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 2020-11-04
      相关资源
      最近更新 更多