【问题标题】:Multiple rows with same foreign key causing foreign key constraint error具有相同外键的多行导致外键约束错误
【发布时间】: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


【解决方案1】:

确保在 Tigers 表之前填写 Owners 表。在同一个数据集中

在启用约束的情况下执行此行

this.tigersTableAdapter.Fill(this.tRFDDataSet.Tigers);

this.tRFDDataSet.Owners 表需要为每个拥有 this.tRFDDataSet.Tigers 中的 MemberId 的所有者提供一行。 这意味着您必须在填充 Tigers 之前创建/放入 OwnersTableAdapter 并调用其 Fill 方法

【讨论】:

  • 我该怎么做?
  • @WajdTohme 您需要发布执行 TigersTableAdapter 的代码。填写您的问题。
  • 就是这样做的。看看吧
  • 应用程序启动并打开所有者表并显示,然后您才能打开显示 Tigers 表的表单。并且带有 Owners 表的 FORM 保持打开状态,因此它在 Tigers 表之前填充。
  • 这个 Owners 表需要填充在 DataSet 对象的同一个实例上。你能证明你的所有者表单和老虎表单使用的是同一个 DataSet 实例吗?如果您只是从设计器中删除了数据集,那么很可能两种表单都有单独的数据集实例
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多