2016-05-21 8 views
-1

Ich habe ein Code-Snippet, das zur Verbindung mit einer SQL Server-Instanz verwendet wird, und Abfrage, das funktioniert gut.

$instance="Instance" 
$DB = "master" 
$sqlConnection = ConnectionString $Instance $DB 
$sqlConnection = New-Object System.Data.SqlClient.SQLConnection($sqlConnection) 
$sqlConnection.Open() 

jedoch der gleiche Code-Schnipsel, wenn diese in eine foreach-Schleife setzen, wo es durch eine Reihe von Servern iterieren hat, funktioniert es nicht.

foreach ($instance in $Instances) { 
    $instance 
    $DB = "master" 
    $sqlConnection = ConnectionString $Instance $DB 
    $sqlConnection = New-Object System.Data.SqlClient.SQLConnection($sqlConnection) 
    $sqlConnection.Open() 
} 

Fehler:

Exception calling "Open" with "0" argument(s): "A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)"

+0

Verwenden Sie nicht dieselbe Veriable für verschiedene Dinge (hier: '$ sqlConnection' für die Verbindungszeichenfolge und das Verbindungsobjekt). Überprüfen Sie die Verbindungszeichenfolge, bevor Sie die Verbindung öffnen. Was macht die Funktion (?) 'ConnectionString '? –

+0

Schließen Sie die Verbindung mindestens, bevor Sie eine neue mit demselben Variablennamen öffnen. – Trondh

+0

Bitte schauen Sie mit 'Begin'' Process' 'End' nach, um solche Verbindungen wiederzuverwenden. Als Bonus möchten Sie die Verbindung innerhalb des 'End'-Blocks schließen. – user4317867

Antwort

0

Ansgar ist richtig. Sie sollten Variablennamen nicht wiederverwenden.

Eine einfachere Möglichkeit, dies zu implementieren, ist die Verwendung von the Invoke-Query module, die den größten Teil Ihres Codes in einer einzigen Zeile zusammenfasst.

$sql = "Update myTable set myColumn = 1;" 
$db= "master" 
$instances = ("instance1","instance2") 
foreach ($instance in $instances) 
    ## This command uses windows auth. 
    ## You can pass in a Credential object to use SqlServer auth. 
    $rowcount = $sql | Invoke-SqlServerQuery -Server $instance -Database $db -CUD 
    Write-Host "Updated $rowcount rows on server $instance." 
} 

Haftungsausschluss: Ich bin der Autor des Moduls.

+0

Ich fühle, es gibt ein anderes Problem, während ich diese Art von Befehlen von Foreach ausführen. Alle laufen wenn ich direkt renne, aber nicht wenn sie unter foreach gerufen werden. Bitte führe mich durch. – Adarsh

+0

Der Call Invoke sollte innerhalb der foreach Schleife gut funktionieren. Welche Fehler/Verhaltensweisen siehst du? Können Sie mehr Beispielcode posten, der Ihnen Probleme verursacht? (Randnotiz: Ich habe gerade einen Tippfehler mit dem Namen der Variablen rowcount korrigiert. War das ein Problem?) –

Verwandte Themen