2

次の特定の例外をキャッチする必要があります。

System.Data.OleDb.OleDbException がキャッチされました ErrorCode=-2147467259
Message="テーブルに要求した変更は、インデックス、主キー、またはリレーションシップに重複する値が作成されるため、成功しませんでした。重複データを含むフィールドのデータを変更するか、インデックスを削除するか、インデックスを再定義してください重複エントリを許可して、再試行してください。」Source="Microsoft JET Database Engine" StackTrace: System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) で System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) で System.Data.OleDb.OleDbCommand. System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 動作、Object& executeResult) の ExecuteCommandText(Object& executeResult) System.Data.OleDb.

よくわかりませんErrorCodeが、信頼性がないように見えます。

Messageプラットフォーム間で同一であることを信頼できますか?

OleDbHResult hrスタック トレースで見つかった値を何らかの方法で使用できますか? ( https://stackoverflow.com/a/991660/327528を参照)

Messageのような単語をテキスト検索する唯一の解決策はありますか?duplicateprimary key

4

4 に答える 4

7

ErrorCode (-2147467259 = 0x80004005 = E_FAIL) があまりにも一般的であり、メッセージに依存することは非常に脆弱であることは間違いありません。たとえば、ローカリゼーションを検討してください。

コレクションを見て、OleDbException.Errorsより具体的なものを見つけようとします。

于 2012-10-09T09:41:39.847 に答える
2

の JET エラー コードは、次のOleDbException場所で確認できます。

OleDbError.SQLState

これは3022、質問で提供された例外です。

于 2012-10-10T12:25:36.997 に答える
-1
try {
  cmd.ExecuteNonQuery();
} catch (OleDbException ex) {
  if (ex.ErrorCode == -2147467259) {
    MessageBox.Show("Hi , yes");
  }
}
于 2013-01-28T13:21:17.107 に答える