4

C# を使用して、Microsoft Access データベースで 1 対 1 の関係を作成しようとしています。これまでのところ、(私が理解していることから) 1 対 1 の関係を作成する必要がある次のコードがあります。

OleDbConnection dbCon = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = d:\\Test.mdb; Jet OLEDB:System Database=c:\\secure.mdw; User Id=321; Password=123;");
dbCon.Open();
String szTable1 = "CREATE TABLE Table1 (Field1 int UNIQUE NOT NULL PRIMARY KEY)";
OleDbCommand table1Cmd = new OleDbCommand(szTable1, dbCon);
table1Cmd.ExecuteNonQuery();    
String szTable2 = "CREATE TABLE Tablea (Fielda int UNIQUE NOT NULL PRIMARY KEY)";
OleDbCommand table2Cmd = new OleDbCommand(szTable2, dbCon);
table2Cmd.ExecuteNonQuery();
String szRelationship1 = "ALTER TABLE Table1 ADD CONSTRAINT TableLink FOREIGN KEY (Field1) REFERENCES Tablea(Fielda) ON DELETE CASCADE";
OleDbCommand relationship1Cmd = new OleDbCommand(szRelationship1, dbCon);
relationship1Cmd.ExecuteNonQuery();
dbCon.Close();

これにより、2 つのテーブルが作成され、それらの間に関係が作成されますが、Access で MSysRelationship テーブルを見ると、1 対 4097 ではなく 4096 (1 対多) の grbit が表示されます。 1:

4096 の grbit を示す MSysRelationships テーブルを示す画像
(出典: richardn.co.uk )

リレーションシップ ウィンドウでリレーションシップを見ると、リレーションシップ ダイアグラムでは 1 対多のリレーションシップであることが示されていますが、リレーションシップの編集ウィンドウでは 1 対 1 のリレーションシップであると表示されています。

Microsoft Access 内の競合する情報を示す画像
(出典: richardn.co.uk )

Access でリレーションシップを編集して設定の 1 つを変更し、[OK] をクリックすると、ウィンドウ内で即座に 1 対 1 のリレーションシップになり、grbit が 4097 に変更されるため、私は本当にここで立ち往生しています。もともと 4097 の grbit で 1 対 1 の関係を設定する私のコードは?

4

1 に答える 1

2

ここでの同様の質問に対する私の回答で示唆されているように、これは、関係が DDL を使用して作成されたときに関係が [関係] タブに表示される方法に問題があるようです。その前の回答では、「関係の編集」ダイアログで何かを変更して、「関係」タブの小さな行が実際に変更されたかどうかを確認するまでには行きませんでしたが、調査結果は変更されていることを示しています。

あなたが何か間違ったことをしているとは思いません.「修正」はMSysRelationships.grbit値を微調整することですが、とにかくOleDb接続から[MSys ...]テーブルを取得することはできません. したがって、これは単に、私たちが受け入れなければならないちょっとした癖の 1 つかもしれません。

実際、リレーションシップが実際に1 対 1 として動作する場合、 [リレーションシップ] タブの小さな線がどのように表示されるかは問題ではありません。いくつかのテストを実行して、リレーションシップと参照整合性ルールが正常に動作することを確認し、正常に動作する場合は、他の作業に進みます。

于 2013-05-12T13:21:22.467 に答える