Ich habe hier ein Problem mit den
SQL Fehlercodes. Ich erklär erst einmal was ich überhaupt mache:
im
SQL Server 2005 nutze ich eine .NET Funktion (SQLCLR). Innerhalb dieser .NET Funktion greife ich auf einen Webservice zu, der mir einen Wert einer bestimmten Berechnung zurückliefert. Diesen Wert soll die .NET Funktion dann an den Aufrufer zurückgeben.
Das klappt auch alles so wie es soll, ne richtig feine Sache. Nur habe ich zur Zeit Probleme mit der Fehlerbehandlung. Tirtt im Webservice ein Fehler auf, so knallts mit in der .NET Funktion (in C# geschrieben), welche mir dann den Fehler an den
SQL Server zurückliefert. Der sieht dann in etwa so aus:
Msg 6522, Level 16, State 1, Line 2
A .NET Framework error occurred during execution of user defined routine or aggregate 'ReadInt':
System.Web.Services.Protocols.SoapException: Server was unable to process request. --> Logical Itemname n12 for Device rbg does not exist in loaded itemslist.
System.Web.Services.Protocols.SoapException:
at System.Web.Services.Protocols.SoapHttpClientProtoc ol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtoc ol.Invoke(String methodName, Object[] parameters)
at TOPCService.ReadInt(String Itemname, String DeviceName)
at Functions.ReadInt(String Itemname, String DeviceName)
.
Aus dieser langen Fehlermeldung hab ich mal die wichtigen Dinge blau markiert. Der Fehlermeldungstext wird aus dem Webservice gesetzt, jedoch habe ich da natürlich keine Möglichkeit, die Msg Id zu setzen. Bei jedem Fehler, der auftritt, schmeisst mir der
SQL Server immer nur die Msg 6522 zurück. Aber genau diesen Fehler muss ich auswerten, und zwar so effizient wie nur möglich.
Ich dachte daran, in der .NET Funktion in C# den Fehler im catch Block abzufangen, und dort aufgrund des Fehlertextes "Logical Itemname n12 for Device rbg does not exist in loaded itemslist." diesen auszuwerten und eine benutzerdefinierte Msg Id zurückzuliefern. Somit hätte ich eine bessere Flexibilität bei der Auswertung des Fehlers im
SQL Server.
Und genau da häng ich. Die C# Funktion sieht zur Zeit so aus:
Code:
public static String ReadString(String Itemname, String DeviceName)
{
String S;
TOPCService OPC;
try
{
OPC = new TOPCService();
OPC.Url = RegSettings.UrlWebService();
S = OPC.ReadString(Itemname, DeviceName);
OPC.Dispose();
} catch (
Exception e) {
S = "";
ArgumentException
ec = new ArgumentException("Item not found");
throw
ec;
}
return (String)S;
}
Nur krieg ich mit dem Code natürlich die MsgId nicht geändert. Ich müsste im Catch Block den Fehler analysieren können und eine entsprechende
exception auslösen. In T-
SQL ginge das mit
RAISEERROR MsgId,-1,-1
aber in .NET ?
Ich hoff mein Problem wurde verstanden