1

いくつかの行を削除した後、dataAdapterでupdateメソッドを呼び出すと、次のエラーが発生します。

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を手動で設定する必要がありますか?


はい、面白い方法で説明するサンプルを作成しているので、ホグワーツ魔法魔術学校です;)

ありがとう、

4

1 に答える 1

0

トリガーはありますか?これは、このようなエラーの通常の原因です。

eleve がクラスの子行を持つ子テーブルである場合 (たとえば、classe の各行に対して eleve に 0 から多数の行がある場合)、このエラーは発生しません。FKが間違った方法でない限り

ところで:カスケードは親から子へです。

于 2010-11-22T18:25:14.630 に答える