2014-12-04 50 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