【发布时间】:2017-11-08 00:50:56
【问题描述】:
我有 2 个表,一个以 MemberID 作为主键的 Owners 表和一个以 TigerID 作为主键和 MemberID 作为外键的 Tigers 表,以指示谁拥有老虎。当然,一个所有者可以拥有多只老虎。
我正在使用 Windows 窗体中的 DataAdapter 在 DataGridView 中显示老虎(Visual Studio 让您将表格拖放到 Windows 窗体上并自动为您生成代码)。
当我运行表单时,我得到一个错误:
System.Data.ConstraintException: '未能启用约束。一行或多行包含违反非空、唯一或外键约束的值。
编辑 2:
我尝试再次删除数据以查看是否拥有唯一的外键可以消除问题。它没有。对于之前的错误信息,我深表歉意。我还检查了Tigers 中没有外键MemberID,这不是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 表并在表单设计器代码中设置生成的代码是解决方案。这是由于正确回复对需要在同一实例中首先加载的父表的洞察。我只需要找到一种编辑方法,这样我就可以隐藏 Owners 表,使其不显示在此表单中。
【问题讨论】:
-
你能用 SQL 初始化你的表吗?
-
如果可能,首先显示表和约束定义。
-
@mjw 如何访问约束定义?我使用 xsd 文件中的图形界面来创建关系。将 Owners 设置为 Tigers 的父子,关系为“关系和外键约束”
-
System.Data.ConstraintException 由 DataSet/DataTable 对象引发,您还需要发布创建 DataTables 的 C# 代码并用数据填充它们
-
@DavidLee 你这是什么意思?我为我的无能道歉,到目前为止我已经使用了图形界面。 (我还在学习) 编辑:也许你的意思是如果我能有桌子?答案是肯定的,因为我有数据并且可以在不同的 Windows 窗体中很好地显示 Owners 表
标签: c# sql-server winforms tsql