繁体   English   中英

如何将可为空的guid声明为带有SQL Server的C#CLR存储过程的可选参数

[英]How to declare a nullable guid as an optional parameter for a C# CLR stored procedure with SQL Server

我正在编写一个部署在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"

我不想做的,因为在代码中测试该字符串感觉就像一个kludge。 但是,这不起作用,因为我得到这个编译错误:

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

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

非常感谢您的想法或推动正确的方向。

尝试

, SqlGuid sID = New Guid()

您可以使用

if (sID == Guid.Empty)

检查是否尚未分配值。

只是为了你想要的默认值传递Nulls有什么问题吗?
当然,这可能不适用于所有情况。
有时您可能想知道实际值是否确实为空,因此避免使用默认值。
如果是这种情况,那么我会采用额外的“ 默认 ”参数。

[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;
}

这节省了必须编写额外的“ 包装器 ”sprocs来接受带有默认值的可选参数,然后调用你的CLR sproc。

在Null传入时使用默认值:UseDefault_pID = 1
在Null传入时保持实际值:UseDefault_pID = 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是否sID为null:

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

我不知道在C#代码中声明默认值的方法,我担心。

我没试过,但你试过了吗?

Guid.Empty

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

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

例如:

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

检查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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM