2

あるデータベースから別のデータベースにレコードを実行して挿入するスクリプトを継承しました。

数日前、あるシステムから別のシステムにレコードがプルされていないと人々が不満を言うまで、すべてが正常に機能しているように見えました。

Windows Server2003でスケジュールされたタスクで実行するように設定されたマクロを確認しました。マクロはログに記録された出力をSQLServerに送信するため、そこに移動して、1人の従業員が挿入されたことを示す適切なログステートメントを探しました。データベース。しかし、他のシステムに行くと、転勤して挿入されたと伝えられている従業員はそこにいませんでした。

さらに詳しく調べると、一方のデータベースから選択されていたフィールドだけが、もう一方のデータベースに追加された挿入ステートメントにプルされました。

これらの値を手動で挿入しようとすると、フィールドをNULLまたは長さゼロの文字列にすることが許可されていないというSQLエラーが発生しました。ただし、スクリプトでのエラーチェックにもかかわらず、

Function SomeFunc
   On Error GoTo The_Err

   DoCmd.SetWarnings False ' This statement seems a bit suspect to me...maybe fields being
                           ' null or a zero length are just warnings?  Seems wrong because
                           ' I don't want a warning when my record will not be inserted, 
                           ' I want an error.

   ....

   DoCmd.OpenQuery "qryAddNewEmp_S1toS2", acViewNormal, acAdd ' This is the statement that
                                                              ' selects from the one db
                                                              ' and inserts into the other db

...

The_Exit:

    Exit Function

The_Err:
    ' MsgBox Error$ ' You can turn this on and off.
    dmsg = "Error AUCP"
    RunCheck dmsg, errArea, 0, 0
    DoCmd.SetWarnings True
    Resume The_Exit

End Function

警告がオフになってDoCmd.SetWarnings Falseいるため、エラーがログに記録されませんか?また、代わりにコードで検証を行い、各値をチェックする必要がありますか?それは私には正しくないようです。データベースにはそれが組み込まれているので、それはデータベースの責任であるはずのことのようです。

4

1 に答える 1

0

の代わりにDoCmd.OpenQuery、このようなアプローチを使用してください...

Dim db As DAO.Database
Set db = CurrentDb
db.Execute "qryAddNewEmp_S1toS2", dbFailOnError
Set db = Nothing

SetWarningsそうすれば、 ()をオフにする理由はありませんFalse。また、INSERTエラーはエラーハンドラコードによってキャプチャされ、エラーがログに記録されます(ログを記録RunCheckするカスタムプロシージャであると想定しています)。

于 2012-08-28T13:31:45.553 に答える