日期:2014-05-17 浏览次数:20510 次
//辅助类
public int Operation(string sql, params SqlParameter[] paras)
{
Connection.Open();
SqlCommand comm = new SqlCommand(sql, Connection);
if (paras.Length > 0)
{
comm.Parameters.AddRange(paras);
}
int result = comm.ExecuteNonQuery();
connection.Close();
return result;
}
//DAL
public void insertInfo(SalseGoodsModel salse)
{
StringBuilder sql = new StringBuilder();
sql.Append("insert into salseGoods( salseID,salseMoney,salseNum,collectMoney,retrieveMoney,adminID)");
sql.Append(" values(@salseID,@salseMoney,@salseNum,@colltectMoney,@retrieveMoney,@adminID)");
SqlParameter[] parameter = new SqlParameter[]
{
new SqlParameter("salseID",salse.salseID),
new SqlParameter("salseMoney",salse.slaseMoney),
new SqlParameter("salseNum",salse.salseNum),
new SqlParameter("colltectMoney",salse.collectMoney),
new SqlParameter("retrieveMoney",salse.retrieveMoney),
new SqlParameter("adminID",salse.adminid)
};
db.Operation(sql.ToString(), parameter);
}
}
//BLL
public void CreateGoodsBillInfo(SalseGoodsModel salesDetailed,ref string bill )
{
salesDetailed.salseID = CreateGoodsBill();
bill = salesDetailed.salseID;
salseGoodsDAL.insertInfo(salesDetailed);
}
------解决方案--------------------
1、在很多地方需要调用GetList,传入的strWhere为防止注入需要进行过滤,但是过滤字符串又不是万能的。所以是否有必要写一个 public DataSet GetList(string strWhere,Sqlparameter [] parameters).
------------------------
个人感觉过滤的问题是分项目的,一般给企业或政府做项目,基本上没有必要过滤,只要控制可输入的字符串不要过长,在前台显示的时候进行编码即可。
2、既然分层,DAL负责数据,strWhere这个参数很明显需要知道数据库结构,所以是不是应该把所有调用GetList方法写入DAL。
--------------------------------------------
如果不喜欢strWhere 你也可以传入实体模型作为参数,同时在属性 get上进行验证,都是可以的。
------解决方案--------------------
LZ,你提的问题是否可以理成这样三个:
1.使用参数,是否可以有效地预防SQL注入
2.直接在DAL层处理业务关系就好了,为什么还需要BLL层来专门处理业务逻辑
3.过多的引用程序集,会不会对性能构成影响
------解决方案--------------------
还有一点啊,strWhere要知道数据结构,和是否要把调用GetList()的方法写入DAL,是没有因果关系的。
strWhere所要获取的数据结构,也可以通过业务层来指定DAL来获取。