【问题标题】:Can't delete User from table through windows form [closed]无法通过 Windows 表单从表中删除用户 [关闭]
【发布时间】:2014-12-04 20:36:01
【问题描述】:

我在从表中删除用户时遇到问题。我可以将数据从表单插入到表中,但在删除它时只会将 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)
    {

    }
    }
}

管理用户类

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 Name=@Name,Address=@Address,Phone=@Phone,Email=@Email,JoinedDate=@JoinedDate,Username=@Username,Password=@Password,CreatedDate=@CreatedDate where StaffID=@StaffID
if(@Mode='D')
 Delete from tbl_Staff where StaffID=@StaffID
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;
    }

用户类。全选用户

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;
        }
    }

【问题讨论】:

  • 您是否为参数@StaffID 传递了DBNull.Value?
  • 是的,由于 StaffID 是自动递增的,我使用 DBNull.Value 将值从表单传递到表..
  • 在删除时您需要该值,否则将永远不会删除任何用户
  • 如果您不提供@StaffIDif(@Mode='D') Delete from tbl_Staff where StaffID=@StaffID 不会删除任何内容

标签: c# winforms class stored-procedures


【解决方案1】:

您需要传递参数 @StaffID 的值,因为 SP 需要此参数用于 UPDATE 和 DELETE 部分。只有 INSERT 部分不需要 @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);
        ....
}

当然,这意味着您需要在加载用户数据时将该值保存在某个位置。
这可能是一个全局变量或只读模式下的某个文本框,或隐藏在表单中或作为 User 类的属性。 (这样会好很多。您可以将 User 的整个实例传递给您的 UserManager 类,而不是许多单独的参数)

还要注意参数@StaffID 的数据类型。 SP 需要一个整数而不是字符串。

【讨论】:

  • 使用 Convert.ToInt32(StaffID) 给出错误 'ManageUser' 方法没有重载需要 9 个参数,因为我没有在表单上为 StaffID 定义字段。请帮忙。
  • 请注意,我已将该字符串 staffID 添加到方法 ManageUser 接收的其他参数中。在此更改之前有 9 个参数,现在您有 10 个参数。这意味着对 ManageUser 的每次调用都应该传递那个额外的参数。
  • 正如我在回答中所说,您需要它,否则您无法删除或更新。因此,当您加载用户进行编辑时,保存 StaffID 的值并在保存时将其传回。
  • 那么我应该在 ManageUser 中为 StaffID 传递什么,因为我在表单上没有 StaffID 字段作为用户名的 txtUserName.Text。请帮忙。
  • 如果 UserName 有一个 UNIQUE 索引,那么您可以将它用于 DELETE 和 UPDATE。您的表中有唯一的用户名吗?
【解决方案2】:

您在命令参数的“StaffID”列中传递了一个 NULL 值,但您的存储过程具有“StaffID”的 where 条件,首先您需要获取“StaffID”然后传递它。

您通过简单的查询获得 StaffID

Select StaffID from tbl_Staff where Name=@Name and Username = @Username  ;

您可以按照此代码获取 Staffid

public int getstaffid()
{ 
int staffid = 0;
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.Text;
string query = " Select StaffID from tbl_Staff where Name=@Name 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);
    ....
}
}

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 2019-12-15
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多