日期:2014-05-17 浏览次数:20423 次
//辅助类 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来获取。