【发布时间】:2010-11-07 07:19:25
【问题描述】:
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 value passed”:
exec dbo.TestProc @TestInt = 1
exec dbo.TestProc @TestInt = null
但是,我的目标是为@TestInt 分配一个默认的NULL,这样我就可以只执行这个命令:
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 proc。这要求所有过程都支持相同的参数,并且有几个是可选的。调用代码已经在生产中,所以我试图避免将其更改为在每次调用时传递每个参数。在 TSQL procs 中,这不是问题,因为可选参数很容易,但在 .NET 中显然不是。
【问题讨论】:
标签: c# sql-server-2005 stored-procedures