2016-09-14 1 views
2

SQL Serverのバックエンドに接続するAccessアプリケーションでエラー処理を設定しようとしていますが、Accessがヌル主キーをサーバーに渡さないようにしています。「On Error」は、キーがヌルであるかのように常にトリガーされますか?

私は私のコードは、ユーザーがnullにS_IDを設定します(または新しいレコードを作成するときにヌルとしてそれを離れた)場合ErrHandlerコードを実行することになっているProperly Handling Errors in VBA (Excel)

に基づいてのBeforeUpdateとコードを使用しています。しかし、それは常にErrHandlerコードを実行しています。

Private Sub S_ID_BeforeUpdate(Cancel As Integer) 

Dim trigger As Integer 

On Error GoTo ErrHandler 

If Me.S_ID Is Null Then 
    trigger = 1/0 
End If 

Exit Sub 

ErrHandler: 
    MsgBox ("Key was null, fix it") 
Resume Resume_spot 

Resume_spot: 

End Sub 

私はエラーが、無駄なMsgBoxResume_spot後に何の不足を生じたとき、私はアクセスが何をしたいのためのコードを記述したことはありません。私がそれまでに得る前に、私はエラー処理が適切に起動するようにしたい。

If Me.S_ID Is Null Then 

trigger
If IsNull(Me.S_ID) Then 
+2

明らかに答えはありませんが、***バックエンド***では、独自のID列の整合性を維持する責任はありませんか? SQL ServerでNOT NULLと定義されているのはなぜですか? – Comintern

+1

ところで、あなたの 'MsgBox'に' Err.Number'または 'Err.Description'が含まれていると、デバッグが非常に簡単になります。 – Comintern

+1

* "(または新しいレコードを作成するときにnullになります)" * - これはコントロールの 'BeforeUpdate'イベントをトリガーしません**。 – Andre

答えて

3

他の答えは解を説明するので、の問題について説明します。この行に「必要なオブジェクト」:あなたのエラーハンドラは実行時エラー424をキャッチされ

If Me.S_ID Is Null Then 

Is比較演算子は、テストの両側がオブジェクトに評価することが必要です。 Nullはオブジェクトではないため、エラーです。ゼロエラーによる除算を発生させるための "トリガーコード" trigger = 1/0は決して発射されません。

エラーハンドラをテストするか特定のエラーを作成する必要がある場合は、代わりにErr.Raiseを使用するほうがはるかに簡単です。

5

あなたはIsNull

変更を使用する必要がありますか?

このような簡単なチェックのために

If IsNull(Me.S_ID) Then 
    MsgBox "Key was null, fix it" 
    Cancel = True 
End If 

2-行うだけで、あなたは任意のコードを必要としません。フォームコントロールにはValidation ruleを使用します。

3-すべてこれは、ユーザーが決してコントロール内に何も入力しない場合をカバーしていません。これはCancel = Trueに設定することでForm_BeforeUpdate()で処理できます。

0

の1-なぜ奇妙建設

+0

私は検証ルールを使用していましたが、Accessはそのたわごとを反転させ、あなたが何かを入力するまで、フィールドが表示されますので、ユーザーが新しいレコードを誤って開いた場合、無効なデータが取得されます。 – Rominus

関連する問題