在C#中创建与Access数据库的一对一关系时出现问题

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?


对于良好的研究和问题的清晰描述,给予+1。 - Gord Thompson
1个回答

2
正如我在类似问题的回答中所建议的那样(这里),当使用DDL创建关系时,在“关系”选项卡中显示的关系方式可能存在故障。在之前的回答中,我没有改变“编辑关系”对话框中的任何内容并查看关系选项卡中的小线是否实际更改,但您的发现表明确实会更改。

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

而且,如果关系实际上表现为一对一,则关系选项卡中的小线实际上并不重要。运行几个测试以确保关系和引用完整性规则的行为符合预期,如果符合预期,则继续进行其他事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接