2012-09-25 25 views
12

我正在編寫一個部署在SQL Server 2008 R2(如.Net 3.5)上的C#存儲過程,並且希望聲明一個可選參數作爲可以爲空的guid。這是我第一次嘗試:如何使用SQL Server將可空的guid聲明爲C#CLR存儲過程的可選參數

這失敗,編譯時錯誤:

Default parameter value for 'sID' must be a compile-time constant

這是因爲DBNull.Value不是一個常量,這是一種痛苦。

所以我試圖改變聲明:

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

這編譯,但現在我得到這樣的部署錯誤:

Deploy error : Could not create a type for parameter System.Nullable

嘗試:

, SqlGuid sID = null 

給出了這樣的編譯時錯誤:

A value of type '< null >' cannot be used as a default parameter because there are no standard conversions to type 'System.Data.SqlTypes.SqlGuid'

所以感覺比較粘我使出這樣的:

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

但我並不想這樣做,以測試的代碼串感覺就像一個雜牌。但是這並不工作,如我得到這個編譯錯誤:

A value of type 'string' cannot be used as a default parameter because there are no standard conversions to type 'System.Guid'

爾加,4種不同的方法,沒有的他們的工作。 嘆息

請感謝您的想法或推動正確的方向請。

+0

你有沒有嘗試過「Guid?sID」,沒有= null? – H27studio

回答

0

傳遞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; 
} 

這樣可以節省不必編寫額外的「包裝」存儲過程採取與缺省值,然後打電話給你的CLR存儲過程的可選參數。

以使用默認 - 值時的空傳遞:UseDefault_pID = 1
爲了保持實際值時的空傳遞:UseDefault_pID = 0

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其實空:

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

我不知道的方法來聲明默認在C#代碼,我害怕。

0

我沒有嘗試,但你嘗試

Guid.Empty 

+3

會產生與第一個相同的錯誤:「sID的默認參數值必須是編譯時常量」 - 因爲'Guid.Empty'不是編譯時常量。 –

0

正如您所指出的,這是因爲C#2.0不支持可選參數。

一種解決方法可能是將.NET存儲過程封裝在接受默認參數的常規T-SQL存儲過程中。

例如:

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

嘗試

, SqlGuid sID = New Guid() 

您可以使用

if (sID == Guid.Empty) 

要檢查它是否沒有被分配一個值。

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; 
相關問題