ADO.NET GetOleDbSchemaTable - PullRequest
       27

ADO.NET GetOleDbSchemaTable

2 голосов
/ 12 марта 2012

Я пытаюсь заполнить коллекцию DataRelation информацией, считанной из базы данных.

DataTable schemaTable =
    oleconnection.GetOleDbSchemaTable(
        OleDbSchemaGuid.Foreign_Keys,
        new object[] { null, null, tablename });

Но эта информация ничего не говорит о том, является ли это реальным ограничением внешнего ключа или просто отношением, и из-за этого я не знаю, какое значение установить для четвертого параметра конструктора DataRelation (createConstraints).

public DataRelation(
    string relationName,
    DataColumn[] parentColumns,
    DataColumn[] childColumns,
    bool createConstraints
)

В частности, в MS Access можно связать две таблицы с отношением, но не применять проверку целостности данных. Некоторые дополнительные исследования показали, что такие неисполненные отношения появляются и в таблице схемы OleDbSchemaGuid.Referential_Constraints.

Мне интересно, где я могу получить необходимую информацию. Пожалуйста, покажи мне путь.

Ответы [ 2 ]

3 голосов
/ 16 июня 2012

Невозможно получить дополнительные атрибуты, связанные с отношением в MSAccess, используя Ado.Net.Это было возможно только в VBA с использованием DAO.

Все отношения и их дополнительные атрибуты хранятся в таблице MSysRelationships в каждой версии ms-доступа.Поле grbit содержит значения для всех возможных атрибутов отношения, таких как Enforce Referential Intigrity, Cascade Delete, Cascadde Update.Другие поля этой таблицы не требуют пояснений и совпадают с полями, возвращаемыми методом GetOleDbSchemaTable.

Некоторые полезные вычисления для Grbit:

  • Это означает, что существует отношение один к одномуи Enforce Referential Intigrity включено, тогда Grbit будет 0.
  • Это означает, что если есть отношение один к одному, а Enforce Referential Intigrity выключено, тогда Grbit будет 3.
  • Это означает, что если естьотношение один ко многим и Enforce Referential Intigrity отключено, тогда Grbit будет равен 2.
  • Это означает, что если отношение один-ко-многим и Enforce Referential Intigrity включено, то Grbit будет 0.

Пример кода для доступа к таблице в c #:

OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\mydb.mdb;");
con.Open();
OleDbDataAdapter da = new OleDbDataAdapter("Select * From MSysRelationships", con);
DataSet ds = new DataSet();
da.Fill(ds);

См. Также:

Примечание : невозможно получить дополнительную информацию, связанную с отношением в MS-Accessгрубая GetOleDbSchemaTable.Oledb является оболочкой только для базы данных, и Access не предоставляет эту информацию внешнему миру, поэтому невозможно получить информацию с помощью ADO.net в прямом порядке.

Так что для обхода проблемы вам необходимополучать доступ и манипулировать только grbit информацией столбца MSysRelationships таблицы.

0 голосов
/ 23 января 2013

Проверьте это: http://support.microsoft.com/kb/309681 Кажется легким, но у меня также есть проблема в работе с DataTable: (

...