fisistew
Goto Top

Powershell if() Abfrage bei SQL Stored Procedure execute Fehler?

Hallo zusammen,

ich bräuchte Eure Hilfe,
Das unten stehende Script ist nur ein Ausschnitt und Funktioniert!
Allerdings möchte ich jetzt eine IF Abfrage durchführen, wenn der SQL Teil mit Fehler abbricht, soll if greifen.
Dies geschieht aber leider nicht.
Als Meldung bekomme ich eine 1 zurück und rechts in der Console steht Column1 und darunter 1, dann läuft das Script durch.
Kann jemand weiterhelfen?

Vielen Dank! VG


#SQL verbinden und Stored Procedure auslösen
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=blbnbgIamDBm01;Database=RoPE;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "RoPE.spDeleteOldCalculations"
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandTimeout = 0
$SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure
$param1=$SqlCmd.Parameters.Add("@daysOld" , [System.Data.SqlDbType]::INT)
$param1.Value = $days
$param2=$SqlCmd.Parameters.Add("@maxCalcs" , [System.Data.SqlDbType]::INT)
$param2.Value = 0
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables


if ( )
{
Write-Output "$(Get-TimeStamp) Die Aufgabe wurde abgebrochen und die Dienste nun wieder gestartet! $dc" | Out-file C:\temp\dclog.txt -append

#Löscht EngineConfiguration.config bei Abbruch
Remove-Item c:\temp\EngineConfiguration.config

break
}

Content-ID: 365238

Url: https://administrator.de/contentid/365238

Ausgedruckt am: 25.11.2024 um 02:11 Uhr

135333
Lösung 135333 19.02.2018 um 14:53:44 Uhr
Goto Top
Stichwort
Try...Catch
FISIStew
FISIStew 19.02.2018 um 15:40:16 Uhr
Goto Top
Hallo Snapdragon,

vielen Dank für Deine Antwort.
Also ich bin noch ein recht unerfahrener Powershell Script Ersteller und freue mich über jede Hilfe!
Ich habe mir Deinen Link durchgelesen, allerdings weiß ich nun immer noch nicht wie ich es umsetzen könnte!
Gerade im Bereich XML auslesen ;) und SQL habe ich sehr große Probleme face-sad alles andere habe ich mir schon angeeignet und umgesetzt.
Also vllt kann mir jemand etwas mehr helfen, damit ich sehen kann wie sowas umgesetzt wird face-smile
Vielen Dank!
VG
135333
135333 19.02.2018 aktualisiert um 15:45:41 Uhr
Goto Top
Naja wenn man sich den Link zumindest mal durchgelesen hätte, würdest du jetzt mal so vorgehen
try{
   # hier kommt alles an Befehlen rein was Fehler/Exceptions auslesen könnte
}catch{
  # hier reagierst du auf fehler.
  In dem Objekt $_.Exception.Message steht die Fehlermeldung
}
War das jetzt wirklich so schwer?

Das ist übrigens ein Konstukt das es in fast jeder Programmiersprache gibt sei es c#/vb.net/java/ etc. pp.
Also mit etwas Verstand schafft man das auch selbst und ein Thread wäre überflüssig.

Hier noch was Lektüre zm Errorhandling. Also wenn das nicht reicht dann helfe dir Gott ....
https://blogs.msdn.microsoft.com/kebab/2013/06/09/an-introduction-to-err ...
FISIStew
FISIStew 19.02.2018 um 15:48:20 Uhr
Goto Top
Es ist wirklich sehr nett von Dir das Du immer sehr schnell reagierst und hilfst.
Ich selbst kann kein c#/vb.net/java/ etc. pp
Selbst die von Dir 6 Zeilen werden mich jetzt wieder sehr lange beschäftigen bis ich raus habe wie es funktioniert.
Soweit wäre ich übrigens jetzt auch nach dem Link von Dir gekommen.
Trotzdem vielen Dank face-smile
135333
135333 19.02.2018 aktualisiert um 15:57:15 Uhr
Goto Top
Was du nicht verstehst sagst du leider nicht. Es steht ja eigentlich ganz klar oben in den Kommentaren wie du vorgehen musst, oder suchst du jetzt nur jemanden der es dir einfach fertig schreibt und du nur den Kopf auschalten und kopieren musst, dann bist du hier IMHO falsch. das bißchen Copy n' Paste an die Stellen die oben markiert sind schafft eigentlich jeder.

Na denn, machs gut.

Gruß snap
FISIStew
FISIStew 20.02.2018 um 08:05:32 Uhr
Goto Top
Also wenn ich das richtig verstanden haben sollte, müsste mein Block quasi so aussehen!?

$ErrorActionPreference = "Stop"
Try{
#SQL verbinden und Stored Procedure auslösen
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=blbnbgIamDBm01;Database=RoPE;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "RoPE.spDeleteOldCalculations"
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandTimeout = 0
$SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure
$param1=$SqlCmd.Parameters.Add("@daysOld" , [System.Data.SqlDbType]::INT)
$param1.Value = $days
$param2=$SqlCmd.Parameters.Add("@maxCalcs" , [System.Data.SqlDbType]::INT)
$param2.Value = 0
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables
}
Catch [system.exception]{
"Die Ausführung der StoredProcedure wurde abgebrochen! Die Dienste starten wieder!"
}
Finally{
#Löscht EngineConfiguration.config bei Abbruch
Remove-Item c:\temp\EngineConfiguration.config
}

Somit würde ich also versuchen die Procedure anzustoßen, falls das nicht gelingt gibt catch den Fehler aus und Finaly wird der Ordner gelöscht und die Dienste beendet. Oder?
Vielleicht kannst Du mir ja sagen ob ich auf dem richtigen Weg bin face-smile
VG
135333
135333 20.02.2018 um 09:00:42 Uhr
Goto Top
Richtig.
FISIStew
FISIStew 20.02.2018 um 09:02:06 Uhr
Goto Top
Danke!
FISIStew
FISIStew 20.02.2018 um 09:26:05 Uhr
Goto Top
OK, verstehe ich doch nicht ganz, da der Finally Block trotzdem ausgeführt wird, auch wenn ich keinen Fehler habe.
Genau das soll er ja nicht tun, ich möchte das der Finally Block nur bei einem Fehler ausgeführt wird und nicht grundsätzlich.
Bei keinem Fehler sollte das Script den Finally Block überspringen!

Wo liegt nun mein Denkfehler? oder funktioniert das Try...Catch...Finally doch nicht so, wie ich mir das vorstelle?
Danke im Voraus face-smile
135333
135333 20.02.2018 aktualisiert um 09:35:14 Uhr
Goto Top
Try wird immer ausgeführt, catch wird nur ausgeführt wenn ein Fehler in einem der Befehle im try Block auftritt und finally wird immer ausgeführt egal ob es eine Exception gab oder nicht !! Der Finally Abschnitt wird meistens dazu genutzt offene Handles zum Abschluss zu schließen/freizugeben.
Du bist auch nicht gezwungen alles in den try block zu packen, du kannst dort auch nur die zu überprüfenden Teile einsetzen während andere außerhalb/davor/danach liegen um so speziell nur bestimmte Befejle für die Fehlerbehandlung auszuwählen.

Alles was zur Fehlerbehandlung ist, gehört in den Catch Block! Nicht in den Finally!

Du hast also einen groben Denkfehler vom Konstrukt!


Das steht aber auch alles in der Doku zum Konstrukt, wenn man es mal lesen würde.
FISIStew
FISIStew 20.02.2018 um 09:36:25 Uhr
Goto Top
Na ja ich möchte schon die ganze SQL Abfrage in den Try Block packen und versuche jetzt im Catch Block die Ausführung unterzubringen, die er ausführen soll wenn ein Fehler kommt.
Den Finally Block ansich benötige ich ja dann nicht, denn wenn kein Fehler ist soll er ja mit dem Script weiter fortsetzen.
135333
135333 20.02.2018 aktualisiert um 09:53:14 Uhr
Goto Top
Zitat von @FISIStew:
Den Finally Block ansich benötige ich ja dann nicht,
Hat ja auch niemand behauptet das du ihn zwingend einbinden musst face-wink du kannst ihn selbstverständlich weg lassen.
denn wenn kein Fehler ist soll er ja mit dem Script weiter fortsetzen.
Das tut das Skript auch wenn es ein Fehler gibt und du Try catch benutzt. Ob das Skript bei einem Fehler im catch beendet wird wird musst du selbst mit einem "exit" skripten. Es behandelt nur Fehler, aber es stopt nicht die weitere Ausführung der nach den Blocks folgenden Befehle.
FISIStew
FISIStew 20.02.2018 um 09:53:47 Uhr
Goto Top
Das habe ich nun gemacht und hoffe das es funktioniert. Bei einem ersten Testlauf tut es das was es tun soll, bisher ;)
Danke, nun muss ich beobachten ob wirklich alles abgefangen wird oder nicht.