SQL Server 2005中.NET存储过程的缺省参数值/可选参数

时间:2009-07-01 11:30:32

标签: 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.IsNull)
    {
        pipe.Send("NULL value passed");
    }
    else
    {
        pipe.Send(TestInt.ToString());
    }
}

这些命令按预期执行,分别打印“1”和“NULL值传递”:

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

但是,我的目标是为@TestInt分配一个NULL的默认值,这将允许我执行这个命令:

exec dbo.TestProc

我找不到在.NET代码中为参数提供默认值的方法。从Googling所能找到的,.NET 4.0将支持可选参数,因此可能是.NET 2.0没有。并且(天真地)更改这样的参数声明会给出错误“不允许使用默认参数说明符”:

SqlInt32 TestInt = SqlInt32.Null

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

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

这样编译干净,但无法部署:VS显示错误“不支持重载的方法,属性或字段”。所以在这一点上我被困住了。

真正的用例当然更复杂:它是一个TSQL日志记录模块,它调用存储过程来处理日志消息。处理过程在运行时动态识别,调用代码不知道它是否正在调用TSQL或.NET proc。这需要所有过程支持相同的参数,并且有几个是可选的。调用代码已经在生产中,所以我试图避免更改它以在每次调用时传递每个参数。在TSQL过程中,这不是问题,因为可选参数很容易,但显然不在.NET中。

1 个答案:

答案 0 :(得分:1)

正如您所指出的,这是因为C#2.0不支持可选参数。

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

例如:

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

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