[英]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.