2014-12-04 72 views
-2

我在從表格中刪除用戶時出現問題。我可以將表單中的數據插入到表中,但在刪除時只會將else語句結果顯示爲「在處理請求時發生了一些錯誤」。 StaffID是自動增量。請幫忙。無法通過窗體從表格中刪除用戶

刪除按鈕:

private void btnDeleteUser_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      int result = uc.ManageUser(txtFullName.Text, txtAddress.Text, txtPhone.Text, txtEmail.Text, Convert.ToDateTime(dateTimePickerJoinedDate.Text), txtUserame.Text, txtPassword.Text, Convert.ToDateTime(dateTimePickerCreatedDate.Text), "D"); 
      if (result == 1) 
      { 
       MessageBox.Show("User Deleted"); 
       dgvUserDetails.DataSource = uc.SelectAllUsers(); 
       //MakeFieldsBlank(); 
      } 
      else 
      { 
       MessageBox.Show("SOME ERRORS OCCURRED WHILE PROCESSING THE REQUEST"); 
      } 
     } 
     catch (Exception ex) 
     { 

      MessageBox.Show(ex.Message); 
     } 
    } 

    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 

    } 
    } 
} 

ManageUser類

public int ManageUser(String Name, String Address, String Phone, String Email, DateTime JoinedDate, String Username, String Password, DateTime CreatedDate, String Mode) 
    { 
     try 
     { 
      int result = 0; 
      SqlCommand cmd = new SqlCommand("sp_ManageUser", conn); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.AddWithValue("@StaffID",DBNull.Value); 
      cmd.Parameters.AddWithValue("@Name", Name); 
      cmd.Parameters.AddWithValue("@Address", Address); 
      cmd.Parameters.AddWithValue("@Phone", Phone); 
      cmd.Parameters.AddWithValue("@Email", Email); 
      cmd.Parameters.AddWithValue("@JoinedDate", JoinedDate); 
      cmd.Parameters.AddWithValue("@Username", Username); 
      cmd.Parameters.AddWithValue("@Password", Password); 
      cmd.Parameters.AddWithValue("@CreatedDate", CreatedDate); 
      //cmd.Parameters.AddWithValue("@IsActive", IsActive); 
      cmd.Parameters.AddWithValue("@Mode", Mode); 


      conn.Open(); 
      result = cmd.ExecuteNonQuery(); 
      conn.Close(); 
      return result; 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 
    } 

步驟:sp_ManageUser

USE [db_ProjectStatusManager] 
GO 
/****** Object: StoredProcedure [dbo].[sp_ManageUser] Script Date: 12/05/2014 01:29:05 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
    -- Author:  <Author,,Name> 
-- Create date: <Create Date,,> 
-- Description: <Description,,> 
-- ============================================= 
ALTER PROCEDURE [dbo].[sp_ManageUser] 
-- Add the parameters for the stored procedure here 
@StaffID int, 
@Name nvarchar(100), 
@Address nvarchar(500), 
@Phone nvarchar(100), 
@Email nvarchar(100), 
@JoinedDate date, 
@Username nvarchar(50), 
@Password nvarchar(max), 
@CreatedDate date, 
@Mode varchar(1) 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT OFF; 


-- Insert statements for procedure here 
    if(@Mode='I') 
insert into tbl_Staff (Name,Address,Phone,Email,JoinedDate,Username,Password,CreatedDate) values(@Name,@Address,@Phone,@Email,@JoinedDate,@Username,@Password,@CreatedDate) 
if(@Mode='U') 
Update tbl_Staff set [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected] where [email protected] 
if(@Mode='D') 
Delete from tbl_Staff where [email protected] 
end 

負荷用戶要文本框

private void FrmUsers_Load(object sender, EventArgs e) 
    { 
     UserClass uc = new UserClass(); 
     dgvUserDetails.DataSource = uc.SelectAllUsers(); 
     dgvUserDetails.AllowUserToAddRows = false; 
     dgvUserDetails.AllowUserToOrderColumns = false; 
        panel1.Enabled = false; 
    } 

UserClass。 SelectAllUsers

public DataTable SelectAllUsers() 
    { 
     try 
     { 
      SqlCommand cmd = new SqlCommand("Select * from tbl_Staff", conn); 
      DataTable dt = new DataTable(); 
      conn.Open(); 
      SqlDataReader dr = cmd.ExecuteReader(); 
      dt.Load(dr); 
      conn.Close(); 
      return dt; 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 
    } 
+1

您是否爲參數@StaffID傳遞了DBNull.Value? – Steve 2014-12-04 20:40:01

+0

是的,因爲StaffID是自動遞增的,所以我使用DBNull.Value將值從表單傳遞給表格。 – 2014-12-04 20:44:26

+2

在刪除中,您需要該值,否則不會刪除任何用戶 – Steve 2014-12-04 20:44:55

回答

0

你在「 STAFFID」列傳遞NULL值的命令參數,但你的存儲過程具有這樣的條件與「STAFFID是」,你首先需要獲得「STAFFID是」,然後通過它。

您通過簡單的查詢

Select StaffID from tbl_Staff where [email protected] and Username = @Username ; 

得到STAFFID是你可以按照這個代碼來獲取,STAFFID

public int getstaffid() 
{ 
int staffid = 0; 
SqlCommand cmd = con.CreateCommand(); 
cmd.CommandType = CommandType.Text; 
string query = " Select StaffID from tbl_Staff where [email protected] and Username = @Username"; 
cmd.CommandText = query; 

SqlParameter param = new SqlParameter("@Name", txtFullName.Text); 
cmd.Parameters.Add(param); 
SqlParameter param = new SqlParameter("@Username", txtUserame.Text); 
cmd.Parameters.Add(param); 
try 
{ 
    con.Open(); 

    staffid= (Int32)cmd.ExecuteScalar();  
    return staffid;  
} 
catch (Exception ex) 
{ 
    throw; 
} 
} 
在ManagerUSer()

而且現在

public int ManageUser(String Name, ......) 
{ 
try 
{ 
    int Staffid = getstaffid(); 
    int result = 0; 
    SqlCommand cmd = new SqlCommand("sp_ManageUser", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("@StaffID",Staffid); 
    cmd.Parameters.AddWithValue("@Name", Name); 
    .... 
} 
} 
1

您需要傳遞參數@StaffID的值,因爲SP需要此參數用於UPDATE和DELETE部分。這僅僅是不需要@StaffID值

uc.ManageUser(txtStaffID.Text, txtFullName.Text, ....... 
.... 

public int ManageUser(string staffID, String Name, ......) 
{ 
    try 
    { 
     int result = 0; 
     SqlCommand cmd = new SqlCommand("sp_ManageUser", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@StaffID", Convert.ToInt32(staffID)); 
     cmd.Parameters.AddWithValue("@Name", Name); 
     .... 
} 

當然,這意味着你需要在一些地方保存價值,當你加載用戶數據的INSERT部分。
這可能是一個全局變量或一些文本框在只讀模式或隱藏在您的窗體或作爲用戶類的屬性。 (這會好很多,你可以將用戶的整個實例傳遞給你的UserManager類而不是很多分開的參數)

還要注意參數@StaffID的數據類型。 SP期望一個整數不是一個字符串。

+0

使用Convert.ToInt32(StaffID)給出錯誤沒有重載方法'ManageUser'需要9個參數,因爲我沒有爲表單上的StaffID定義字段。請幫忙。 – 2014-12-04 21:00:30

+0

請注意,我已將字符串_staffID_添加到方法_ManageUser_接收的其他參數。在此變化之前,現在有9個參數,您有10個參數。這意味着每個對_ManageUser_的調用都應該傳遞這個額外的參數。 – Steve 2014-12-04 21:06:27

+0

正如我在回答中所說的,你需要它,否則你不能刪除或更新。因此,當您加載用戶進行編輯時,請保存StaffID的值,並在保存時將其傳回。 – Steve 2014-12-04 21:10:38