[英]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.