【问题标题】:Default parameter values/optional parameters for .NET stored procedures in SQL Server 2005SQL Server 2005 中 .NET 存储过程的默认参数值/可选参数
【发布时间】: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


    【解决方案1】:

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

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

    例如:

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

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

    【讨论】:

    • 感谢您的反馈,我已经按照您的建议实现了一个包装器。我试图避免这种解决方案,因为我不想构建太多层的包装程序。但是,如果不支持 .NET 中的可选参数,似乎别无选择。这似乎是 TSQL 之间的不幸“阻抗不匹配”,可选参数很常见(至少在我的代码中)和 .NET,它们甚至不可能(还)。
    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 2014-05-13
    • 2010-12-21
    • 1970-01-01
    • 2012-08-06
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多