掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DaoにてTable作成 (ID:141529)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>>> Dim tbl As New DAO.TableDef >>> tbl = db.createtabledef("Table") >> 変数宣言部で「New」して、tbl のインスタンスを生成しているのに、 >> それを(破棄せずに)捨てて、別のインスタンスを代入しようとしています。 > とは、どういうことでしょうか? そのコードが、2 点の問題を抱えているということです。 最初の変数宣言部において、 > Dim tbl As New DAO.TableDef と書かれていましたが、このコードは Dim tbl As DAO.TableDef = New DAO.TableDef() の省略表記にあたります。ここまではよろしいでしょうか。 つまり、この時点で TableDef のインスタンス(仮に tbl1 とします)が New キーワードによって生成され、それが変数 tbl に代入されています。 しかし、その tbl1 は一度も使われる事なく、その後で、 > tbl = db.createtabledef("Table") を行われ、変数 tbl に別のインスタンス(仮に tbl2) が代入されていますね。 tbl2 が代入された事により、元の tbl1 が参照されなくなります。 ならば、そもそも tbl1 を作成する必要が無いということになります。 すなわち、 Dim tbl As New DAO.TableDef ではなく、 Dim tbl As DAO.TableDef と書くべきであったという事です。これが1つ目の問題点です。 もう一つの問題点は、破棄作業の欠落です。 COM オブジェクト(ActiveX)は、.NET のマネージオブジェクトとは 管理方法が異なるため、利用した後は、それぞれのオブジェクトに対し、 If tbl IsNot Nothing AndAlso Marshal.IsComObject(tbl) Then Marshal.ReleaseComObject(tbl) End If といった破棄処理を行う事が要求されます。 しかし元のコードでは、変数 tbl が指しているのは既に tbl2 に 切り替わってしまったため、tbl1 を破棄する事ができないため、 使用していた COM オブジェクトの参照を明示的に破棄できません。 これが第2の問題点です。 > tbl.Fields.Append(fld) そして、これも本来は NG です。 Fields プロパティが返すのは、DAO.Fields 型の COM オブジェクトなので、 これも解放対象となりえるからです。 ゆえに本来は Dim fs As DAO.Fields = tbl.Fields fs.Append(fld) If Marshal.IsComObject(fs) Then Marshal.ReleaseComObject(fs) End If If Marshal.IsComObject(fld) Then Marshal.ReleaseComObject(fld) End If db.Close() If Marshal.IsComObject(db) Then Marshal.ReleaseComObject(db) End If WS.Close() If Marshal.IsComObject(WS) Then Marshal.ReleaseComObject(WS) End If If Marshal.IsComObject(DE) Then Marshal.ReleaseComObject(DE) End If のようにして、それぞれの参照カウントを減ぜねばなりません。 > 魔界の仮面弁士さんのソースを参考にしています。 そのソースには、Marshal.ReleaseComObject の呼び出しも含めてあります。 > fld = tbl.CreateField("Field", 4) これは、"Field" という名前の長整数型の列を作成している所ですよね。 「4」などのマジックナンバーを利用するのではなく、 DAO.DataTypeEnum.dbLong などを利用すべきかと。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.