タイトル : Re: MS-ACCESSの解放が出来ません 投稿日 : 2016/02/02(Tue) 19:03 投稿者 : 魔界の仮面弁士
> VB6.0からVB2005への変換挑戦中の鈴木です ご存知とは思いますが、VS2005 は、 2011/04/12 メインストリームサポート終了 2016/04/12 延長サポート終了 ということで、あと数ヶ月でサポート終了となる製品です。 2005 への変換と併せて、現行バージョンへの移行計画も 準備しておくことをお奨めします。 > MS-ACCESS(2003)の停止が出来なく困ってしまいました DAO の参照設定が、PIA 版であることを確認しておいてください。 http://www.gizcollabo.jp/vbtomo/boards/vbqanda.php?do=spread&num=15630 なお、上記にも書いていますが、移行作業とはいえ、DAO の継続利用は 個人的にはお奨めしていません。とはいえ今回は DML ではなく DDL の操作なので、 DAO (または ACEDAO) を使うのも已む無しですかね。 > 記事NO.6555を見て.FIELDSを扱うのは解放が難しいと (全角半角、大文字小文字の使い分けは適切に) > DAODBEngine_definst これは UpgradeSupport で提供される、DAO.DBEngine 型の変数ですね。 > TDFNEW = DB.TableDefs.Item("DBDATA") > For CC = 0 To TDFNEW.Fields.Count - 1 > If TDFNEW.Fields(CC).Name = "A区分" Then ActiveX (COM) のオブジェクトを用いる場合、基本的には 「.」が二回続く記述は NG だと思ってください。解放されにくくなります。 かわりに、コレクションオブジェクトを変数に受けて tblDefs = DB.TableDefs tblNew = tblDefs("DBDATA") flds = tblNew.Fields fld = flds(CC) のように扱うようにします。 そして、そのインスタンスがもう使われなくなった場合には、 ReleaseComObject メソッド(今回は MRComObject ですね)を呼び出してください。 ReleaseComObject に渡さなかったオブジェクトは解放が遅れることになります。 また、COM オブジェクトに対して With ステートメントを 利用することもお勧めしません。 それと、今回は使用されていないので問題ないのですが、 For Each も避けるようにしてください。For Each を使うと、 裏で IEnumerator のインスタンスが生成されることになるので、 使用するライブラリによっては、解放が難しくなるためです。 > AppendDeleteField(TDFNEW, "APPEND", "A区分", dao.DataTypeEnum.dbText, 1) ちなみに「dao.DataTypeEnum.dbText」でも「.」が複数記載されていますが、 こちらはプロパティやメソッドのための「.」ではなく、 名前空間名.列挙型名.列挙値名 であるため、「.」が複数あっても大丈夫です。 (そもそも、列挙型の値は ReleaseComObject の対象とはならないため) |