Invoke-Sqlcmd Fehler abfangen in Powershell
Hallo Powershell Coder,
Ausgangssituation:
Die User bekommen eine Powershell GUI mit zwei Textfeldern in die sie Kundennummer und Kontonummer eingeben können.
Mit dem Klick auf den Ausführen-Schalter wird eine SQL Procedure auf dem Server aufgerufen,
um bei dem Kunden die Kontonummer zu aktualisieren.
Das alles funktioniert.
Ich habe auch viele Fehler (leeres Textfelder, nicht existierende Kundennummer, "0" Eingaben, negative Zahlen) bereits abgefangen.
Zum Schluss bleibt jetzt noch übrig, dass ein User in das Textfeld "NULL" schreibt oder "asdf", warum auch immer er das tun sollte. Ich möchte es abfangen.
In einem solchen Fall bekomme ich in der Powershell so eine Meldung ausgeworfen:
Was ja auch korrekt ist.
Im ersten Ansatz habe ich im Powershellscript die Query Definition und den Invoke-Sqlcmd Aufruf in
TRY & CATCH verpackt.
Leider ignoriert PS TRY & CATCH und wirft trotzdem die Meldung an die Konsole.
Im zweiten Schritt habe ich in der SQL Prozedur das Prüfen der Parameter und das Update in TRY & CATCH
gepackt.
Auch das bringt keinen Erfolg.
Falls die Frage kommt so "rede ich mit dem SQL Server"
Hat einer von euch dazu Ideen?
Mir widerstrebt verständlicherweise es das so rauszugeben, in der Hoffnung, dass niemand Text in die Felder eingibt.
Update
Eine zweite, wenn auch aufwendigere Lösung wäre es, in der SQL Prozedur die Parameter als varchar zu definieren und
im Update Befehl zu casten.
Grüße vom it-frosch
Ausgangssituation:
Die User bekommen eine Powershell GUI mit zwei Textfeldern in die sie Kundennummer und Kontonummer eingeben können.
Mit dem Klick auf den Ausführen-Schalter wird eine SQL Procedure auf dem Server aufgerufen,
um bei dem Kunden die Kontonummer zu aktualisieren.
Das alles funktioniert.
Ich habe auch viele Fehler (leeres Textfelder, nicht existierende Kundennummer, "0" Eingaben, negative Zahlen) bereits abgefangen.
Zum Schluss bleibt jetzt noch übrig, dass ein User in das Textfeld "NULL" schreibt oder "asdf", warum auch immer er das tun sollte. Ich möchte es abfangen.
In einem solchen Fall bekomme ich in der Powershell so eine Meldung ausgeworfen:
Invoke-Sqlcmd : Fehler beim Konvertieren des varchar-Datentyps in int.
Meldung: 8114, Ebene: 16, Zustand: 5, Prozedur: SP_KONTONR_AENDERN, Zeile: 0.
In C:\#Data\OneDrive - PFAD\Datei.ps1:1384 Zeichen:29
+ ... $job10001 = Invoke-Sqlcmd -ConnectionString "Data Source=$SqlServer; ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
+ FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
Was ja auch korrekt ist.
Im ersten Ansatz habe ich im Powershellscript die Query Definition und den Invoke-Sqlcmd Aufruf in
TRY & CATCH verpackt.
try
{
$query_10001 = "declare @info int;exec [SP_KONTONR_AENDERN] '$($textBox1.Text)','$($textBox2.Text)',@info OUTPUT;select @info as ergebnis"
$job10001 = Invoke-Sqlcmd -ConnectionString "Data Source=$SqlServer; Initial Catalog=$Database; User Id=$SqlAuthLogin; Password =$SqlAuthPw ;Encrypt = false" -Query "$query_10001"
}
catch
{
if ($_.FullyQualifiedErrorID -eq 'SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand')
{
AppendToTextBox_Red("Die Eingabe war ungültig.")
$textBox1.Text=''
$textBox2.Text=''
}
}
Leider ignoriert PS TRY & CATCH und wirft trotzdem die Meldung an die Konsole.
Im zweiten Schritt habe ich in der SQL Prozedur das Prüfen der Parameter und das Update in TRY & CATCH
gepackt.
BEGIN TRY
-- Kundennummer prüfen
IF ((ISNUMERIC(@INT_1)=0) OR (@INT_1<=0)) SET @STATUS=@STATUS+1;
-- Debitorenkontonr prüfen
IF ((ISNUMERIC(@INT_2)=0) OR (@INT_2<=0)) SET @STATUS=@STATUS+10;
-- Gültigkeit der Kundennummer prüfen
IF (select count(kundennr) from kunden where kundennr=@INT_1)=0 SET @STATUS=@STATUS+100
IF (@STATUS=0) update kunden set kontonr=@INT_2 where kundennr=@INT_1;
Select @STAT = @STATUS
END TRY
BEGIN CATCH
set @STATUS=11
select @STAT = @STATUS
END CATCH
Auch das bringt keinen Erfolg.
Falls die Frage kommt so "rede ich mit dem SQL Server"
# - SQL Server Verbindung deklarieren
$SqlServer = 'SQLSERVER\INSTANZ' # SQL Server instance (HostName\InstanceName for named instance)
$Database = 'DB' # SQL database to connect to
$SqlAuthLogin = 'gui_user' # SQL Authentication login
$SqlAuthPw = 'xxxxx # SQL Authentication login password
Hat einer von euch dazu Ideen?
Mir widerstrebt verständlicherweise es das so rauszugeben, in der Hoffnung, dass niemand Text in die Felder eingibt.
Update
Eine zweite, wenn auch aufwendigere Lösung wäre es, in der SQL Prozedur die Parameter als varchar zu definieren und
im Update Befehl zu casten.
Grüße vom it-frosch
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 42617263200
Url: https://administrator.de/contentid/42617263200
Ausgedruckt am: 23.11.2024 um 08:11 Uhr
4 Kommentare
Neuester Kommentar
Hi
Die Eingaben vorher in der Powershell prüfen ...
Gruß Katrin
Die Eingaben vorher in der Powershell prüfen ...
if ($textbox1.Text.trim() -notmatch '^\d+$' -or $textbox2.Text.trim() -notmatch '^\d+$'){
[System.Windows.Forms.MessageBox]::Show("Fehlerhafte Eingaben (Nur Zahlen erlaubt)","Fehler",0,48)
return
}
Wieder etwas gelernt.
👌Lohnt sich auswendig zu lernen, läuft einem beim Skripten immer wieder über den Weg und ist extremst nützlich: Regular Expressions