-1

最近、Access .mdb データベースが断続的に起動し、Access (Access 2003 と 2007 の両方) を終了できなくなりました。終了すると ([X] ボタンを押すかメニューからかを問わず、データベースが閉じられ、Access も終了するように見えますが、突然 (データベースを開かずに) 再び表示されます) その時点で終了する唯一の方法ポイントはタスクマネージャーからです。

私が最近行った重要な変更が 2 つありますが、関連する可能性があります。1)WinSCP .Netアセンブリを使用してftpサーバーにアクセスし始めました.ftpサーバーをインストールして、ここの手順からCOMに登録する必要がありました。2)最初はリンクテーブルとして、次にVBA ADOコードからODBCの使用を開始しました(これを参照)。リンクされたテーブルを使用していたときと ADO を使用していたときの両方で問題が発生したため、この 2 番目の変更がこの問題を引き起こしているとは思えません。

これは、データベースを開くたびに発生するわけではなく、パターンに気づいていません。この奇妙な問題の原因は何ですか?

編集 - 問題の根本を見つけました。さまざまな時点で ftp ダウンロード コードを分割し、終了するかどうかを確認して、次のコードに絞り込みました。

Dim PDFFolders As Recordset
Set PDFFolders = CurrentDb.OpenRecordset("PDFFolders")
Dim syncOptions As TransferOptions
Set syncOptions = New TransferOptions
syncOptions.filemask = "*/*.pdf"
On Error Resume Next    'In case it doesn't exist

Do While Not PDFFolders.EOF
    sess.SynchronizeDirectories SynchronizationMode_Local, info!RTFFolder, _
            info!BasePDFFolder & "/" & PDFFolders!Name, False, , , _
            syncOptions

    PDFFolders.MoveNext
Loop
PDFFolders.Close
Set syncOptions = Nothing
Set PDFFolders = Nothing
On Error GoTo 0

ステートメントを実行するsess.SynchronizeDirectoriesと、アクセスは終了しません。それ以外の場合は終了します。WinSCPに勝ったバグのように私には見えます。

ファイルのダウンロードやディレクトリの作成など、他のことは問題なく実行できますが、このステートメントに到達すると、その後アクセスを終了しません。

4

2 に答える 2

2

通常、Access のスティッキー インスタンスは、ぶら下がっているオブジェクト参照が原因で発生します。

あなたが説明した方法で Access がハングした場合、厄介な循環参照が疑われます。

循環参照を調査するには、基本的に次の 2 つのオプションがあります。

  1. 循環依存関係についてコードを検査します- これは退屈で簡単ではないかもしれません。しかし、自分のコード ベースを深く理解している場合は、最初にどこを見ればよいか分からないかもしれません。
  2. コードにログを追加する- インスペクションだけでは問題を特定できない場合は、オブジェクトの作成/削除のログを ( Class_Initialize/を介してClass_Terminate) 結果として追加することを検討できます。クラスを頻繁に使用する大規模なコード ベースの場合、これは最初の投資として適しています。
    問題がコードを制御できないクラスにある場合 (あなたのケースのように)、作成/削除をログに記録できるラッパー クラスを介してのみその外部クラスを使用することを検討してください。もちろん、厄介なケースでは、ラッパー クラスの終了は、ラップされたクラスの終了を意味しません。

ところで、すべてのオブジェクト参照を明示的に Nothing ASAP に設定することを強くお勧めします。

Set MyObj = GetMyObject()
' Proceed with coding here later
' First write the following line
Set MyObj = Nothing

どちらの場合も参照を Nothing に設定するために、ローカル エラー処理の場合は特別な考慮が必要です。

これを確実にする良い方法は、明示的な変数の代わりに With ブロックを使用することです (使用パターンで許可されている場合)。

With GetMyObject()
   ' Use the object's members here
End With

このパターンを使用すると、ローカル変数の宣言を保存し、オブジェクト参照が現在のメソッドで存続しないことを確認できます。

于 2013-09-18T10:57:28.243 に答える
1

まだ WinSCP のバグだと思いますが、回避策を見つけました。データベースのテーブルから情報を取得した場合にのみ発生し、ハードコードされた文字列を入力した場合には発生しないことに気付きました. & vbNullStringそのため、空白の文字列を連結し、データ型を a から a に変更する をField追加しましたStringが、今ではもう発生しません。

于 2013-10-16T05:36:21.047 に答える