2017-03-31 6 views
1

トランザクションを作成する.NETコードがあります。このトランザクションでは、挿入/更新とそれに続く検証が実行されます。検証が失敗すると、変更をロールバックするための例外がスローされます。トランザクション内の行の前の状態を読み取ることはできますか?

このVB.NETコードに、現在の状態と行の以前の状態(挿入/更新前の状態)を確認する検証ルールを追加する必要があります。基本的に私の妥当性検査ルールでは、B→AではなくA→Bへの状態遷移が可能です。

現在のトランザクション以外の行の状態をクエリするにはどうすればよいですか?つまり、挿入/更新の前に行の状態を照会することはできますか?

+2

あなたはトリガーが欲しいのと同じように聞こえますが、これはまさにそれを行うことができます。 – pmbAustin

+1

現在の状態を照会するだけで(行を選択)、検証を行い、検証が成功した場合にのみ更新/挿入します。トリガによって行が挿入/更新されないようにすることもできます(pmbAustinによると)。これにより、コードの検証をより簡単に(たとえば、メッセージをユーザに表示したり、例外を投げるなど)行うことができます。トランザクション外の現在の状態を照会する必要はありません。 – IngoB

+1

異なるSqlConnectionを使用して同じデータをクエリすると、トランザクションで変更される前の状態のデータが表示されます。それはあなたが欲しいものですか? – FLICKER

答えて

0

また、戻り値を持つストアドプロシージャを作成することもできます。ストアドプロシージャ内では、まず更新する行を選択し、返さない変数を割り当て、更新を続行して(ここで検証することもできます)、割り当てられた変数を返します。

DECLARE @MyTableVar table(Name varchar(50),Age int); 
DECLARE @Name, 
     @Age 
BEGIN 
    SET @Name = (SELECT Name from YourTable WHERE ID=1) 
    SET @Age = (SELECT Age from YourTable WHERE ID=1) 

    -- Here goes your update statement.. 

END 

RETURN @MyTableVar 
+0

あなたの提案は有効ですが、このソリューションは、私のアプリの現在のアーキテクチャで実現可能ではありません。上記の別のコメントでコードがどのように整理されているかを述べました。ありがとう – burnt1ce

関連する問題