ASP.Net WebForms - 在CodeBehind中填充SqlParamater列表是否可以?

时间:2017-12-19 04:23:39

标签: c# asp.net webforms

我们制作了一个3层WebForms应用程序。

我们在DAL中有接受强类型参数的方法:

    public Person GetPerson(int? personId, string personName = null)
    {
        SqlCommand command = new SqlCommand();
        command.CommandType = CommandType.StoredProcedure;

        command.Parameters.Clear();
        command.CommandText = "usp_GetPerson";
        command.Parameters.Add("@PersonId", SqlDbType.NVarChar).Value = personId ?? (object)DBNull.Value;
        command.Parameters.Add("@PersonName", SqlDbType.NVarChar).Value = personName ?? (object)DBNull.Value;

        // run SqlCommand
    }

我正在尝试更改接受SqlParamater对象列表的方法,因此我们不必经常更改DAL代码,尤其是我们经常要求更改/添加/删除从中传递的大量数据我们的aspx页面到数据库。这是我想要实现的:

    public Persons GetPerson(List<SqlParameter> sqlParameterList = null)
    {
        // initialize SqlCommand object and properties

        if (sqlParameterList != null)
        {
            command.Parameters.AddRange(sqlParameterList.ToArray());
        }

        // run SqlCommand
    }

这样做会让DAL非常接受SqlParamater对象的动态列表,如果我们需要接受的参数有任何变化,我们只需要更新存储过程和CodeBehind。这也意味着我们必须在我们的aspx页面的CodeBehind中填充SqlParamater列表,还是应该在BLL中执行此操作?

我对n层架构的不同层次没有充分的理解,所以我有点不确定哪个流程必须放在哪里。目前,BLL仅作为CodeBehind和DAL之间的链接而没有任何业务逻辑。

如果有更好的实施方法,我也愿意接受建议。

1 个答案:

答案 0 :(得分:0)

首先更改您的数据访问代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DAL
{
public class DataAccessLayer
{
    SqlConnection con = new 
    SqlConnection(ConfigurationSettings.AppSettings["DBCS"]);
    SqlCommand cmd;
    DataSet ds;
    SqlDataAdapter da;

    public void openConection()
    {
        if (con.State == ConnectionState.Open)
        {
            con.Close();
        }
        con.Open();
    }


    public void sendonly(string SP_Name, SqlParameter[] param)
    {
        try
        {
            openConection();
            cmd = new SqlCommand(SP_Name, con);
            cmd.CommandType = CommandType.StoredProcedure;
            for (int i = 0; i < param.Length; i++)
            {
                cmd.Parameters.Add(param[i]);
            }
            cmd.ExecuteNonQuery();

        }
        catch (Exception Ex)
        {
            throw Ex;
        }
        finally
        {
            con.Close();
            cmd.Dispose();
        }

    }

    public DataSet getonly(string SP_Name)
    {
        try
        {
            openConection();
            cmd = new SqlCommand(SP_Name, con);
            cmd.CommandType = CommandType.StoredProcedure;
            da = new SqlDataAdapter(cmd);
            ds = new DataSet();
            da.Fill(ds);
        }
        catch (Exception Ex)
        {
            throw Ex;
        }
        finally
        {
            con.Close();
            cmd.Dispose();
            da.Dispose();
        }
        return ds;

    }

    public DataSet sendget(string SP_Name, SqlParameter[] param)
    {
        try
        {
            openConection();
            cmd = new SqlCommand(SP_Name, con);
            cmd.CommandType = CommandType.StoredProcedure;
            for (int i = 0; i < param.Length; i++)
            {
                cmd.Parameters.Add(param[i]);
            }
            da = new SqlDataAdapter(cmd);
            ds = new DataSet();
            da.Fill(ds);
        }
        catch (Exception Ex)
        {
            throw Ex;
        }
        finally
        {
            con.Close();
            cmd.Dispose();
            da.Dispose();
        }
        return ds;
    }
}

}

您的业务层应该是插入

 public void Employee_Insert(string a, string b, int c , int d)
    {
        SqlParameter[] param1 = { 
                                new SqlParameter("@Name",a),
                                new SqlParameter("@Address",b),
                                new SqlParameter("@Age",c),
                                new SqlParameter("@country",d)
                                };
        _dal.sendonly("usp_Employee_insert", param1);
    }