简体   繁体   English

INSERT语句与FOREIGN KEY约束冲突

[英]The INSERT statement conflicted with the FOREIGN KEY constraint

Getting this strange issue, 得到这个奇怪的问题,

I have a user defined table: 我有一个用户定义的表:

CREATE TYPE [dbo].[Crates_FruitsType] AS TABLE 
(
    [FruitID] [int] NOT NULL,
    [CrateID] [int] NOT NULL
)

And a stored procedure: 和一个存储过程:

CREATE procedure [dbo].[Crates_InsertRelateMultipleFruits]
    (@FruitCrates As Crates_FruitsType READONLY)
AS
BEGIN
    DELETE rc
    FROM Crates_Fruits rc
    WHERE rc.CrateID IN (SELECT DISTINCT tmp.CrateID 
                         FROM @FruitCrates tmp);

    INSERT INTO Crates_Fruits (FruitID, CrateID)
       SELECT 
          tmp.FruitID, tmp.CrateID
       FROM 
          @FruitCrates tmp
       WHERE 
          tmp.FruitID <> '-1';
END

And table: 和表:

CREATE TABLE [dbo].[Crates_Fruits]
(
    [EchoID] [int] NULL,
    [FruitID] [int] NOT NULL,
    [CrateID] [int] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Crates_Fruits] WITH CHECK 
  ADD CONSTRAINT [FK_Crates_CrateID] 
  FOREIGN KEY([CrateID]) REFERENCES [dbo].[Crates] ([ID])
GO

ALTER TABLE [dbo].[Crates_Fruits] CHECK CONSTRAINT [FK_Crates_CrateID]
GO

ALTER TABLE [dbo].[Crates_Fruits] WITH CHECK 
  ADD CONSTRAINT [FK_Fruits_FruitID2] 
  FOREIGN KEY([FruitID]) REFERENCES [dbo].[Fruits] ([ID])
GO

ALTER TABLE [dbo].[Crates_Fruits] CHECK CONSTRAINT [FK_Fruits_FruitID2]
GO

And this C# code: 和此C#代码:

using (SqlConnection connection = new SqlConnection(GetConnectionString()))
{
    connection.Open();

    DataTable DT = new DataTable();
    DT.Columns.Add("FruitID", typeof(int));
    DT.Columns.Add("CrateID", typeof(int));

    if (fruitIDs.Count < 1)
       DT.Rows.Add(crateID, -1);
    else
    {
        for (int i = 0; i < fruitIDs.Count; i++)
            DT.Rows.Add(fruitIDs[i], crateID);
    }

    using (SqlCommand command = new SqlCommand("Crates_InsertRelateMultipleFruits", connection))
    {
        command.CommandType = CommandType.StoredProcedure;
        var testingparam = command.Parameters.AddWithValue("@FruitCrates", DT);
        testingparam.SqlDbType = SqlDbType.Structured;

        command.ExecuteNonQuery();
    }
}

Error: 错误:

System.Data.SqlClient.SqlException (0x80131904): The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Crates_CrateID". System.Data.SqlClient.SqlException(0x80131904):INSERT语句与FOREIGN KEY约束“ FK_Crates_CrateID”冲突。 The conflict occurred in database "FruitFactory", table "dbo.Crates", column 'ID'. 数据库“ FruitFactory”的表“ dbo.Crates”的列“ ID”中发生了冲突。 The statement has been terminated. 该语句已终止。

It works perfectly but gives error when I pass data as 它可以正常工作,但是当我传递数据时会出错

CrateID = 172
FruitID = -1

I am expecting stored procedure to, 我期望存储过程能够

if FruitID is passed as "-1" then only delete all records where CrateID is 172 Otherwise delete all records where CrateID is 172 and add new datatable 如果FruitID传递为“ -1”,则仅删除CrateID为172的所有记录,否则删除CrateID为172的所有记录并添加新的数据表

You have reversed the order of the columns. 您已颠倒了列的顺序。 Your type is defined as (FruitId,CrateId) but your C# code enters the crateID first when there are no fruit IDs: 您的类型定义为(FruitId,CrateId)但是当没有水果ID时,您的C#代码首先输入crateID

if (fruitIDs.Count < 1)
   DT.Rows.Add(crateID, -1);

It should be 它应该是

if (fruitIDs.Count < 1)
   DT.Rows.Add(-1,crate);

To execute your stored procedure directly, just create a variable using the table type and insert the values you want, eg: 要直接执行存储过程,只需使用表类型创建一个变量并插入所需的值,例如:

declare @t [Crates_FruitsType]
insert into @t VALUES(-1,172)
exec [Crates_InsertRelateMultipleFruits] @t

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM