12

SQL Server 2008 R2 (.Net 3.5) にデプロイされた C# ストアド プロシージャを作成しており、オプションのパラメーターを null 許容 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

次のコンパイル時エラーが発生します。

'System.Data.SqlTypes.SqlGuid' 型への標準変換がないため、'< null >' 型の値を既定のパラメーターとして使用することはできません。

それで、私はこれに頼りました:

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

コード内のその文字列をテストするのは面倒だと感じたので、これはやりたくありませんでした。ただし、次のコンパイルエラーが発生するため、それも機能しません。

'System.Guid' 型への標準変換がないため、'string' 型の値を既定のパラメーターとして使用することはできません。

ああ、4つの異なるアプローチがありますが、どれも機能しません。 はぁ

あなたの考えや正しい方向へのプッシュをお願いします。

4

6 に答える 6

4

試す

, SqlGuid sID = New Guid()

使用できます

if (sID == Guid.Empty)

値が割り当てられていないかどうかを確認します。

于 2012-11-01T10:23:41.240 に答える
0

私は試していませんが、あなたは試しましたか?

Guid.Empty

?

于 2012-10-17T08:16:47.583 に答える
0

ご指摘のとおり、これは C#2.0 がオプションのパラメーターをサポートしていないためです。

回避策の 1 つは、既定のパラメーターを受け入れる通常の T-SQL ストアド プロシージャで .NET ストアド プロシージャをラップすることです。

例えば:

CREATE PROCEDURE TestProcWrapper
(
    @TestIntWrapperParam int = null
)
AS
EXEC TestProc @TestInt = @TestIntWrapperParam
于 2012-11-01T07:34:32.713 に答える
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]

次に、プロパティを使用して、実際に nullIsNullかどうかをテストできます。sID

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

残念ながら、C# コードでデフォルトを宣言する方法を知りません。

于 2012-10-10T06:50:01.563 に答える
0

デフォルトにしたい値にNullを渡すだけで何か問題がありますか?
確かに、これはすべての状況で機能するとは限りません。
実際の値が実際に Null かどうかを知りたい場合があるため、デフォルトの使用は避けてください。この場合、「 Default」パラメータ
を追加することに頼ります。

[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 sproc を呼び出すオプションのパラメーターをデフォルト値で受け取るために、追加の「ラッパー」sproc を作成する必要がなくなります。

Null が渡されたときに Default-Value を使用するには: UseDefault_pID = 1
Null が渡されたときに Actual-Value を保持するには: UseDefault_pID = 0

于 2012-10-10T00:17:14.163 に答える