2009-07-01 95 views
3

SQL Server在具有SqlInt32参数的.NET 2.0框架中用C#编写的存储过程。我试图使参数可选。这里是一个最小的测试情况下只是打印传递给它的整数:SQL Server 2005中.NET存储过程的默认参数值/可选参数

[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 

然而,我的目标是分配NULL来@TestInt的默认,这将让我只执行这条命令:

exec dbo.TestProc 

我不能找到一种方法来提供一个默认值到.NET中的参数码。从我可以通过谷歌搜索得到的,.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过程。这需要所有程序支持相同的参数,并且有几个是可选的。调用代码已经在生产,所以我试图避免改变它来传递每个调用的每个参数。在TSQL procs中,这不是问题,因为可选参数很容易,但显然不在.NET中。

回答

1

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

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

例如:

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

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

+1

感谢您的反馈,我已按照您的建议实施了包装。我试图避免这种解决方案,因为我不想构建太多的包装程序层。但是,如果不支持.NET中的可选参数,则看起来没有其他选择。这似乎是TSQL(其中可选参数很常见(至少在我的代码中))和.NET之间的一种不幸的“阻抗不匹配”,而在.NET中,它们甚至不可能(尚)。 – Pondlife 2009-07-03 08:32:22