2

データベースから読み取った情報で DataRelation コレクションを埋めようとしています。

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

しかし、この情報は、それが実際の外部キー制約なのか、単なる関係なのかについては何も述べていません。このため、DataRelation コンストラクター (createConstraints) の 4 番目のパラメーターに設定する値がわかりません。

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

特に、MS Access では、2 つのテーブルをリレーションで接続できますが、データの整合性チェックを強制することはできません。いくつかの追加の調査では、このような強制されていない関係が OleDbSchemaGuid.Referential_Constraints スキーマ テーブルにも表示されることが示されました。

必要な情報はどこで入手できるのだろうか。道を教えてください。

4

2 に答える 2

3

Ado.Netを使用して、MSAccessのリレーションに関連する追加の属性をフェッチすることはできません。DAOを使用したVBAでのみ可能でした。

すべてのリレーションとその追加属性はMSysRelationships、ms-accessのすべてのバージョンのテーブルに格納されます。このフィールドgrbitには、リレーションのすべての可能な属性、つまり、参照の連続性の強制、カスケードの削除、カスケードの更新の値があります。このテーブルの他のフィールドは自明であり、GetOleDbSchemaTableメソッドによって返されるフィールドと同じです。

Grbitのいくつかの便利な計算:

  • これは、1対1の関係があり、参照インティグリティの強制がオンになっている場合、Grbitは0になることを意味します。
  • これは、1対1の関係があり、参照インティグリティの強制がオフの場合、Grbitは3になることを意味します。
  • これは、1対多の関係があり、参照インティグリティの強制がオフの場合、Grbitは2になることを意味します。
  • これは、1対多の関係があり、参照インティグリティの強制がオンの場合、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ます。

于 2012-06-16T03:31:13.647 に答える
0

これを確認してください: http://support.microsoft.com/kb/309681 簡単に思えますが、DataTable の処理にも問題がありました :(

于 2013-01-23T18:09:56.853 に答える