【问题标题】:Problems creating a one-to-one relationship with an access database in c#在 c# 中与 access 数据库创建一对一关系的问题
【发布时间】:2025-12-28 20:55:15
【问题描述】:

我正在尝试使用 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,这是一个一对一:


(来源:richardn.co.uk

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


(来源:richardn.co.uk

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

【问题讨论】:

  • +1 以获得良好的研究和对问题的清晰描述。

标签: c# ms-access relationship one-to-one


【解决方案1】:

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

我不相信您在做任何事情错误,“修复”将是调整 MSysRelationships.grbit 值,但您无法获得 [MSys... ] 来自 OleDb 连接的表。所以,这可能只是我们必须接受的那些小怪癖之一。

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

【讨论】: