[BlueLeaf1336]> PROGRAM> Natural Born Junk>

DAO36調査-1

historyTOP

2003/01/21:作成(参考:MSDNライブラリ)

overviewTOP

DelphiでMDBにつなぎたくなったらどうしますか?インターネットで調べますか? ..当たりです。なんぼでも情報があります。

そこを敢えて。というか、コレクションとオブジェクトの世界をぐるぐるとループで回したくて仕方がなくなったというか。 というわけで、Accessにサンプルでついてくるでかいmdbをループでぐるぐる回してみることにします。

DBEngineオブジェクトの眷属たちTOP

DAOモデルの構造を調べました。■はこのページで触ったものをあらわしています。

■DBEngineオブジェクトWorkspacesコレクション
  │  └Workspaceオブジェクト
  │      └Connectionsコレクション
  │          └Connectionオブジェクト
  │          │  └QueryDefsコレクション
  │          │  │  └QueryDefオブジェクト
  │          │  │      └Parametersコレクション
  │          │  │      │  └Parameterオブジェクト
  │          │  │      └Fieldsコレクション
  │          │  │          └Fieldオブジェクト
  │          │  └Recordsetsコレクション
  │          │      └Recordsetオブジェクト
  │          │          └Fieldsコレクション
  │          │              └Fieldオブジェクト
  │          └Databasesコレクション
  │          │  └■Databaseオブジェクト
  │          │      └■TableDefsコレクション
  │          │      │  └■TableDefオブジェクト
  │          │      │      └Fieldsコレクション
  │          │      │      │  └Fieldオブジェクト
  │          │      │      └Indexesコレクション
  │          │      │          └Indexオブジェクト
  │          │      │              └Fieldsコレクション
  │          │      │                  └Fieldオブジェクト
  │          │      └Containersコレクション
  │          │      │  └Containerオブジェクト
  │          │      │      └Documentsコレクション
  │          │      │          └Documentオブジェクト
  │          │      └QueryDefsコレクション
  │          │      │  └QueryDefオブジェクト
  │          │      │      └Parametersコレクション
  │          │      │      │  └Parameterオブジェクト
  │          │      │      └Fieldsコレクション
  │          │      │          └Fieldオブジェクト
  │          │      └Recordsetsコレクション
  │          │      │  └Recordsetオブジェクト
  │          │      │      └Fieldsコレクション
  │          │      │          └Fieldオブジェクト
  │          │      └Relationsコレクション
  │          │          └Relationオブジェクト
  │          │              └Fieldsコレクション
  │          │                  └Fieldオブジェクト
  │          └Groupsコレクション
  │          │  └Groupオブジェクト
  │          │      └Usersコレクション
  │          └Usersコレクション
  │              └Userオブジェクト
  │                  └GroupsコレクションErrorsコレクションErrorオブジェクト

DBEngineオブジェクト・DatabaseオブジェクトTOP

Delphiで、mdbファイルにアクセスするには、次のようにします。

uses
    ComObj, Variants;

var
    daoDBEngine: Variant; //DBEngineオブジェクト
    daoDatabase: Variant; //Databaseオブジェクト(ですかね?)

(*
    =============================================
    procedure OpenMdb();
    =============================================
*)
procedure OpenMdb();
begin
    daoDBEngine := CreateOleObject('DAO.DBEngine.36');
    daoDatabase := daoDBEngine.Workspaces[0].OpenDatabase('ADDRBOOK.MDB',False, False);
end;

Delphi6では、Variant型がVariantsユニットにあるのでusesします。それから、CreateOleObjectを使うためにComObjユニットが必要です。 基本的に、全部呪文のようなものだと思ってますが、OpenDatabaseメソッドについてちょっと調べてみましょう。

構文

Set database = workspace.OpenDatabase (dbname, options, read-only, connect)

指定項目

database開くDatabaseオブジェクトを表すオブジェクト変数を指定
workspace(省略可能)データベースを含める既存のWorkspaceオブジェクトを表すオブジェクト変数を指定。引数workspaceが値を持たない場合、既定のワークスペースを使用
dbname既存のJetデータベースのファイル名
options(省略可能)True:排他モード。False:(既定値)共有モード
read-only(省略可能)サブデータベースを読み取り専用権限で開く場合は、Trueが設定され、読み取り/書き込み権限で開く場合は、False が設定される
connect(省略可能)パスワードを含むさまざまな接続情報を示すサブタイプが文字列型 (String) であるバリアント型 (Variant) を指定

ということですんで、(EXEの起動フォルダーの中の)'ADDRBOOK.MDB'を、共有モードで読み書きモードで開いてるわけですね。 なんかすっきりしました。

TableDefsコレクション・TableDefオブジェクトTOP

データベースといえばテーブルです。 なので、テーブル定義(TableDefineの略じゃないかと勝手に思ってるんですが)を調べます。 以前、MDBのテーブル定義を取り出す方法がわからなくて弱ったことがありましたので、 うまくいけばそんなんもいけるといいなあと思っています。 このオブジェクトには今まで触ったことがないので、型だけ調査しておきます。

TableDefsコレクション
プロパティCountコレクションが持つオブジェクト数。整数型(Integer)。

TableDefオブジェクト
プロパティ Attributes長整数型(Long)の定数の組み合わせ(※1参照)
ConflictTable文字列型(String)
Connect文字列型 (String)
DateCreatedサブタイプが日付/時刻型(Date/Time)であるバリアント型(Variant)
LastUpdatedサブタイプが日付/時刻型(Date/Time)であるバリアント型(Variant)
KeepLocalテキスト型(Text)
Name文字列型(String)
RecordCount長整数型(Long)
Replicableテキスト型(Text)
ReplicaFilter文字列型(String)またはブール型(Boolean)
SourceTableName文字列型(String)
Updatableブール型(Boolean)
ValidationRule文字列型(String)
ValidationText文字列型(String)
コレクション FieldsFieldコレクション
IndexesIndexコレクション

(※1)TableDef.Attributes
dbAttachExclusiveJetDBエンジンを使用するDBで、排他モードで開いたリンクテーブル。
dbAttachSavePWDJetDBエンジンを使用するDBで、リモートテーブルに対するユーザーIDとパスワードは接続情報と共に保存される。
dbSystemObjectJetDBエンジンによって提供されるシステムテーブル。
dbHiddenObjectJetDBエンジンによって提供される非表示のテーブル。
dbAttachedTableJetDBやParadoxなどの非ODBCデータソースのリンクテーブル。
dbAttachedODBCMicrosoftSQLServerなどのODBCデータソースのリンクテーブル。

ここまできて、Propertiesコレクションに気づきました。 これは、

ConnectionオブジェクトとErrorオブジェクトを除くすべてのDAOオブジェクトは、Propertiesコレクションを1つずつ持っており、その中には一定の組み込みのPropertyオブジェクトが含まれています。 オブジェクトのPropertiesコレクションを使用して、オブジェクトの組み込みプロパティとユーザー定義のプロパティを列挙することができます。ただし、不適切な状況でプロパティの読み取りや書き込みをしようとすると、エラーが発生します。

と書いてある。必死こいてプロパティを調べんでも、オブジェクト名さえわかれば列挙できてたわけです。ただ、型名がわからないとVariantで受けることになって気持ち悪いことは悪いのですが。とりあえずTableDefについては、プロパティの型名まで調べましたので、これをつかって、ループをまわしたいと思います。

PropertiesコレクションTOP

覚えているうちにPropertiesの構造を調べておきます。

All DAO Objects
  └PropertiesコレクションPropertyオブジェクト

昨日は、せっかく調べたからと書きましたが、やっぱりループでまわすには、Propertiesコレクション使わないとだめな気がしてきました。 ですので、TableDefs、TableDefのときと同じように、PropertiesコレクションとPropertyオブジェクトのプロパティ(変ですが)に付いて型を調べるとこんな感じになります。

Propertiesコレクション
プロパティCountコレクションが持つオブジェクト数。整数型(Integer)。

Propertyオブジェクト
プロパティ Inheritedブール型(Boolean)
Name文字列型(String)
Type操作の種類やデータ型を示す定数(※2参照)
ValueオブジェクトのTypeプロパティで指定しているデータ型に対応する値となるバリアント型(Variant)

不適切な条件のもとでValueプロパティを設定または返そうとすると、トラップ可能なエラーが発生します。ということなので、覚えておきましょう。

(※2)Property.Type
dbBigIntBig Integer 型 (Big Integer)
dbBinaryバイナリ型(Binary)
dbBooleanブール型(Boolean)
dbByteバイト型(Byte)
dbCharCHAR型(Char)
dbCurrency通貨型(Currency)
dbDate日付/時刻型(Date/Time)
dbDecimal10進型(Decimal)
dbDouble倍精度浮動小数点数型(Double)
dbFloat浮動小数点数型(Float)
dbGUIDGUID型(GUID)
dbInteger整数型(Integer)
dbLong長整数型(Long)
dbLongBinaryロングバイナリ型(LongBinary)-OLEオブジェクト型(OLE Object)
dbMemoメモ型(Memo)
dbNumericNumeric型(Numeric)
dbSingle単精度浮動小数点数型(Single)
dbTextテキスト型(Text)
dbTime時刻型(Time)
dbTimeStampタイムスタンプ型(TimeStamp)
dbVarBinary可変長バイナリ型(VarBinary)

TableDefsコレクションをループでまわそうTOP

さて、やっと準備がそろったような感じがするので、記念すべき第1回目のループをまわしたいと思います。 何をまわすかですが、[TableDefsコレクション]でいこうかと思います。 といっても、TableDefsコレクションのプロパティは[Count]しかないので面白くも何ともないんですが。 早い話、TableDefsコレクションのループは、TableDefを取り出すためにあるようなもんです(勝手)。

一瞬Propertiesコレクション使ってみようと思って速攻で間違いだと気づいたんですが、PropertiesコレクションはすべてのDAOオブジェクトが持っているコレクションなので、コレクション(今の話ではTableDefs)は、持ってないですね。試してないですが。なので、Propertiesコレクションは、もうちょっとだけ後です。

そういうわけでTableDefsでループいってみましょう。

var
    i: integer;
begin
    for i := 0 to daoDatabase.TableDefs.Count - 1 do
    begin
        //something to do
    end;
end;

これだけです。あまりに面白くないですが。最適化されてループも回らないんじゃないかといううわさもあります。 念のため、daoDatabaseは、このページのはるか上のほうで宣言したDatabaseオブジェクト用の変数です。

次いってみましょう。

TableDefオブジェクトをループでまわそうTOP

すぐ上では、TableDefsコレクションを軽くループでまわしました。 さっきはループの中では何もしませんでしたが、daoDatabase.TableDefs[i]とするとこれがTableDefオブジェクトになります。 そして、ココからが重要なのですが、TableDefオブジェクトはPropertiesコレクションを持っていますので、さらにループをまわすことができます。 いってみましょう。

var
    i, j: integer;
begin
    for i := 0 to daoDatabase.TableDefs.Count - 1 do
    begin
        for j := 0 to daoDatabase.TableDefs[i].Properties.Count - 1 do
        begin
            //something to do
        end;
    end;
end;

PropertiesコレクションもやはりプロパティにCountしか持ってませんので、処理を何も記述しないと面白くありません。 が、徐々にチョボ連結がかなり長くなってきましたので、整理しておきます。

daoDatabaseDatabaseオブジェクト
daoDatabase.TableDefsTableDefsコレクション
daoDatabase.TableDefs[i]TableDefオブジェクト
daoDatabase.TableDefs[i].PropertiesTableDefオブジェクトのPropertiesコレクション

です。Propertiesコレクションは、object.Properties[j]とすることで、Propertyオブジェクトを取り出すことができます。 やってみましょう。

var
    i, j: integer;
begin
    for i := 0 to daoDatabase.TableDefs.Count - 1 do
    begin
        for j := 0 to daoDatabase.TableDefs[i].Properties.Count - 1 do
        begin
            Memo1.Lines.Add(daoDatabase.TableDefs[i].Properties[j].Name);
        end;
    end;
end;

とりあえず.Name(プロパティの名称)を使ってみました。 これで、現在開いているデータベースの中の全テーブルのプロパティの一覧名称が表示できます。 上でまとめていますが、propertyオブジェクトには、Inherited・Name・Type・Valueの4つのプロパティがありますので、それぞれを取り出してみることにします。 ただ、Valueの取出しには、エラー発生がありえるので注意しろということですので、エラーを無視するようにしておきます。 といっても、文字列型の.Nameのようにはいきません。 とりあえず簡単そうな、.Inherited(Boolean)と.Name(string)でやって、残りは考えることにしましょう。

var
    i, j: integer;
begin
    for i := 0 to daoDatabase.TableDefs.Count - 1 do
    begin
        for j := 0 to daoDatabase.TableDefs[i].Properties.Count - 1 do
        begin
            try
                Memo1.Lines.Add(
                    BoolToStr(daoDatabase.TableDefs[i].Properties[j].Inherited, True) + ' : '
                    + daoDatabase.TableDefs[i].Properties[j].Name + ' : '
                    + VarTypeAsText(daoDatabase.TableDefs[i].Properties[j].Type) + ' : '
                    + VarToStr(daoDatabase.TableDefs[i].Properties[j].Value)
                );
            except
                on E:Exception do
                begin
                    Memo1.Lines.Add(Format('%d : %s', [i, E.Message]));
                end;
            end;
        end;
    end;
end;

基本的にVariant型なんですが、わかる範囲で変換しようとしている努力が見受けられるかと思います。 一応言い訳しますと、.InheritedはBooleanだとわかっているので、Trueを"True"、Falseを"False"という文字列に変換してくれる関数を使用しています。それから、VarTypeAsTextは、「Varなんとか」でコード補完したときに、それっぽい名称の関数が出たので使ってみました。VarToStrも同じ理由です。

実行結果の一部はこんな感じです。..しかしめちゃくちゃ遅いです。3回ぐらいとまってんちゃうか?と思って止めてしまいました。

-------------------------------------------------------
i := 0
-------------------------------------------------------
False : Name            : Variant   : MSysAccessObjects
False : Updatable       : Null      : True
False : DateCreated     : OleStr    : 1999/03/09 16:47:56
False : LastUpdated     : OleStr    : 1999/03/09 16:47:59
False : Connect         : Variant   :
False : Attributes      : Single    : 2
False : SourceTableName : Variant   :
False : RecordCount     : Single    : 223
False : ValidationRule  : Variant   :
False : ValidationText  : Variant   :
False : ConflictTable   : Variant   :
False : ReplicaFilter   : Variant   :
-------------------------------------------------------
i := daoDatabase.TableDefs.Count - 1
-------------------------------------------------------
False : Name            : Variant   : TMP_インポート
False : Updatable       : Null      : True
False : DateCreated     : OleStr    : 1999/02/03 18:06:53
False : LastUpdated     : OleStr    : 1999/02/03 18:06:54
False : Connect         : Variant   :
False : Attributes      : Single    : 0
False : SourceTableName : Variant   :
False : RecordCount     : Single    : 0
False : ValidationRule  : Variant   :
False : ValidationText  : Variant   :
False : ConflictTable   : Variant   :
False : ReplicaFilter   : Variant   :
False : Orientation     : Smallint  : 0
False : OrderByOn       : Null      : False
False : NameMap         : Boolean   : ??
-------------------------------------------------------

最初と最後でプロパティの数が違うのが気持ち悪いですが、名前からして、システムテーブルとユーザテーブルの違いということにしておきます。でも、思っていたよりもそれっぽいのが表示されているようです(エディタで整形しています)。 ただ、Attributesに関しては、ページの上の方で調べた定数の組み合わせを取り出してもよさそうな気がします。 それから、プロパティオブジェクトの.Typeについても、表にまとめたような形でわかるとうれしいので、やってみようと思います。

TableDefオブジェクトをループでまわそう - その2(TableDef.Attributes)TOP

上で使った、VarTypeAsTextですが、これって何でしょう? ヘルプに載ってないし、ネットで調べてもほとんどつかまりません。 外国の人が個人的に作ったユニットの中に関数として使ってあったのが見つかったぐらいです。 何で使っているDelphiで使えるんでしょう?

さて、TableDef.Attributesは、Long型の定数の組み合わせということなので、次のようにして取り出せるはずです。

(*
    =============================================
    function TableDefAttrToStr(Attr: Long): string;
    =============================================
*)
function TableDefAttrToStr(Attr: Long): string;
begin
    Result := '';
    if (Attr and dbAttachExclusive) <> 0 then Result := Result + ',dbAttachExclusive()';
    if (Attr and dbAttachSavePWD)   <> 0 then Result := Result + ',dbAttachSavePWD';
    if (Attr and dbSystemObject)    <> 0 then Result := Result + ',dbSystemObject';
    if (Attr and dbHiddenObject)    <> 0 then Result := Result + ',dbHiddenObject';
    if (Attr and dbAttachedTable)   <> 0 then Result := Result + ',dbAttachedTable';
    if (Attr and dbAttachedODBC)    <> 0 then Result := Result + ',dbAttachedODBC';
    Delete(Result, 1, 1);
end;

..コンパイルエラーでした。「dbAttachExclusiveなんて知らんぞ」と。そういえばあたりまえです。 だーれも宣言してくれていません。 で、ネットで調べたらもろ表にまとめてくれているページがあったんですが、なんか悔しいのでDelphi-MLの過去ログを調べてみると、

タイプライブラリの取り込みでユニットを作成して

という記述を見つけました。 とはいえここまでやってきて、タイプライブラリを使ってしまうのも再び悔しいので、必要になった定数だけもらうことにします。 そのぐらいだったら許すことにします。

プロジェクト(P)--タイプライブラリの取り込み(L)...で、Microsoft DAO 3.6 Object Library (Version 5.0)を選択し、ユニットの作成(U)をすると、一瞬でできました。 悲しくなりましたが、気を持ち直して、TableDef.Attributes関係の定数を探すと、すぐ見つかりました。 次の表にまとめておきます。

dbAttachExclusive$00010000
dbAttachSavePWD$00020000
dbSystemObject$80000002
dbAttachedTable$40000000
dbAttachedODBC$20000000
dbHiddenObject$00000001

これを定数宣言してやればよいということなので、ユニットの最初のほうにでも追加することにします。 ..うまくいきました。一応うまくいったコードを書いておきます。 といっても、上に書いてあるコードとほとんど同じですが、Propertiesコレクションに対して[j]ではなく、['Attributes']としてアクセスしています。この関数の動作を見るのに、他のプロパティが邪魔だったのでこうしています。

var
    i: integer;
begin
    for i := 0 to daoDatabase.TableDefs.Count - 1 do
    begin
        Memo1.Lines.Add(
            daoDatabase.TableDefs[i].Name + ' : '
            + daoDatabase.TableDefs[i].Properties['Attributes'].Name + ' : '
            + <b>TableDefAttrToStr</b>(daoDatabase.TableDefs[i].Properties['Attributes'].Value)
        );
    end;
end;
結果は、
MSysAccessObjects   : dbSystemObject
MSysACEs            : dbSystemObject
MSysCmdbars         : dbSystemObject
MSysObjects         : dbSystemObject
MSysQueries         : dbSystemObject
MSysRelationships   : dbSystemObject
T_グループ          :
T_住所録一般        :
T_住所録勤務先      :
T_住所録家族        :
T_住所録自宅        :
T_名簿              :
T_差出人            :
T_検索条件          :
TMP_インポート      :

となっています(出力結果はエディタで整形しています)。 おそらく普通のテーブルでは、何のAttributesも設定されていないと考えられます(つまり、Attributes=0)。

TableDefオブジェクトをループでまわそう - その3(Property.Type)TOP

それから、Property.Typeも同じやり方で表示するようにします。 上と同じタイプライブラリから抜き出した定数値は次のようになっています。 こっちは、さっきのように定数名(dbAttachExclusive)をそのまま返すのではなく、「メモ型」などのようにわかりやすい名称に変換するようにします。なので、すでに上のほうに示した表に定数値を追加した形で書き直すことにします。

dbBoolean$00000001ブール型(Boolean)
dbByte$00000002バイト型(Byte)
dbInteger$00000003整数型(Integer)
dbLong$00000004長整数型(Long)
dbCurrency$00000005通貨型(Currency)
dbSingle$00000006単精度浮動小数点数型(Single)
dbDouble$00000007倍精度浮動小数点数型(Double)
dbDate$00000008日付/時刻型(Date/Time)
dbBinary$00000009バイナリ型(Binary)
dbText$0000000Aテキスト型(Text)
dbLongBinary$0000000Bロングバイナリ型(LongBinary)-OLEオブジェクト型(OLE Object)
dbMemo$0000000Cメモ型(Memo)
dbGUID$0000000FGUID型(GUID)
dbBigInt$00000010Big Integer 型 (Big Integer)
dbVarBinary$00000011可変長バイナリ型(VarBinary)
dbChar$00000012CHAR型(Char)
dbNumeric$00000013Numeric型(Numeric)
dbDecimal$0000001410進型(Decimal)
dbFloat$00000015浮動小数点数型(Float)
dbTime$00000016時刻型(Time)
dbTimeStamp$00000017タイムスタンプ型(TimeStamp)

これも定数宣言と、変換関数を作ることにします。 属性のように組み合わせるものではないので、case文で分岐させて結果を返すように作ります。

(*
    =============================================
    function PrpertyTypeToStr(Prop: integer): string;
    =============================================
*)
function PrpertyTypeToStr(APropType: integer): string;
begin
    case APropType of
        dbBoolean   : Result := 'ブール型(Boolean)';
        dbByte      : Result := 'バイト型(Byte)';
        dbInteger   : Result := '整数型(Integer)';
        dbLong      : Result := '長整数型(Long)';
        dbCurrency  : Result := '通貨型(Currency)';
        dbSingle    : Result := '単精度浮動小数点数型(Single)';
        dbDouble    : Result := '倍精度浮動小数点数型(Double)';
        dbDate      : Result := '日付/時刻型(Date/Time)';
        dbBinary    : Result := 'バイナリ型(Binary)';
        dbText      : Result := 'テキスト型(Text)';
        dbLongBinary: Result := 'ロングバイナリ型(LongBinary)-OLEオブジェクト型(OLE Object)';
        dbMemo      : Result := 'メモ型(Memo)';
        dbGUID      : Result := 'GUID型(GUID)';
        dbBigInt    : Result := 'Big Integer 型 (Big Integer)';
        dbVarBinary : Result := '可変長バイナリ型(VarBinary)';
        dbChar      : Result := 'CHAR型(Char)';
        dbNumeric   : Result := 'Numeric型(Numeric)';
        dbDecimal   : Result := '10進型(Decimal)';
        dbFloat     : Result := '浮動小数点数型(Float)';
        dbTime      : Result := '時刻型(Time)';
        dbTimeStamp : Result := 'タイムスタンプ型(TimeStamp)';
        else          Result := 'UnKnown(' + IntToStr(APropType) + ')'
    end;
end;

ほとんど同じコードですので、結果も同じ箇所を抜き出すことにします。 違いは、1回目がVarTypeAsText(正体不明。でも、DelphiはVarinants.VarTypeAsTextと表示している)を、2回目がPrpertyTypeToStr(自作)の関数を使用して、型名を取得しているところです。

-------------------------------------------------------
i := 0
-------------------------------------------------------
False : Name            : メモ型(Memo)          : MSysAccessObjects
False : Updatable       : ブール型(Boolean)     : True
False : DateCreated     : 日付/時刻型(Date/Time): 1999/03/09 16:47:56
False : LastUpdated     : 日付/時刻型(Date/Time): 1999/03/09 16:47:59
False : Connect         : メモ型(Memo)          :
False : Attributes      : 長整数型(Long)        : 2
False : SourceTableName : メモ型(Memo)          :
False : RecordCount     : 長整数型(Long)        : 223
False : ValidationRule  : メモ型(Memo)          :
False : ValidationText  : メモ型(Memo)          :
False : ConflictTable   : メモ型(Memo)          :
False : ReplicaFilter   : メモ型(Memo)          :
-------------------------------------------------------
i := daoDatabase.TableDefs.Count - 1
-------------------------------------------------------
False : Name            : メモ型(Memo)          : TMP_インポート
False : Updatable       : ブール型(Boolean)     : True
False : DateCreated     : 日付/時刻型(Date/Time): 1999/02/03 18:06:53
False : LastUpdated     : 日付/時刻型(Date/Time): 1999/02/03 18:06:54
False : Connect         : メモ型(Memo)          :
False : Attributes      : 長整数型(Long)        : 0
False : SourceTableName : メモ型(Memo)          :
False : RecordCount     : 長整数型(Long)        : 0
False : ValidationRule  : メモ型(Memo)          :
False : ValidationText  : メモ型(Memo)          :
False : ConflictTable   : メモ型(Memo)          :
False : ReplicaFilter   : メモ型(Memo)          :
False : Orientation     : バイト型(Byte)        : 0
False : OrderByOn       : ブール型(Boolean)     : False
False : NameMap         : ロングバイナリ型(LongBinary)-OLEオブジェクト型(OLE Object) : ??
-------------------------------------------------------

こんなもんですかね。ここまででテーブル自体の設定値はそこそこ取れています。

このページで使用したソースコードTOP

次は、いよいよテーブル定義(フィールドの構成)に進むことにします。今までは、

daoDatabase.TableDefs[i].Properties[j].XXXXX

でしたが、これがさらに長くなって、

daoDatabase.TableDefs[i].Fields[j].Properties[k].XXXXX

となります。楽しみです。それから、ココまでに記述したソースコードも記念に置いときます。

20030121imdb.zip(3,236bytes)

EOFTOP