我们制作了一个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之间的链接而没有任何业务逻辑。
如果有更好的实施方法,我也愿意接受建议。
答案 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);
}