2

私のソリューションの 1 つで、SQL Server の変更追跡機能を使用しています。実際のアプリケーションによる変更と同期アプリケーションによる変更を区別するために、Change Context を使用しています。さて、私が知っているように、この変更コンテキストは varbinary(128) 型です。

アプリケーション ロジックでは、変更コンテキストとして使用するランダム バイトを含むバイト配列を作成し、同期アプリケーションが変更を行うと、この変更コンテキストを使用します。次に、実際のアプリケーションによって行われた変更セットを、変更コンテキストなしで取得しようとすると、クエリで次のコード スニペットを使用します。

SELECT .... from .... WHERE (SYS_CHANGE_CONTEXT != @context OR SYS_CHANGE_CONTEXT IS NULL)

ここで、@context は、変更セットを取得するために sqlcommand に追加されるタイプ VARBINARY(128) のコマンド パラメータです。コマンドに渡された変更コンテキストに関係なく、行われたすべての変更が引き続き取得されます。

VARBINARY 値を比較したり、パラメーターとして送信したりする特別な方法はありますか??

4

1 に答える 1

2

文字通りあなたの質問に答えて、Varbinary を比較する特別な方法があると確信しています (特に事前比較として使用するハッシュを事前計算するなどの大きな方法) が、通常の "=" 演算子は問題なく動作します:

declare @a varbinary(max) = 0x12345678;
declare @b varbinary(max) = 0x12345678;
declare @c varbinary(max) = 0x12345679;
declare @d varbinary(max) = null;
declare @e varbinary(max) = null;

select iif(@a = @b, 1, 0) as AreEqual -- 1
union all
select iif(@a = @c, 1, 0) as AreEqual -- 0
union all
select iif(@a = @d or @a is null and @d is null, 1, 0) as AreEqual -- 0
union all
select iif(@d = @e or @d is null and @e is null, 1, 0) as AreEqual -- 1

C# エンティティ フレームワークからは、byte[] として表示されます。パラメータがメモリフットプリントに依存するため、渡すための特別な要件は認識していません。(あなたの例よりも)大きいものについては、ストリームを使用できます(例:12

于 2013-09-16T18:49:39.757 に答える