C# SQL Server 2005中.NET存储过程的默认参数值/可选参数

C# SQL Server 2005中.NET存储过程的默认参数值/可选参数,c#,sql-server-2005,stored-procedures,C#,Sql Server 2005,Stored Procedures,SQL Server在.NET 2.0框架上用C#编写的存储过程,具有SqlInt32参数。我试图使参数成为可选的。下面是一个最小的测试用例,它只打印传递给它的整数: [Microsoft.SqlServer.Server.SqlProcedure] public static void TestProc( SqlInt32 TestInt ) { SqlPipe pipe; pipe = SqlContext.Pipe; if (TestInt.IsN

SQL Server在.NET 2.0框架上用C#编写的存储过程,具有SqlInt32参数。我试图使参数成为可选的。下面是一个最小的测试用例,它只打印传递给它的整数:

[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());
    }
}
这些命令按预期执行,并分别打印“1”和“传递的空值”:

exec dbo.TestProc @TestInt = 1
exec dbo.TestProc @TestInt = null
但是,我的目标是将默认值NULL分配给@TestInt,这将允许我只执行以下命令:

exec dbo.TestProc
我找不到在.NET代码中为参数提供默认值的方法。通过谷歌搜索,我发现,.NET4.0将支持可选参数,所以大概.NET2.0不支持。(天真地)这样更改参数声明会导致错误“不允许使用默认参数说明符”:

我还尝试通过添加以下代码来重载该方法:

public static void TestProc()
{
    SqlInt32 intNull;
    intNull = SqlInt32.Null;
    TestProc(intNull);
}
这可以干净地编译,但无法部署:VS显示错误“不支持重载的方法、属性或字段”。所以在这一点上我被卡住了


真正的用例当然更复杂:它是一个TSQL日志模块,调用存储过程来处理日志消息。处理过程在运行时被动态标识,调用代码不知道它是在调用TSQL还是.NET过程。这要求所有过程都支持相同的参数,并且有几个是可选的。调用代码已经在生产环境中,所以我试图避免将其更改为在每次调用中传递每个参数。在TSQL过程中,这不是一个问题,因为可选参数很简单,但在.NET中显然不是。正如您所指出的,这是因为C#2.0不支持可选参数

一种解决方法可能是将.NET存储过程包装在接受默认参数的常规T-SQL存储过程中

例如:

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

这有点难看,但现在可能会让您上路。

谢谢您的反馈,我已经按照您的建议实现了一个包装器。我试图避免这种解决方案,因为我不想构建太多的包装程序层。但是,如果.NET中不支持可选参数,看起来就没有其他选择了。这似乎是TSQL和.NET之间的一个不幸的“阻抗失配”,在TSQL中,可选参数很常见(至少在我的代码中是这样),而在.NET中,它们甚至不可能(现在)。
CREATE PROCEDURE TestProcWrapper
(
    @TestIntWrapperParam int = null
)
AS
EXEC TestProc @TestInt = @TestIntWrapperParam