【问题标题】:System.Data.SqlClient.SqlException: 'The INSERT statement conflicted with the FOREIGN KEY constraintSystem.Data.SqlClient.SqlException: 'INSERT 语句与 FOREIGN KEY 约束冲突
【发布时间】:2018-10-11 10:43:02
【问题描述】:

我在调试期间仍然收到此错误。我不知道该怎么做,因为我已经为 Person 类添加了 AdddressID。

请帮忙!

INSERT 语句与 FOREIGN KEY 约束 \"FK_Person_ToAddress\" 冲突。数据库“DirectoryDatabase”、表“dbo.Address”、“AddressID”列中发生冲突

引发此错误的函数是:

    public void CreatePersonDB(ref Person person)
    {
        string CreatePerson =
            @"INSERT INTO [Person] (FirstName, MiddleName, LastName, AddressID)
                                    OUTPUT INSERTED.PersonID  
                                    VALUES (@FName, @MName, @LName, @AID)";

        using (SqlCommand cmd = new SqlCommand(CreatePerson, OpenConnection))
        {
            // Get your parameters ready                    
            cmd.Parameters.AddWithValue("@FName", person.FirstName);
            cmd.Parameters.AddWithValue("@MName", person.MiddleName);
            cmd.Parameters.AddWithValue("@LName", person.LastName);
            cmd.Parameters.AddWithValue("@AID", person.PrimaryAddress.AddressID);

             try
            {
                person.PersonID = (int)cmd.ExecuteScalar(); //Returns the identity of the new tuple/record}
            }
            catch
            {
                Console.WriteLine("Adresse ID doesn't exist, do you want to add it? [y/n]");
                ConsoleKeyInfo input = Console.ReadKey();

                if (input.Key == ConsoleKey.Y)
                {
                    //create an insert query to the dbo.Adresse the same way you did with the dbo.person.
                    CreateAddressDB();
                }
        }
    }

Person & Address 的数据库 sql 代码如下所示(编辑后):

CREATE TABLE Address (
AddressID      BIGINT IDENTITY(1,1) NOT NULL,
StreetName     NVARCHAR(MAX) NOT NULL,
HouseNumber    NVARCHAR(MAX) NOT NULL,

CityID         BIGINT NOT NULL,

[PersonID] NCHAR(10) 非空, [PrimaryAddress] INT NOT NULL, CONSTRAINT pk_Address PRIMARY KEY CLUSTERED (AddressID), 约束 fk_Address 外键(CityID) 参考城市 (CityID) 删除无操作 更新无操作)

这是地址表:

CREATE TABLE Person (
PersonID       BIGINT IDENTITY(1,1) NOT NULL,
FirstName      VARCHAR(50) NOT NULL,
MiddleName     NVARCHAR(50) NOT NULL,
LastName       NVARCHAR(50) NOT NULL,

AddressID      BIGINT NOT NULL,

CONSTRAINT pk_Person PRIMARY KEY CLUSTERED (PersonID), 约束 fk_Person 外键(地址 ID) 参考地址 (AddressID) )

【问题讨论】:

标签: c# sql-server


【解决方案1】:

在表 dbo.Address 中不存在您的 person.PrimaryAddress.AddressID 值的记录

【讨论】:

  • 请为您的答案添加更多细节,以供将来访问此页面的读者使用。
【解决方案2】:

您正在尝试将AdresseID 插入到Adresse 表中不存在的人员表中。

试试这个:

public void CreatePersonDB(ref Person person)
{
    string CreatePerson =
        @"INSERT INTO [Person] (FirstName, MiddleName, LastName, AddressID)
                                OUTPUT INSERTED.PersonID  
                                VALUES (@FName, @MName, @LName, @AID)";

    using (SqlCommand cmd = new SqlCommand(CreatePerson, OpenConnection))
    {
        // Get your parameters ready                    
        cmd.Parameters.AddWithValue("@FName", person.FirstName);
        cmd.Parameters.AddWithValue("@MName", person.MiddleName);
        cmd.Parameters.AddWithValue("@LName", person.LastName);
        cmd.Parameters.AddWithValue("@AID", person.PrimaryAddress.AddressID);

        try()
        {
            person.PersonID = (int)cmd.ExecuteScalar();   // Returns the identity of the new tuple/record}
        catch()
        {
             DialogResult dialogResult = MessageBox.Show("Adresse ID doesn't exist, do you want to add it?", "Alerte",MessageBoxButtons.YesNo);

             if(dialogResult == DialogResult.Yes)
             {
                 // create an insert query to the dbo.Adresse the same way you did with the dbo.person.
             }
        }
    }
}

【讨论】:

  • 所以我必须将 PrimaryAddress 和 AddressID 添加到 dbo.Address?
  • 是的,尝试捕获该异常,以便为 dbo.Adresse 创建新的 AdressID 记录,然后继续插入到 dbo.Person。
  • 谢谢@Saber,我已经用您建议的更改更新了问题,但由于该功能无法识别,我仍然收到错误。
  • 您已经在您的第一条评论中解决了它,如您所说,开始在 dbo.Adresse 表中插入 AdresseID,然后到 dbo.Person,我之后提出的可能需要不起作用的功能控制台应用程序,如果仍然不起作用,请发送更多详细信息,包括 dbo.person 和 dbo.adresse 实际记录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2021-05-30
  • 1970-01-01
相关资源
最近更新 更多