Как получить метаданные первичного ключа в ADO.NET 4? - PullRequest
1 голос
/ 24 января 2011

Я пытаюсь получить метаданные первичного ключа для всех таблиц в базе данных, используя ADO.NET 4.

Методы GetSchema () позволяют вам использовать множество метаданных, включая индексы и внешние ключи., но там нет ничего, чтобы идентифицировать первичные ключи.Мне кажется таким вопиющим упущением, что я полагаю, что, должно быть, я что-то упустил!

Из того, что я смог найти, кажется, что есть два «обходных пути» (по крайней мере, для SQL Server).):

  • использовать SqlDataReader ExecuteReader () опция KeyInfo;или
  • используйте метод SqlDataAdapter.Fill (dataTable), а затем используйте свойство KeyInfo в возвращенной таблице dataTable.

Может кто-нибудь подсказать, существует ли чистый стандартный способ идентификации всех первичных ключейв базу данных и получить их метаданные, которые будут работать во всех реализациях провайдера данных (включая Oracle, DB2, MySql)?

Ответы [ 4 ]

2 голосов
/ 24 января 2011

Вы можете получить первичный ключ из information_schema.table_constraints:

select c.constraint_name, c.table_name, k.column_name
from   information_schema.table_constraints as c
join   information_schema.key_column_usage as k
on     c.constraint_catalog = k.constraint_catalog 
       and c.constraint_schema = k.constraint_schema 
       and c.constraint_name = k.constraint_name 
where  c.constraint_type = 'primary key'
       and c.table_name = 'YourTable'
1 голос
/ 25 января 2011

Существует ли унифицированный API для получения всех метаданных (включая информацию о первичном ключе) для всех бэкэндов - ответ «Нет»

В идеале переопределения DbConnection.GetSchema для каждого бэкэнда должны предоставлять различные коллекции для получения всехвозможны метаданные, но, к сожалению, это не так.Обычно я использую следующие подходы в таком порядке

  1. Метод GetSchema с соответствующим набором схем
  2. Системные хранимые процедуры, если они доступны.(sys.sp_primarykeys и т. д.)
  3. Запрос системных представлений (INFORMATION_SCHEMA.KEY_COLUMN_USAGE и т. д.)
  4. Запрос системных представлений с помощью пользовательского запроса, если вся информация недоступна в одном представлении

Для Sql Server 2005 и выше я использовал системную хранимую процедуру - sys.sp_primary_keys_rowset2

При необходимости я предоставлю информацию и для других бэкэндов.

1 голос
/ 24 января 2011

MSDN Страница на GetSchema и коллекция PrimaryKeys.Однако он не работает с SQL Server, как сказано в начале

Некоторые коллекции схем являются неполными, например, SQL Server, который не содержит коллекции для первичных ключей.

Фактически, его чтение подразумевает, что GetSchema не является надежным средством извлечения схемы из базы данных.

Другой вариант, который поддерживается большинством основных СУБД, заключается в запросе information_schema для всех первичных ключей.

select *
from information_schema.TABLE_CONSTRAINTS
where CONSTRAINT_TYPE = 'PRIMARY KEY'

Вы можете присоединить это к KEY_COLUMN_USAGE для столбцов по порядку расположения

select PK.TABLE_SCHEMA, PK.TABLE_NAME, C.ORDINAL_POSITION, C.COLUMN_NAME
from information_schema.TABLE_CONSTRAINTS PK
inner join information_schema.KEY_COLUMN_USAGE C
    on C.TABLE_SCHEMA = PK.TABLE_SCHEMA
    and C.TABLE_CATALOG = PK.TABLE_CATALOG
    and C.TABLE_NAME = PK.TABLE_NAME
where PK.CONSTRAINT_TYPE = 'PRIMARY KEY'

Обратите внимание, что, хотя information_schema имеет хорошую поддержку, она может отличаться небольшими способами.В SQL Server table_catalog (= имя db) всегда ограничивается текущим db, тогда как в MySQL он будет возвращать таблицы из любого каталога (db), поэтому вам может понадобиться фильтр каталога для точности.

0 голосов
/ 21 февраля 2011

Есть библиотека, Kailua - Забытые методы в API ADO.NET., который предоставляет эти и дополнительные метаданные для 5 крупнейших поставщиков.Эта информация зависит от поставщика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...