2016-06-30 10 views
1

Ich möchte eine Microsoft Access DB in einer PowerShell-Funktion öffnen. Ich werde die Verbindungsvariable im Hauptcode speichern.globale Variable, wo Variable Mitglieder hat

Dies ist der Code:

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} 

ich diese Fehlermeldung:

Fehler in der Datenbank + C Anschluss: \ temp \ MyDB.mdb
Die Eigenschaft 'Connectionstring' kann nicht auf diesem Objekt gefunden werden. Stellen Sie sicher, dass die Eigenschaft existiert und festgelegt werden kann.

Wie kann ich das beheben?

Ich denke PowerShell verbindet global mit conn und nicht global mit conn.ConnectionString.

+0

Aber der Code in Ihrer Frage gibt diesen Fehler nicht? Ich habe keine Zugriffsdatenbank zur Hand, aber es ist kein Fehler, es läuft ohne Beanstandung. Und es sollte, wenn ich Testcode in einen Kommentar schreiben kann - 'Funktionstest {$ global: c.x = 4}; $ c = @ {x = 2}; $ c; Prüfung; $ c' Zugriff auf eine Eigenschaft eines globalen tut Arbeit. – TessellatingHeckler

+0

Ich würde versuchen, alle "Try_Catch" -Strukturen zu Debugging-Zwecken wegzulassen. Verwenden Sie bare _inner_ des 'Try'-Blocks und dann' return $ false', um _full_spezification_ möglicher Fehler zu sehen. Ist $ global: conn definiert als erwartet? '$ conn = ...' bei '# main' ist im Bereich _script_ definiert. Ist der OLEDB-Anbieter registriert? ... – JosefZ

Antwort

0

Ich habe im Moment keinen Zugriff verfügbar, aber das Ändern globaler Variablen in einem verschachtelten Kontext ist sowieso ein fehlerhaftes Konzept. Es ist besser, die Verbindung in Ihrer Funktion zu erstellen und sie entweder zurückgeben das Verbindungsobjekt oder eine Ausnahme auslösen:

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 
} 

auf diese Weise Sie nicht Kontexte mischen, und Sie nur tun, Fehler einmal Handhabung.