2016-11-08 19 views
0

からのエラーを無視することは、いくつかのSQLです...ADOはおそらくここでSQL Serverの

UPDATE table1 SET date = GETDATE() WHERE id = @id 

IF @@ROWCOUNT = 0 
BEGIN; 
    THROW 50004, 'Row not updated.', 1; 
END 

私は偽のIDを管理Studioでこれを実行すると、私は...

(0行を取得影響を受ける)メッセージ50004、レベル16、状態1、手順 MyStoredProcedure、行50行が更新されません。

これをASP Classicから実行すると、Err.Numberは0であり、接続のエラーコレクションは空です。

UPDATEステートメントを削除すると、エラーが登録されます。

更新後にADOがエラーを無視するのはなぜですか?

+1

「ADOエラーを無視する」*は少し予期せず、ADODBが使用しているSQL Serverプロバイダが何らかの理由でTHROWステートメントをトリガしない可能性があります。覚えているのは、SSMSから機能するということは、ADODBからはじめて動作するわけではありませんが、SSMSでのクエリのテストが始まることを意味します。決定的な証拠が得られるまで、結論に飛び乗ってはいけません。 – Lankymart

+0

'@@ ROWCOUNT'の正しい結果を得るために' SET NOCOUNT ON; 'を呼びますか? – Lankymart

+0

はい、質問は予期しています。いい考え。私は「SET NO COUNT ON;」で問題を解決しました。しかし、それがなくても、@@ ROWCOUNTはASPから呼び出されたときでも動作しますが、ストアドプロシージャのOUTパラメータを介してASPに正しい値を返すことでこれを証明しました。だから私の "仮説"はまだ反論されていないと思う。 –

答えて

1

私はSET NOCOUNT ONをストアドプロシージャの先頭に追加しました。

Hereは、それが

SET NOCOUNT ONは、ストアドプロシージャ内の各文の クライアントにDONE_IN_PROCメッセージの送信を防止...と言います。

したがって、恐らくDONE_IN_PROCメッセージは、後続のエラーがスキップされる結果となります。

関連する問題