【问题标题】:Dumping entries of a table index转储表索引的条目
【发布时间】:2011-07-15 15:41:00
【问题描述】:

我正在尝试在客户 EDB 数据库上的表的主索引中查找。我失败得很惨。我使用 JetGetIndexInfo 检索了索引信息,并且了解索引的所有信息(它是主索引,我知道所使用的列)。现在我想在该索引上寻找已知值和现有值以最大化性能,但 JetSeek 声称它找不到我想要搜索的键。

现在我正在寻找一种方法来转储索引键。这样我就可以看到是否应该在我正在使用的密钥中添加一些东西或以某种方式对其进行转换(我绝对确定它是正确的密钥)。还是有其他技巧可以找出问题所在?

可能是我失败原因的一个细节可能是 MSysObjects 表中 KeyFldIDs 列中的条目。特定的索引在那里有一些条目。如果我自己创建索引,该字段通常为空白。它有什么作用?


更新 @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

【问题讨论】:

  • 两个问题: 1. JetGetIndexInfo 说的关键列是什么? 2. JetMakeKey 和 JetSeek 怎么称呼?
  • 1.只有一个键列。这是一个主索引。 2. 我只需使用 JET_bitMoveFirst 调用 JetSetCurrentIndex2,然后使用已知且现有的密钥(我从表转储中获得)和 JET_bitNewKey 调用 JetMakeKey,最后使用 JET_bitSeekGE 调用 JetSeek。
  • 另一件可能很重要的事情是该列的类型为 JET_coltypBinary。我从另一个表中读取条目并在另一个表的索引中查找以检索额外信息。但是我不会随时更改 KeyValue。
  • 我刚刚发现的另一件事是JET_INDEXLIST的columnidcKey为0。这是否意味着尽管索引存在但它不包含键值?如果是真的,这怎么可能?我可以肯定地看到表中的记录是根据特定的索引(或列)排序的。
  • 现在我很困惑。关于我之前的评论,在我自己创建的表上调用 JetGetIndexInfo 时,我的 columnidcKey 和 columnidcEntry 也为 0,并且知道它包含数百条记录并且 JetSeek 工作正常。

标签: database esent edb


【解决方案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() 问题。

【讨论】:

  • 非常感谢!我又看了一遍,你对 cbData 的看法是对的。少了一个字节!
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 2019-07-21
  • 2011-12-03
  • 2016-08-26
  • 1970-01-01
  • 2014-03-03
  • 2021-10-02
  • 2011-01-18
相关资源
最近更新 更多