2014-10-07 92 views
1

我有此代碼從我的表中刪除攝影師,但是,photographer_id是我的表'圖像'的外鍵,當我刪除一位攝影師,我想刪除我正在刪除的攝影師在「圖像」表中的所有圖像。我怎麼做?如何刪除記錄以及所有相關記錄在ASP.NET(C#)

... 

else if (e.CommandName == "Slet") 
{ 
    SqlConnection conn = new SqlConnection(); 
    conn.ConnectionString = 
     ConfigurationManager.ConnectionStrings["DatabaseConnectionString1"].ToString(); 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = conn; 

    cmd.CommandText = "DELETE FROM photographers WHERE photographer_id = @photographer_id"; 

    cmd.Parameters.Add("@photographer_id", SqlDbType.Int).Value = e.CommandArgument.ToString(); 

    conn.Open(); 
    cmd.ExecuteNonQuery(); 
    conn.Close(); 

    Repeater1.DataBind(); 
} 

這是我的圖片表:

CREATE TABLE [dbo].[images] (
    [image_id] INT IDENTITY (1, 1) NOT NULL, 
    [image] NVARCHAR (50) NOT NULL, 
    [FK_photographer] INT NOT NULL, 
    PRIMARY KEY CLUSTERED ([billede_id] ASC), 
    CONSTRAINT [FK_fotograf] FOREIGN KEY ([FK_fotograf]) REFERENCES [dbo].[Fotografer] ([fotograf_id]), 

); 

,這是我的攝影師表:

CREATE TABLE [dbo].[photographers] (
    [photographer_id] INT IDENTITY (1, 1) NOT NULL, 
    [photographer_name] NVARCHAR (50) NOT NULL, 
    PRIMARY KEY CLUSTERED ([photographer_id] ASC) 
); 
+2

您可以添加級聯刪除或首先檢查照片表並首先刪除照片。 – christiandev 2014-10-07 11:24:54

+0

請注意,您可以(也應該)通過[使用「使用」](http://www.hanselman.com/blog/WhyTheUsingStatementIsBetterThanASharpStickInTheEyeAndASqlConnectionRefactoringExample.aspx)來改進您的代碼。 – BCdotWEB 2014-10-07 11:29:26

回答

1

正如我在註釋中,你可以使用級聯刪除。你可以改變你的表類似於下面。

ALTER TABLE billeder 
ADD CONSTRAINT fk_photographer 
FOREIGN KEY (photographer_id) 
REFERENCES photographers (photographer_id) 
ON DELETE CASCADE; 
+0

謝謝,但我應該在哪裏添加?在表格定義?以及在表格定義中的位置? (我在我的問題中添加了2個表格)。 – tekar 2014-10-07 12:04:05

+0

omg ofc。即時通訊對不起,我只是因爲某種原因閱讀它,我的大腦煮沸了,但我用你的方法,它現在似乎工作:)謝謝! – tekar 2014-10-07 12:25:51

+0

沒問題,很高興幫助。 – christiandev 2014-10-07 12:39:04

3

你的外鍵約束集cascading delete。這會自動刪除圖像s when you delete a攝影師。

你自己不需要重新發明輪子。

+0

你好,也許我應該指定這個,但即時通訊初學者,我不太清楚如何設置「級聯刪除」 – tekar 2014-10-07 11:32:46

+0

@tekar:請參閱:http://stackoverflow.com/questions/4454861/how-doi-i-編輯表按順序啓用級聯刪除sql – 2014-10-07 11:55:01

+0

@tekar首先使用此查詢刪除FK約束: 'ALTER TABLE dbo.billeder DROP CONSTRAINT FK_fotograf'。 現在使用此查詢添加FK約束與級聯刪除: 'ALTER TABLE dbo.billeder ADD CONSTRAINT FK_fotograf_Cascade 外鍵(FK_photographer)參考dbo.photographers(photographer_id)ON DELETE CASCADE'。 – Alternatex 2014-10-07 12:04:11

1

同樣的方法 -

DELETE FROM images WHERE photographer_id = @photographer_id 

建議先刪除圖像,然後刪除攝影師。如果您的桌子上有物理FK,那麼在您刪除所有依賴項之前,它將不允許您刪除攝影師。

希望這會有所幫助。

0

更好的方法是你可以在程序 做到這一點,但這裏是替代和簡單的方式

SqlCommand cmd = new SqlCommand(); 
         cmd.Connection = conn; 
    conn.Open(); 
    cmd.CommandText = "DELETE FROM photographers WHERE photographer_id = @photographer_id"; 


cmd.Parameters.Add("@photographer_id", SqlDbType.Int).Value = e.CommandArgument.ToString(); 


cmd.ExecuteNonQuery(); 
    //deleted from photographers 

cmd.CommandText = "DELETE FROM Images WHERE photographer_id = @photographer_id"; 


cmd.Parameters.Add("@photographer_id", SqlDbType.Int).Value = e.CommandArgument.ToString(); 
    cmd.ExecuteNonQuery(); 
    //deleted from images