如何使用单个存储过程在 ASP.NET MVC DAL类中分配SQL@Action标志?

How to assign SQL @Action flag in ASP.NET MVC DAL class using single stored procedure?

提问人:Nani 提问时间:2/9/2023 最后编辑:marc_sNani 更新时间:2/9/2023 访问量:85

问:

这是我的SQL查询:

CREATE PROCEDURE User_CRUD
    @Action varchar(20),
    @eno int,
    @ename varchar(50),
    @salary money
AS
    IF @Action = 'Insert'
    BEGIN
        INSERT INTO employee (eno, ename, salary) 
        VALUES (@eno, @ename, @salary)
    END
    ELSE IF @Action = 'Update'
    BEGIN
        UPDATE employee 
        SET ename = @ename, salary = @salary 
        WHERE eno = @eno
    END
    ELSE IF @Action = 'Delete'
    BEGIN
        DELETE FROM employee 
        WHERE eno =@eno
    END
    ELSE IF @Action = 'Getemp'
    BEGIN
        SELECT * 
        FROM employee
    END
    ELSE IF @Action = 'Search'
    BEGIN
        SELECT ename, salary 
        FROM employee 
        WHERE eno = @eno
    END

这是我的 DAL 类文件:

public int AddEmployee(Models.Employee e1) 
{
        con.Open();
        
        SqlCommand cmd = new SqlCommand("User_CRUD", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Action", "Insert");
        cmd.Parameters.AddWithValue("@eno", e1.Eno);
        cmd.Parameters.AddWithValue("@ename", e1.Ename);
        cmd.Parameters.AddWithValue("@salary", e1.Salary);
       
        e1.RollNo = Convert.ToInt32(cmd.ExecuteScalar());
        con.Close();
        return e1.RollNo;
}

public int DeleteEmployee(Models.Employee e1)
{
        con.Open();
        
        SqlCommand cmd = new SqlCommand("User_CRUD", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Action", "Delete");
        cmd.Parameters.AddWithValue("@eno",e1.Eno);
        
        int i = cmd.ExecuteNonQuery();
        con.Close();
        return i;
}

public int UpdateEmployee(Models.Employee e1)
{
        con.Open();
        
        SqlCommand cmd = new SqlCommand("User_CRUD", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Action", "Update");
        cmd.Parameters.AddWithValue("@eno", e1.Eno);
        cmd.Parameters.AddWithValue("@ename", e1.Ename);
        cmd.Parameters.AddWithValue("@salary", e1.Salary);
        
        int i = cmd.ExecuteNonQuery();
        con.Close();
        return i;
}

public List<Models.Employee> GetEmployee()
{
        List<Models.Employee> li = new List<Models.Employee>();
        con.Open();
        SqlCommand cmd = new SqlCommand("User_CRUD", con);
        
        SqlDataReader dr = cmd.ExecuteReader();

        if (dr.HasRows)
        {
            while(dr.Read())
            {
                Models.Employee e1= new Models.Employee();
                e1.RollNo = int.Parse(dr[0].ToString());
                e1.Eno = int.Parse(dr[1].ToString());
                e1.Ename = dr[2].ToString();
                e1.Salary = double.Parse(dr[3].ToString());
                cmd.Parameters.AddWithValue("@Action", "Getemp");
                li.Add(e1);
            }
        }
        return li;
}

public Models.Employee SearchEmp(Models.Employee e1)
{
        con.Open();
        SqlCommand cmd = new SqlCommand("User_CRUD", con);
        cmd.CommandType= CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Action", "Search");
        cmd.Parameters.AddWithValue("@eno", e1.Eno);
        
        SqlDataReader dr = cmd.ExecuteReader();

        if (dr.HasRows)
        {
            if (dr.Read())
            {
                e1.Ename= dr[0].ToString();
                e1.Salary= double.Parse(dr[1].ToString());
            }
        }

        con.Close();  
        return e1;
}

当我尝试使用单个过程执行一些 crud 操作时,它显示未提供的方法中的错误。 方法也显示相同的错误。GetEmployee()@ActionSearchEmp()

谁能帮我解决这个问题?

提前致谢

sql-server asp.net-mvc 存储过程 sql-server-2008-r2 数据访问层

评论

4赞 Alex 2/9/2023
让一个 SP 来完成所有这些事情是一种值得怀疑的设计实践。关于您的错误:此行显然位于错误的位置,因为您在调用命令参数后设置了命令参数。cmd.Parameters.AddWithValue("@Action", "Getemp");cmd.ExecuteReader()
3赞 marc_s 2/9/2023
一句忠告 - 不要这样做!这似乎是一个非常聪明的想法 - 但事实并非如此 - 并非如此。SQL Server 将基于第一次执行为存储过程生成执行计划,并且很可能,此执行计划对于所有后续执行都非常糟糕别这样!这也公然违反了单一责任原则。每个操作都应该有一个过程,并且只“联接”DAL 类中的那些过程 - 而不是在数据库级别...
0赞 Nani 2/9/2023
尝试更改cmd.Parameters.AddWithValue(“@Action”, “Getemp”);的位置。但它显示了相同的错误。我该如何执行这个。谁能帮我这个。谢谢
1赞 Dale K 2/9/2023
dbdelta.com/addwithvalue-is-evil
1赞 Alex 2/9/2023
我想你也错过了.cmd.CommandType = CommandType.StoredProcedure;

答: 暂无答案