Error Text ausgeben bei einer Stored Procedure in C# Anwendung
Benötigt
- MS SQL Datenbank
- Visual Studio 2019
Ziel
Das Beispiel soll ein Wert zurück geben, wenn die Stored Procedure ohne
Fehler ausgeführt wurde. Bei einem Ausnahmefehler soll wiederum der Fehler
Text Ausgeben werden in der Anwendung.
Beispiel Prozedur anlegen
Die Folgende Prozedur kann in ihrer Ausführung normal durchlaufen und den erwarteten Ausgangs Wert in 'myGetStatusMessage' ausgeben. Wird der Parameter 'showMeErrorMessage' auf 1 gesetzt, dann wird eine Ausnahme geworfen.
USE [example-data]
GO
SET Ansi_Nulls ON
GO
CREATE PROCEDURE [dbo].[myStoredProcedure]
@showMeErrorMessage AS BIT,
@myGetStatusMessage AS NVARCHAR(20) OUTPUT,
@myStoredProcedureErrorMessage NVARCHAR(100) OUTPUT
AS
Begin Try
IF @showMeErrorMessage = 1
Begin
THROW 123, 'Eine Ausnahme wurde geworfen', 1;
end
SELECT @myGetStatusMessage = 'Alles in Ordnung!'
end try
begin catch
SELECT @myStoredProcedureErrorMessage = ERROR_MESSAGE();
end catch
Beispiel C# Anwendung
Nun zu einer Consolen Anwendung, die den Aufruf einer gespeicherten
Prozedure ausführen kann und auch unter Ziel Bedingungen den Fehlertext
ausgeben kann, dass durch den Catch Block der Prozedur ausgefüllt wurde.
using System;
using System.Data.SqlClient;
Console.WriteLine("Ein Beispiel wie man eine Error Meldung aus einer Store Procedure ausgegeben werden kann");
Console.WriteLine("Store Procedure wird ausgeführt ohne Ausnahmefehler!");
RunStoreProcedure(false);
Console.WriteLine("\r\nStore Procedure wird ausgeführt mit Ausnahmefehler!");
RunStoreProcedure(true);
Console.WriteLine("\r\nPress enter to close application");
Console.ReadLine();
static void RunStoreProcedure(bool throwError)
{
var connection = new SqlConnection(
@"server=127.0.0.1,1433;User Id=CustomUser;Password=passwort;Database=example-data;");
connection.Open();
var query = "DECLARE @StatusOutput AS NVARCHAR(20), @ErrorOutput AS NVARCHAR(100);" +
$"EXEC [dbo].[myStoreProcedure] {(throwError ? 1 : 0)}, " +
"@StatusOutput OUTPUT, " +
"@ErrorOutput OUTPUT; " +
"SELECT @StatusOutput AS Status, @ErrorOutput AS Error";
var command = new SqlCommand(
query,
connection);
var reader = command.ExecuteReader();
while (reader.Read())
{
Console.Write("Ergebnis: ");
for (var iColumn = 0; iColumn < reader.GetColumnSchema().Count; iColumn++)
{
Console.Write($"{reader.GetValue(iColumn)}, ");
}
Console.WriteLine("");
}
connection.Close();
}
That's it
Der Umfang ist übersichtlich und kann in den meisten Fällen für eine
Anwendung in der Form eine Store Procedure ausführen. Was nicht so einfach
ist, wenn eine Tabelle zurück gegeben wird und dort die Möglichkeit statt
der Ergebnis Tabelle, wiederum einen Fehlertext auszugeben.
GitHub - ExampleStoreProcedureErrorOutput
Kommentare