【问题标题】:ADO.NET DataAdapterADO.NET 数据适配器
【发布时间】:2011-05-14 00:28:05
【问题描述】:

删除一些行后,在我的 dataAdapter 上调用更新方法时出现以下错误:

DELETE 语句与 REFERENCE 约束“FK_Eleve_Classe”冲突。冲突发生在数据库“hogwarts”、表“dbo.Eleve”、列“FK_classID”中。 声明已终止。

确实,定义了一个外键,但是由于主键在“classe”表中,为什么不允许我删除“eleve”中的行?

也许它会尝试级联删除? (那怎么改呢?)

编辑 1:SQL

CREATE TABLE [dbo].[Classe](
    [id] [int] NOT NULL,
 CONSTRAINT [PK_Classe] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[Eleve](
    [id] [int] NOT NULL,
    [nom] [varchar](50) NULL,
    [prenom] [varchar](50) NULL,
    [birthdate] [date] NULL,
    [FK_classID] [int] NULL,
 CONSTRAINT [PK_Eleve] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]



ALTER TABLE [dbo].[Eleve]  WITH CHECK ADD  CONSTRAINT [FK_Eleve_Classe] FOREIGN KEY([FK_classID])
REFERENCES [dbo].[Classe] ([id])

编辑 2:一些 c# 代码

 DataSet ds = new DataSet();

 c.Open(); // SqlConnection


 SqlDataAdapter da = new SqlDataAdapter("Select * from eleve", (SqlConnection)c);
 da.Fill(ds, "eleves");
 da.SelectCommand = new SqlCommand("select * from cours", (SqlConnection)c);
 da.Fill(ds, "COURS");
 da.SelectCommand = new SqlCommand("select * from professeur", (SqlConnection)c);
 da.Fill(ds, "PROF");
 da.SelectCommand = new SqlCommand("select * from classe", (SqlConnection)c);
 da.Fill(ds, "CLASSE");
 c.Close();


 ds.Tables["eleves"].Rows[0].Delete();

编辑 3:删除

这是我删除表中元素的方式:

ds.Tables["eleves"].Rows[0].Delete();

除此之外我还必须手动设置 deleteCommand 吗?


是的,霍格沃茨,因为我正在制作一个样本以一种有趣的方式来解释它;)

谢谢,

风筝

【问题讨论】:

  • hogwarts 数据库,哈哈

标签: c# ado.net dataadapter


【解决方案1】:

你有触发器吗?这是此类错误的常见原因。

如果 eleve 是具有类子行的子表(例如,对于 classe 中的每一行,eleve 中的 0 到多行),则不应发生此错误。除非 FK 是错误的方式

顺便说一句:级联是从父级到子级。

【讨论】:

  • 我没有设置任何触发器,只是我的表带有主/外键
  • 刚刚贴出两张表的SQL和FK的SQL
  • @kite:现在,运行分析器以查看正在运行的内容。 SQL 看起来不错。只有从“classe”中删除才会发生错误
  • 在配置文件中它在类表上调用 delete ... 请参阅我的 C# 代码更新 2
  • 我刚刚做了 SqlCommandBuilder build = new SqlCommandBuilder(da);删除命令设置为null
猜你喜欢
  • 2014-09-06
  • 2010-10-13
  • 2010-12-06
  • 2011-03-04
  • 1970-01-01
  • 2013-05-30
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多