|
2016/11/05(Sat) 19:13:29 編集(投稿者) 2016/11/05(Sat) 19:13:19 編集(投稿者) 言葉足らずでした、すみません
まず、dimする変数について、から突っ込んで話すと cn,rs,catはもちろんNothingするんですけど cat.tables(0)もDIMした変数にとって、nothingします。 あと、コード内のtestもDimしてNothing、宣言と同時に値割り当てはしないです。 げんみつにするなら、Properties("Jet OLEDB:Link Datasource")もDimした変数にとったほうがよいです。
COMを介してアクセスした(できた)ポインタ全部を離せない限り、使用中と判断されて外れないです。 そして離すときも、最初に宣言したものを最後に、 つまりスタックしてポップするイメージの順番でNothingしていきます。
COMはさむとメンドイんですよねorz うまくいくときはさくっとうまくいくのですが、つかまれちゃうと関係した変数全部Nothingの勢いで つぶしていかなくてはならない、というのが私の経験上のお話です。
■No81740 (となかい さん) に返信 > レスありがとうございます! > すいません、簡潔に書こうといろいろ省きましたが、確実な DimのNothingは行っているのです。 > 昔はこんなことなかったのですが、ActiveX Data Objectのバージョンで何か仕様が変わったのかなと思いましたが; > > 不思議なことにProperties("Jet OLEDB:Link Datasource").Valueでこの値を見なければCloseできるのですが、(ロックも外れる) > この値を取得したとたんCloseが効かなくなるのです。 > > 別の手段とかあればよいのですが・・ > > > ■No81737 (かたぎり さん) に返信 >>なつかしー、旧ADODB系とか、ADOXとか。 >> >>は、おいといて。 >>件のADOXなんですが、このクラスはCOMオブジェクト、と呼ばれるものに分類されてたと記憶してます。 >>つまり、きちんとDim句で変数を割りあてて、そのあと責任をもって、その変数をNothingする必要があるんです。 >> >>なので、 >>Dimした後で、Newする前にTry-catchでくるんで、Finallyで確実にDimした変数をNothingしてみてください。 >>こうすることで、プロセスがそのCOMへのアクセスを終了しました、とOSに通知できるのでOSからAccessにldb外していいよ、と通知するはず。 >> >>プロセスが終了するとldbが外れるのは、それが理由だと思います。 >> >>ためしてみてやってください。 >> >> >>■No81734 (となかい さん) に返信 > >>2016/11/04(Fri) 17:25:16 編集(投稿者) > >>2016/11/04(Fri) 17:25:13 編集(投稿者) > >> > >>VB.NETでADOを使って、MDBデータベースファイルに接続しているのですが、 > >> > >>Dim cn As ADODB.Connection > >>Dim rs As ADODB.Recordset > >>Dim ca As ADOX.Catalog > >> > >>cn = New ADODB.Connection() > >>cat= New ADOX.Catalog > >> > >>cn.ConnectionString = 接続文字列 > >>cn.Open() > >>cat.ActiveConnection = cn > >> > >>こんな感じでカタログを用意した後、 > >> > >>Dim test as String = cat.Tables(0).Properties("Jet OLEDB:Link Datasource").Value > >> > >>このようにテーブルの中の「Jet OLEDB:Link Datasource」の値を見ようとすると > >>接続しているDBが、その後Close()で閉じても実行ファイルが読み込んだDBを開いたままで > >>ロックしっぱなしの状態になってしまいます。(.ldbファイルが残って消せない) > >>実行ファイルを落とすとldbが消え、ロックが外れるのですが、 > >>Close()でロックを解除するにはどうすればよいのでしょうか。 > >>
|