4

我正在尝试使用 c# 在 Microsoft Access 数据库中创建一对一的关系。到目前为止,我有以下代码(据我了解)应该创建一对一的关系:

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 表时,它给了我一个 4096 的 grbit(这将是一对多)而不是 4097 是一对一一:

图片显示 MSysRelationships 表,显示 grbit 为 4096
(来源:richardn.co.uk

当我在关系窗口中查看关系时,它在关系图上显示它是一对多关系,但在编辑关系窗口中显示它是一对一关系:

图片显示 Microsoft Access 中的冲突信息
(来源:richardn.co.uk

我真的被困在这里,因为在 Access 中,如果我编辑关系并更改其中一个设置并单击“确定”,它会立即在窗口中变为一对一关系,并且 grbit 更改为 4097。我错过了什么我的代码将关系设置为一对一的关系,最初的 grbit 为 4097?

4

1 回答 1

2

正如我在此处对类似问题的回答所建议的那样,当使用 DDL 创建关系时,这似乎是关系选项卡中显示关系的方式出现了故障。在之前的答案中,我并没有在“编辑关系”对话框中更改某些内容,并查看“关系”选项卡中的小线是否确实发生了变化,但您的发现表明确实如此。

我不相信您做错了什么 “修复”将是调整MSysRelationships.grbit值,但无论如何您都无法从 OleDb 连接访问 [MSys...] 表。所以,这可能只是我们必须接受的那些小怪癖之一。

实际上,如果关系实际上表现为一对一,那么“关系”选项卡中的小线是什么样子并不重要。运行几个测试以确保关系和参照完整性规则按应有的方式运行,如果确实如此,则继续进行其他操作。

于 2013-05-12T13:21:22.467 回答