我有2个表,一个以Owners
作为主键的MemberID
表,以及一个Tigers
表,其中TigerID
为主键,MemberID
为一个外键,表明谁拥有老虎。当然,拥有者可以拥有多只老虎。
我使用Windows窗体中的DataAdapter在DataGridView中显示老虎(Visual Studio允许您将表拖放到窗体上并自动为您生成代码)。
当我运行表单时,出现错误:
System.Data.ConstraintException:'无法启用约束。一行或多行包含违反非null,唯一或外键约束的值。'
编辑2:
我尝试再次删除数据,以查看是否有唯一的外键删除问题。它没有。我为早先的错误信息道歉。我也检查了MemberID
中没有外键Tigers
,这不是Owners
中的主键
编辑:
CREATE TABLE [dbo].[Members] (
[MemberID] INT IDENTITY (1, 1) NOT NULL,
[FName] VARCHAR (50) NOT NULL,
[LName] VARCHAR (50) NOT NULL,
[Street] VARCHAR (MAX) NOT NULL,
[HouseNbr] INT NOT NULL,
[PostNbr] INT NOT NULL,
[City] NCHAR (10) NOT NULL,
PRIMARY KEY CLUSTERED ([MemberID] ASC)
);
CREATE TABLE [dbo].[Tigers] (
[TigerID] INT IDENTITY (1, 1) NOT NULL,
[Name] VARCHAR (50) NOT NULL,
[Type] VARCHAR (50) NOT NULL,
[Weight] INT NOT NULL,
[MemberID] INT NOT NULL,
PRIMARY KEY CLUSTERED ([TigerID] ASC)
);
编辑3 Tigers表格中的代码
private void tigersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.tigersBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.tRFDDataSet);
}
private void frmTigerList_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'tRFDDataSet.Tigers' table. You can move, or remove it, as needed.
this.tigersTableAdapter.Fill(this.tRFDDataSet.Tigers);
}
编辑4:
我去了Tiger DataGrid Fill
的定义并找到了这段代码:
private TRFDDataSet tRFDDataSet;
private System.Windows.Forms.BindingSource tigersBindingSource;
private TRFDDataSetTableAdapters.TigersTableAdapter tigersTableAdapter;
private TRFDDataSetTableAdapters.TableAdapterManager tableAdapterManager;
private System.Windows.Forms.DataGridView tigersDataGridView;
private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn1;
private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn2;
private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn3;
private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn4;
private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn5;
所以我在tigersBindingSource之前添加了
private System.Windows.Forms.BindingSource membersBindingSource;
private TRFDDataSetTableAdapters.MembersTableAdapter membersTableAdapter;
但它仍然没有奏效。错误仍然存在
编辑决赛:
在Tiger表代码是解决方案之前,拖放Owners表并在Form Designer代码中设置生成的代码。这是由于正确答复了解需要在同一实例中首先加载的父表。我只需要找到一种编辑方式,这样我就可以隐藏Owners表,不会以这种形式显示。
答案 0 :(得分:0)
确保在Tigers表之前填写Owners表。在同一个DataSet中
要在启用约束的情况下执行此行
this.tigersTableAdapter.Fill(this.tRFDDataSet.Tigers);
this.tRFDDataSet.Owners
表需要为this.tRFDDataSet.Tigers
中具有MemberId的每个所有者创建一行。
这意味着您必须创建/放入OwnersTableAdapter
并在填充Tigers之前调用其Fill
方法