Col*_*lty 12 c# sql-server stored-procedures guid optional-parameters
我正在编写一个部署在SQL Server 2008 R2(即.Net 3.5)上的C#存储过程,并希望将可选参数声明为可以为空的guid.这是我先尝试过的:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(
SqlGuid pID
, SqlGuid sID = DBNull.Value
)
Run Code Online (Sandbox Code Playgroud)
这与编译时错误失败:
'sID'的默认参数值必须是编译时常量
这是因为DBNull.Value
不是一个常数,这是一种痛苦.
所以我尝试将声明更改为:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void spCalcPerc(
SqlGuid pID
, Guid? sID = null
)
Run Code Online (Sandbox Code Playgroud)
这编译但现在我得到这个部署错误:
部署错误:无法为参数System.Nullable创建类型
试:
, SqlGuid sID = null
Run Code Online (Sandbox Code Playgroud)
给出了这个编译时错误:
类型为"<null>"的值不能用作默认参数,因为没有标准转换来键入"System.Data.SqlTypes.SqlGuid"
所以感觉相当困难我采取了这个:
, SqlGuid sID = "00000000-0000-0000-0000-000000000000"
Run Code Online (Sandbox Code Playgroud)
我不想做的,因为在代码中测试该字符串感觉就像一个kludge.但是,这不起作用,因为我得到这个编译错误:
"string"类型的值不能用作默认参数,因为没有标准转换来键入"System.Guid"
Gah,4种不同的方法,但都不起作用. 叹
非常感谢您的想法或推动正确的方向.
只为您想要默认的值传递 Null 是否有问题?
当然这可能并不适用于所有情况。
有时您可能想知道实际值是否确实为 Null,因此避免使用默认值。
如果是这种情况,那么我会添加一个额外的“默认”参数。
[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;
}
Run Code Online (Sandbox Code Playgroud)
这样就不必编写额外的“包装器”存储过程来接受带有默认值的可选参数,然后调用 CLR 存储过程。
传入 Null 时使用默认值:UseDefault_pID = 1
传入 Null 时保留实际值:UseDefault_pID = 0
归档时间: |
|
查看次数: |
5883 次 |
最近记录: |