0

ファイル ハンドルを開いたままにしておく ADOX ライブラリで問題が発生したことはありますか?

VB6 -> VB.Net 変換で奇妙な問題が発生しています。ADOX を使用して特定のデータベース内のテーブルを調べ、自動インクリメント プロパティを true に設定して、そのテーブル内の列のシード値をリセットする関数があります。

「col.Properties("Autoincrement").Value」の呼び出しまで問題を追跡しました。このコード行がコメント アウトされている場合、関数の最後で ADO 接続と ADOX 接続の両方を閉じたときに、ファイル ハンドルが適切に終了します。その行をそのままにしておくと、呼び出しを閉じてガベージ コレクションを強制しても、ハンドルは開いたままになります。

オブジェクトを閉じる方法は次のとおりです。

System.Runtime.InteropServices.Marshal.ReleaseComObject(adoConn)  
Dim connection As ADODB.Connection = cat.ActiveConnection  
If Not connection Is Nothing Then  
   connection.Close()  
End If  
cat.ActiveConnection = Nothing  
cat = Nothing  

adoConn は ADO 接続、cat は ADOX.Catalog オブジェクトです。col (以前から) は、カタログ オブジェクトで使用される ADOX.Column オブジェクトです。

私は当初、このアルゴリズムを ADO.Net を使用するように変換しようとしましたが、DataSet オブジェクトを使用して近づきましたが、テーブルの列が自動インクリメントに設定されているかどうかを判断する方法を理解できませんでした。これは Access 2000 データベースの場合です。

4

1 に答える 1

1

ADOX を使用してデータベースを作成した後、ロックファイルが残るという問題がありました。接続が閉じられていること、およびロックファイルがどのプログラム リソースによっても使用されていないことを確認すると、役立つ場合があります。

System.Runtime.InteropServices.Marshal.ReleaseComObject(adoConn)

Dim connection As ADODB.Connection = cat.ActiveConnection

If Not connection Is Nothing Then
  connection.Close()   
End If   

'Try adding this below
System.Runtime.InteropServices.Marshal.ReleaseComObject(connection)
System.Runtime.InteropServices.Marshal.ReleaseComObject(cat)
GC.Collect()

cat.ActiveConnection = Nothing   
cat = Nothing 
于 2012-01-11T19:38:46.717 に答える