データベース破損の可能性を修正するには?
-
05-07-2019 - |
質問
クライアントで、アクセスアプリケーションにいくつかの簡単な修正を行っています。しばらくアクセスしていましたが、すぐに回復しています。しかし、私は興味深い問題を発見しました:
一部のレポートでは、「レコードが削除されました」というメッセージが表示されます。エラー。レポートを確認しましたが、1つのテーブルに問題があるようです。そのテーブルを開くと、すべての列が「#deleted」とマークされているレコードが見つかります。したがって、明らかに、この列が犯人のようです。ただし、その行を削除しようとしても、実際には何も起こりません。テーブルを再度開くと、行はまだ存在しています。
データベースに破損はありますか?このレコードを永久に削除するにはどうすればよいですか?
編集: MS2000バージョンです
解決策:単に圧縮/修復が機能しませんでした。代わりに、データベースを2003ファイル形式に変換しました。正しい方向を示してくれたので、圧縮/修復を提案する最初の答えをマークしました。ありがとう!
解決
組み込みのAccessコンパクト/修復ツールを試しましたか?これにより、データベースから削除されたレコードがフラッシュされます。
正確な場所は、実行しているAccessのバージョンによって異なりますが、Access 2003では[ツール]>の下にあります。データベースユーティリティ>データベースの圧縮と修復。以前のバージョンのAccessには、コンパクト用と修復用の2つの別個のツールがありましたが、同様の場所からアクセスされていました。クライアントのバージョンが異なる場合、両方を実行する必要があります。
これは非破壊的な操作である必要がありますが、MDBファイルのコピーでこれをテストすることをお勧めします(明白なことを述べて申し訳ありません)。
他のヒント
Tony Toews(Access MVP)には、破損に関する包括的なガイドがあります:
Microsoft Access MDBの破損に関するよくある質問
- いくつかの破損症状
- 破損の原因となったワークステーションの特定
- 破損の原因
- データを取得するには
余談ですが、逆コンパイルは奇妙な出来事を整理するのに非常に便利ですコーディング時および起動時間の改善のため。
// andy
圧縮してインポートしても、報告されたエラーの問題は修正されません。これは、メモフィールドへのポインターが明らかに破損しているためです。できることは、問題の原因となっているレコードを削除して再作成することだけです。また、破損リスクにさらされないメモデータを編集する方法を見つける必要があります(またはメモフィールドを削除します。本当に255文字以上必要ですか?)。これは、メモフィールドのフォーム上のバインドコントロールを回避することを意味します。
代わりに、バインドされていないテキストボックスを使用し、フォームのOnCurrentイベントで、フォームの基になるレコードソースから現在のデータを割り当てます。
Me!txtMyMemo = Me!MyMemo
編集を非バインドコントロールに保存するには、コントロールのAfterUpdateイベントを使用します。
Me!MyMemo = Me!txtMyMemo
Me.Dirty = False ' save the whole record
メモフィールドが破損しやすいのはなぜですか?それらは非メモフィールドと同じデータページに保存されていないため、レコードのメインデータページにあるのは、他のデータページ(または、データページの大きなチャンクの場合はデータページのセット)へのポインターだけです。 data)実際のメモデータが保存される場所。この方法で行わなかった場合、メモが含まれるレコードは、最大レコード長をすぐに超えてしまいます。
ポインターは比較的簡単に破損します。ほとんどの場合、バインドされたコントロールでの編集中に致命的な問題が発生します。バインドされていないコントロールで編集しても問題が完全に解消されるわけではありませんが、危険にさらされる時間が非常に短いことを意味します(つまり、AfterUpdateイベントでこれらの2行のコードが実行される時間) 。
前述のオプションとは別に、別の簡単な方法も使用しました。新しいMDBファイルを作成し、破損したファイルからすべてのオブジェクトをインポートするだけです。この方法でシステムや隠しオブジェクトを取得することを忘れないでください。