コードを介して (SQL クエリなどを介して .NET から) プログラムで Access データベースが破損しているかどうか、または破損した行を含むテーブルがあるかどうかを確認することは可能ですか?
//アンディ
コードを介して (SQL クエリなどを介して .NET から) プログラムで Access データベースが破損しているかどうか、または破損した行を含むテーブルがあるかどうかを確認することは可能ですか?
//アンディ
アプリケーション/データベース レベルのオブジェクトには、そのような「isCorrupted」プロパティはありません。
さらに、破損したデータベースには標準的な動作がありません。状況によっては、データベースがまったく開かない場合があります (ファイルが有効な mdb ファイルとして認識されない)。開くとすぐに、または特定のオブジェクト (テーブル、フォーム、または VBA コード) を使用/開くときにエラーが発生する可能性があります。
このような状況では、あなたの質問に対する肯定的な答えはないと思います。
注: Access の標準の圧縮/修復オプションに加えて、オブジェクトを他のデータベースにエクスポート (または破損したデータベースからインポート) したり、文書化されていない .saveAsText コマンドを使用すると非常に役立ちます。
共有ドライブのアクセス データベースで破損を引き起こすネットワークの問題があり、いくつかの特定のテーブルから破損した行をクリーンアップするのに多くの時間を費やしました。
特にメモ フィールドは、残りのデータのようにインラインで保存されず、別のテーブルに保持されるため、破損の良い兆候でした。破損したテーブルをデータシート モードで開き、破損したメモ セルにフォーカスを置いて、どの行が破損したかを判断しようとすることができました。破損があると、すぐにエラーが発生します。
破損した Int 列と Date 列は奇数の値 (1890 年 3 月 18 日、-11100910 など) になりますが、値を読み取っても実際にはエラーはスローされません。
これが、以前の回答の VBA に示されているように、データベース内のすべてのレコードとフィールドを循環させることが理にかなっていますが、メモ フィールドが破損している場合にのみ最も確実に実行される理由です。
以前のリリースの Access でエラーをチェックするために使用できる VBA を次に示します。2007年にも合うかもしれません。
Sub CheckForErr(tablename)
Dim rs As dao.Recordset
Dim db As Database
Set db = CurrentDb
Set rs = db.OpenRecordset(tname)
With rs
Do While Not .EOF
For Each fld In rs.Fields
If IsError(rs(fld.Name)) Then
Debug.Print "Error"
End If
Next
.MoveNext
Loop
End With
rs.Close
Set rs = Nothing
End Sub