0

顧客 EDB データベースのテーブルのプライマリ インデックス内をシークしようとしています。そして私は惨めに失敗します。JetGetIndexInfoを使用してインデックス情報を取得し、インデックスについてすべて知っています (これはプライマリ インデックスであり、使用されている列はわかっています)。パフォーマンスを最大化するために、既知の値と既存の値のインデックスをシークしたいのですが、JetSeekは、検索したいキーを見つけることができないと主張しています。

現在、インデックス キーをダンプする方法を探しています。そうすれば、使用しているキーに何かを追加する必要があるか、何らかの方法で変換する必要があるかを確認できます (それが正しいキーであると確信しています)。または、何が問題なのかを見つけるための別のトリックはありますか?

失敗の原因と思われる詳細の 1 つは、 MSysObjectsテーブルのKeyFldIDs列のエントリである可能性があります。特定のインデックスには、いくつかのエントリがあります。自分でインデックスを作成した場合、そのフィールドは通常空白です。それは何をするためのものか?


UPDATE @Laurion: データベースで dbutil を実行できました。関連する抜粋は次のとおりです。

AdditionalData
AttId
    Coltyp:     Binary
    Columnid:   2.147.483.777
    Max length: 8
    Grbit:      None
MsgFolderIndex6
    Grbit:          IndexUnique, IndexPrimary
    CultureInfo:    en-US
    CompareOptions: IgnoreCase, IgnoreKanaType, IgnoreWidth
        AttId
            Coltyp:      Binary
            IsAscending: True
            IsASCII:     False
4

1 に答える 1

1

そのインデックスでは、次の一連の呼び出しが機能するはずです。

JetOpenTable(...)
JetMakeKey(sesid, tableid, pvData, cbData, JET_bitNewKey);
JetSeek(sesid, tableid, JET_bitSeekEQ);

インデックス キーをダンプする場合は、次のようにします。

JetOpenTable(...);
Use JetGetTableColumnInfo to get the ID of the column called "AttId"
Use JetMove to walk the table sequentially, retrieving and dumping the column values

最も可能性の高いエラーは、キーを作成するときに間違った cbData 値を渡していることです。おそらく、オフ バイ ワン エラー、または sizeof() の問題です。

于 2011-07-20T20:03:55.860 に答える