2009-07-01 5 views
3

SQL Server eine gespeicherte Prozedur, die in C# im .NET 2.0-Framework mit einem SqlInt32-Parameter geschrieben wurde. Ich versuche, den Parameter optional zu machen. Hier ist ein minimaler Testfall, der gerade druckt die ganze Zahl an sie übergeben:Standardparameterwerte/optionale Parameter für gespeicherte .NET-Prozeduren in SQL Server 2005

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void TestProc(
    SqlInt32 TestInt 
    ) 
{ 
    SqlPipe pipe; 
    pipe = SqlContext.Pipe; 

    if (TestInt.IsNull) 
    { 
     pipe.Send("NULL value passed"); 
    } 
    else 
    { 
     pipe.Send(TestInt.ToString()); 
    } 
} 

Diese Befehle ausführen, wie erwartet, und print „1“ und „NULL Wert übergeben“, beziehungsweise:

exec dbo.TestProc @TestInt = 1 
exec dbo.TestProc @TestInt = null 

jedoch Mein Ziel ist es, einen Standardwert von NULL zu @TestInt zuweisen, die mich gerade diesen Befehl auszuführen erlauben würde:

exec dbo.TestProc 

ich keinen Weg finden kann einen Standardwert auf die Parameter innerhalb des .NET zur Verfügung zu stellen Code. Von dem, was ich von Googling finden konnte, wird .NET 4.0 optionale Parameter unterstützen, also vermutlich .NET 2.0 nicht. Und (naiv) Ändern der Parameter Erklärung wie diese den Fehler gibt „Standardparameter Bezeich sind nicht erlaubt“:

SqlInt32 TestInt = SqlInt32.Null 

Ich habe auch versucht die Methode Überlastung durch diesen Code hinzufügen:

public static void TestProc() 
{ 
    SqlInt32 intNull; 
    intNull = SqlInt32.Null; 
    TestProc(intNull); 
} 

Dies kompiliert sauber , kann aber nicht bereitgestellt werden: VS zeigt den Fehler "Überladene Methoden, Eigenschaften oder Felder werden nicht unterstützt". An dieser Stelle stecke ich fest.

Der reale Anwendungsfall ist natürlich komplexer: Es ist ein TSQL-Protokollierungsmodul, das gespeicherte Prozeduren aufruft, um Protokollmeldungen zu verarbeiten. Die Verarbeitungsprozedur wird zur Laufzeit dynamisch identifiziert und der aufrufende Code weiß nicht, ob er einen TSQL- oder .NET-Prozess aufruft. Das erfordert, dass alle Prozeduren dieselben Parameter unterstützen, und mehrere sind optional. Der aufrufende Code ist bereits in Produktion, deshalb versuche ich, es zu vermeiden, um jeden Parameter bei jedem Aufruf zu übergeben. In TSQL-Prozeduren ist dies kein Problem, da optionale Parameter einfach sind, aber anscheinend nicht in .NET.

Antwort

1

Wie Sie darauf hingewiesen haben, ist dies darauf zurückzuführen, dass C# 2.0 optionale Parameter nicht unterstützt.

Eine Abhilfe könnte darin bestehen, die gespeicherten .NET-Prozeduren in reguläre gespeicherte T-SQL-Prozeduren zu verpacken, die Standardparameter akzeptieren.

Zum Beispiel:

CREATE PROCEDURE TestProcWrapper 
(
    @TestIntWrapperParam int = null 
) 
AS 
EXEC TestProc @TestInt = @TestIntWrapperParam 

Es ist ein bisschen hässlich, aber könnten Sie auf dem Weg zu bekommen.

+1

Danke für die Rückmeldung, ich habe einen Wrapper implementiert, wie Sie vorgeschlagen haben. Ich habe versucht, diese Lösung zu vermeiden, weil ich nicht zu viele Schichten von Wrapper-Prozeduren aufbauen möchte. Ohne Unterstützung für optionale Parameter in .NET scheint es jedoch keine Alternative zu geben. Dies scheint ein unglücklicher "Impedanz-Mismatch" zwischen TSQL zu sein, wo optionale Parameter üblich sind (zumindest in meinem Code), und .NET, wo sie (noch) nicht einmal möglich sind. – Pondlife