Перечислять индексы в таблице модуля расширяемого хранилища (ESENT) - PullRequest
6 голосов
/ 25 февраля 2010

Фон

Я пишу адаптер для ESE для .NET и LINQ в проекте Google Code под названием eselinq . Одна важная функция, которую я не могу понять, это как получить список индексов, определенных для таблицы. Мне нужно иметь возможность перечислять доступные индексы, чтобы часть LINQ могла автоматически определять, когда индексы можно использовать. Это позволит гораздо более эффективно планировать запросы пользователей, если будут найдены соответствующие индексы.

Есть две связанные функции для запроса информации индекса:

  • JetGetTableIndexInfo - получить информацию индекса по tableID
  • JetGetIndexInfo - получить информацию индекса по tableName

Они отличаются только тем, как указана связанная таблица (имя или идентификатор таблицы). Похоже, что они будут поддерживать функцию, которую я хочу, но все информационные уровни, кажется, требуют, чтобы у меня уже был определенный индекс для запроса информации. Единственное исключение - JET_IdxInfoCount, но при этом учитывается только количество индексов.

JET_IdxInfo с его JET_INDEXLIST звучит правдоподобно, но в нем перечислены только столбцы с определенным индексом.

Альтернативы

Мне известно, что я мог бы получить информацию об индексе другим способом, например, аннотации к типам .NET, соответствующим таблицам базы данных, или требуя, чтобы отображение индекса было предоставлено заранее. Я думаю, что реализовано достаточно интроспекции, чтобы все остальное работало «из коробки» без предоставления пользователем дополнительной информации, кроме этой одной функции.

Другим вариантом может быть проверка системных таблиц для поиска связанных индексных объектов, но это будет зависеть от недокументированного интерфейса.

Чтобы ответить на этот вопрос, мне нужен поддерживаемый метод перечисления индексов (достаточно только имени) для таблицы.

1 Ответ

6 голосов
/ 27 февраля 2010

Вы правы насчет JetGetTableIndexInfo и JetGetIndexInfo и JET_IdxInfo. Суть в том, что данные возвращаются в несколько сложной форме: возвращается временная таблица, содержащая строку для индекса и затем строку для каждого столбца в таблице. Чтобы просто получить имена индексов, вам нужно пропустить строки столбцов (количество столбцов определяется значением столбца columnidcColumn в первой строке).

Для примера .NET, как расшифровать это, посмотрите на проект ManagedEsent . В файле MetaDataHelpers.cs есть метод GetIndexInfoFromIndexlist, который извлекает все данные из временной таблицы.

...