2016-06-30 3 views
1

PowerShell 함수에서 Microsoft Access DB를 열고 싶습니다. 주 코드에 연결 변수를 저장하겠습니다. 할 수 없습니다 \ 임시 \ mydb.mdb
속성 'ConnectionString을'변수에 구성원이있는 전역 변수

오류가 데이터베이스 + C에 연결 :이 오류 메시지가

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} 

:

코드입니다 이 객체에서 발견 될 수 있습니다. 속성이 존재하고 설정할 수 있는지 확인하십시오.

어떻게 수정합니까?

나는 PowerShell이 ​​connglobal을 연관 짓고 있으며 conn.ConnectionString과는 관련이 없다고 생각합니다.

+0

그러나 귀하의 질문에있는 코드는 그 오류를 제공하지 않습니다? 나는 편리한 데이터베이스를 가지고 있지 않지만 오류가 없으며 불만없이 실행된다. 그리고 주석에 테스트 코드를 넣을 수 있다면 - function test {$ global : c.x = 4}; $ c = @ {x = 2}; $ c; 테스트; $ c' 글로벌 속성에 접근하면 효과가 있습니다. – TessellatingHeckler

+0

디버깅을 위해 모든 Try_Catch 구조를 생략 해 보겠습니다. 'Try' 블록의 맨 처음 _inner_을 사용하고 가능한 오류의 _full specification_을 보려면'return $ false'를 사용하십시오. '$ 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 
} 

그 방법을, 그리고 당신은 단지 오류가 한 번에 처리 할 수.