12

我正在编写一个部署在 SQL Server 2008 R2(所以 .Net 3.5)上的 C# 存储过程,并希望将一个可选参数声明为可为空的 guid。这是我首先尝试的:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(
     SqlGuid pID
    , SqlGuid sID = DBNull.Value
    )

这因编译时错误而失败:

'sID' 的默认参数值必须是编译时常量

这是因为DBNull.Value不是一个常数,这是一种痛苦。

所以我尝试将声明更改为:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(
     SqlGuid pID
    , Guid? sID = null
    )

这可以编译,但现在我收到此部署错误:

部署错误:无法为参数 System.Nullable 创建类型

试:

, SqlGuid sID = null

给出这个编译时错误:

'< null >' 类型的值不能用作默认参数,因为没有标准转换为 'System.Data.SqlTypes.SqlGuid' 类型

所以感觉相当卡住了,我求助于这个:

, SqlGuid sID = "00000000-0000-0000-0000-000000000000"

我不想这样做,因为在代码中测试该字符串感觉就像一个杂物。但是,当我收到此编译错误时,这也不起作用:

'string' 类型的值不能用作默认参数,因为没有标准转换为 'System.Guid' 类型

Gah,4 种不同的方法,但它们都不起作用。

将不胜感激您的想法或推动正确的方向。

4

6 回答 6

4

尝试

, SqlGuid sID = New Guid()

您可以使用

if (sID == Guid.Empty)

检查它是否没有被赋值。

于 2012-11-01T10:23:41.240 回答
0

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

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

例如:

CREATE PROCEDURE TestProcWrapper
(
    @TestIntWrapperParam int = null
)
AS
EXEC TestProc @TestInt = @TestIntWrapperParam
于 2012-11-01T07:34:32.713 回答
0

Is there something wrong with just passing in Nulls for the values you want defaulted?
Granted this may not work in every situation.
Sometimes you may want to know if the actual value is indeed Null, and therefore avoid using the default.
If this is the case, then I would resort to adding an additional "Default" parameter.

[Microsoft.SqlServer.Server.SqlProcedure]
public static void MySproc(SqlGuid pID, SqlGuid sID, SqlBoolean UseDefault_sID)
{
    sID = (UseDefault_sID == SqlBoolean.True && sID == SqlGuid.Null)
        ? SomeDefaultPIDValue : sID;
}

This saves on having to write additional "wrapper" sprocs to take in optional parameters with default values that then call your CLR sproc.

To use the Default-Value when Null pass in: UseDefault_pID = 1
To keep the Actual-Value when Null pass in: UseDefault_pID = 0

于 2012-10-10T00:17:14.163 回答
0

我没试过,但你试过了吗

Guid.Empty

?

于 2012-10-17T08:16:47.583 回答
0

只需将其声明为:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(
     SqlGuid pID
    , SqlGuid sID
    )

然后在 SQL Server 中手动注册:

ALTER PROCEDURE [dbo].[spCalcPerc]
    @pID [uniqueidentifier],
    @sID [uniqueidentifier] = null
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SqlServerProject3].[StoredProcedures].[spCalcPerc]

然后您可以使用该IsNull属性来测试是否sID实际上为 null:

SqlContext.Pipe.Send(sID.IsNull.ToString());

恐怕我不知道在 C# 代码中声明默认值的方法。

于 2012-10-10T06:50:01.563 回答
0

如下检查 null。

[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(SqlGuid pID)
{
    // check for null or set default
    Guid refId = pID.IsNull ? Guid.NewGuid() : pID.Value;
于 2015-06-09T06:37:11.870 回答