2016-03-02 70 views
1

This question演示如何使用VBA執行此操作,但我希望使用PowerShell執行此操作,以便可以對它進行腳本和計劃。使用PowerShell導出訪問數據庫的所有查詢

我期望的實現應該是相同的,因爲他們都據稱使用相同的COM,但似乎QueryDefs沒有在COM中定義PowerShell訪問,因爲它什麼都不返回。

# Open file in Access. 
$accessCOM = New-Object -ComObject Access.Application 
$accessCOM.OpenCurrentDataBase($dbPath, $false) 

# get list of queries 
$queries = $accessCOM.CurrentDB.QueryDefs # returns nothing. 

# export query to file 
ForEach ($query in $queries) { 
    $name = $query.name 
    $sql = $query.sql 
    $dest = "$queryDest\$name.sql" 
    Write-Output $sql > $dest 
} 

我可以使用.CurrentData.AllQueries但返回AccessObjects的集合,我不知道如何從他們那裏得到的SQL。有沒有其他方法可以從名稱中獲取QueryDefs或至少SQL?

+0

'$ accessCOM.CurrentDB.Name'會告訴你什麼? – HansUp

+0

「CurrentDb」不是.accdb文件的名稱。 – cheezsteak

回答

2

這對我的作品與Access 2010年。它只是轉儲非系統QueryDefs到控制檯的名字,但它應該讓你開始:

$dbe = New-Object -com DAO.DBEngine.120 
$db = $dbe.OpenDatabase("C:\Users\Public\Database1.accdb") 
$queries = $db.QueryDefs 
ForEach ($query in $queries) { 
    $name = $query.Name 
    If (!$name.StartsWith("~")) { 
     $name 
    } 
} 
+0

我添加了如何在PowerShell中打開數據庫,因爲它與你的不同。希望你的方法能奏效。 – cheezsteak

0

請試試這個修改以前的帖子。爲我工作。 運行一次之後,變量的其他屬性將通過IntelliSense在PowerShell ISE中提供。

$dbe = New-Object -com DAO.DBEngine.120 
$dbpath ="path/to/data.mdb" 
$db = $dbe.OpenDatabase($dbpath,$false,$false,";pwd=r3ealLy?") 
$queries = $db.QueryDefs 
ForEach ($query in $queries) { 
    $name = $query.Name 
    If (!$name.StartsWith("~")) { 
     $name + ":" 
     $query.SQL 
    } 
} 
相關問題