2016-06-30 6 views
1

PowerShell関数でMicrosoft Access DBを開きたいとします。メインコードに接続変数を格納します。変数にメンバーがあるグローバル変数

これはコードです:

Function open_database($dbname) { 
    # Open the database 
    try 
    { 
    $global:conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$dbname;Persist Security Info=False" 
    $global:conn.Open() 
    } 
    catch 
    { 
    write-host "Error connecting to the database " + $dbname 
    return $false 
    } 
    return $true 
} 

# M A I N 
$conn = New-Object System.Data.OleDb.OleDbConnection 
if (-Not (open_database("C:\temp\mydb.mdb"))) {exit} 

私は、このエラーメッセージが出ます:

データベース+ Cへの接続エラー:\一時\のMYDB.MDB
プロパティことはできません 'のConnectionString' をこのオブジェクトに見つかります。プロパティが存在し、設定可能であることを確認します。

この問題を修正するにはどうすればよいですか?

PowerShellはglobalconnに関連付けており、グローバルではないことをconn.ConnectionStringと関連付けていると思います。

+0

しかし、あなたの質問のコードは、そのエラーを引き起こしませんか?私は便利なアクセスデータベースを持っていませんが、エラーではなく、苦情なしで実行されます。コメントにテストコードを入れることができれば - 'function test {$ global:c.x = 4}; $ c = @ {x = 2}; $ c;テスト; $ c'はグローバルのプロパティにアクセスすると動作します。 – TessellatingHeckler

+0

デバッグのために 'Try_Catch'構造体をすべて省略しようとしています。 'Try'ブロックの裸の_inner_を使用して、' return $ false'を返すと、_full _可能なエラーが表示されます。 '$ global:conn'は期待どおりに定義されていますか? '$ main'の' $ conn = ... 'は_script_スコープで定義されています。 OLEDBプロバイダは登録されていますか? ... – JosefZ

答えて

0

私は現時点で利用可能なアクセス権を持っていませんが、ネストされたコンテキスト内のグローバル変数を変更することには問題があります。それはあなたの関数で接続を作成し、それが接続オブジェクトを返すか、例外をスローどちらか持っている方が良いでしょう:

function open_database($dbname) { 
    $cn = New-Object System.Data.OleDb.OleDbConnection 
    $cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + 
         "Data Source=$dbname;" + 
         "Persist Security Info=False" 
    $cn.Open() | Out-Null 
    return $cn 
} 

try { 
    $conn = open_database 'C:\temp\mydb.mdb' 
} catch { 
    Write-Host "Error connecting to the database $dbname" 
    exit 1 
} 

あなたはコンテキストを混合していない、とあなたは唯一のエラーが一度取り扱いんこの方法。