2012-07-10 39 views
2

我是一名新的ASP.NET開發人員,嘗試使用GridView控件顯示數據庫中employee表中的所有員工。我現在正在刪除GridView中任何員工的全部信息。我對着下面萬阿英,蔣達清,我不知道爲什麼:如何在此GridView中刪除員工的培訓記錄?

僅供參考,我有以下的數據庫設計:

Employee Table: Username, Name, JobTitle, BadgeNo, IsActive, DivisionCode 
Divisions Table: SapCode, DivisionShortcut 
Groups Table: GroupID, GroupName 
Courses Table: CourseID, CourseName, GroupID 
Employee_Courses Table: EmployeeID, CourseID 

(IsActive就像是一個標誌(位數據類型),以當指示員工是否在任務中)

現在,我希望管理員能夠刪除員工,並刪除Employee_Courses表中已存在的所有培訓信息。 如何做到這一點?

我的查詢刪除:

DELETE employee where dbo.employee.Username = @Username 

以及用於刪除記錄中的隱藏代碼如下:

protected void DeleteRecord(object sender, GridViewDeleteEventArgs e) 
    { 
     string networkID = GridView1.DataKeys[e.RowIndex].Value.ToString(); 

     string connString = ConfigurationManager.ConnectionStrings["UsersInfoDBConnectionString"].ConnectionString; 
     SqlConnection conn = new SqlConnection(connString); 
     string deleteCommand = "DELETE employee where dbo.employee.Username = " + networkID; 
     SqlCommand cmd = new SqlCommand(deleteCommand, conn); 
     cmd.Parameters.AddWithValue("@username", networkID); 
     try 
     { 
      conn.Open(); 
      cmd.ExecuteNonQuery(); 
      conn.Close(); 
     } 
     catch (SqlException se) 
     { 
      throw se; 
     } 
     finally 
     { 
      cmd.Dispose(); 
      conn.Close(); 
      conn.Dispose(); 
     } 
     GridView1.DataBind(); 
    } 

它非常適合誰沒有培訓記錄的員工,但它不適用於任何有培訓記錄的員工,它給我以下錯誤:

The DELETE statement conflicted with the REFERENCE constraint "FK_employee_courses_employee". The conflict occurred in database "UsersInfoDB", table "dbo.employee_courses", column 'employeeId'. The statement has been terminated.

那麼如何解決這個問題呢?

UPDATE:

FYI,用戶名是在EMPLOYEE表中的主鍵,和僱員ID是一個外鍵,它的主鍵。那麼我怎樣才能從Employee表中刪除員工,並將他所有的信息都放在其他表中。

+0

您應該知道您的代碼易受SQL注入攻擊 – JohnnBlade 2012-07-10 06:46:02

+0

您正在構建您的查詢,並且正在傳遞@UserName參數 – JohnnBlade 2012-07-10 06:47:58

+0

employeeID是UserInfoDB中employee表的外鍵? – 2012-07-10 08:17:58

回答

1

錯誤之一是在你刪除查詢時,缺少表名Employee_Courses 您的查詢應該是這樣的

DELETE employee from Employee_Courses where dbo.employee.Username = @Username

的錯誤出現,因爲你有一個外鍵關係。首先從子表中刪除數據,然後從父表中刪除它。 UsersInfoDB與Employee_Courses表有關係,首先從UsersInfoDB中刪除記錄,然後SQL SErver將允許您從父表中刪除記錄。

可能的解決方案。 轉到您的表設計,右鍵點擊桌子上,會出現一個菜單選擇關係,名稱爲外鍵關係的彈出窗口將打開,選擇從左側窗格中您想要的鍵,然後選擇更新和刪除規範從右側指定刪除規則。對於DELETE,您應該將其設置爲CASCADE。設置刪除規則後,您不需要手動從子表中刪除記錄,現在,您的代碼就可以工作,無論何時從Employee_Courses表中刪除記錄,它都會自動從子表(UserInfoDB)中刪除。

+0

您可能的解決方案與我共事。謝謝。 – 2012-07-10 08:32:38

+0

歡迎freind :) – 2012-07-10 08:33:21

+0

只是一個問題。這樣做對設計本身並不危險嗎? – 2012-07-10 08:33:22

0

首先刪除employee_courses_employee中的元素,其中EmployeeID =您要刪除的員工。刪除所有記錄後,您將不再獲取參考約束。

執行的是第一,然後執行下一個(目前您正試圖執行查詢,我相信它只是訪問的職員表)

編輯:我認爲似乎是在你的員工表中沒有僱員記錄 - 但應該有(是否是主鍵?)。如果存在一些員工標識與僱員表中的用戶名或其他數據有關的存儲,那麼您絕對應該先獲取員工標識,刪除其所有記錄,然後從員工表中刪除該員工。

「引用」約束指的是所謂的「外鍵」,它將一個表中的數據鏈接到另一個表中的數據。如果刪除了「主鍵」,則「foriegn鍵」不存在,並且鏈接它們的連接是垃圾,這就是爲什麼在刪除具有主鍵(EmployeeID)的數據之前首先必須處理關係。

+0

是的,用戶名是員工表中的主鍵,而僱員ID是該主鍵的外鍵。那麼我怎樣才能從Employee表中刪除員工,並將他所有的信息都放在其他表中。 – 2012-07-10 08:00:02

0

讓你的DeleteCommand調用一個存儲過程。在那裏刪除所有引用表。

如果表具有外鍵約束,則需要先刪除引用表中的條目。只有這樣它纔會讓你刪除主記錄。

在這種情況下,調用首先從Employee_Courses表從Employee表中刪除數據

DELETE employee from Employee_Courses where dbo.employee.Username = @Username 

DELETE employee where dbo.employee.Username = @Username 
0

然後

。但是,你在Employee表中有任何EmployeeID/ID列?我的意思是從

你在哪裏獲得Employee_Courses表的EmployeeID數據。

您已從兩個表中刪除數據,而不是從一個表中刪除數據。

相關問題