大家好,欢迎来到IT知识分享网。
之前为了提升复用性和灵活性,都是直接拼接sql的方式,不过这样会导致可能存在sql注入的风险。
今天结合C#的语法改进了一下,感觉效果还不错,分享给大家。
大家也可以看看还有没有更优雅的写法。
以判断一个用户名是否可以被注册为例,重点是以下两个关键函数:
static public bool is_repeat(string loginname) { BAL.User dal = new BAL.User(); dal.wheres.appendSql("username", " LoginName = @LoginName Or Mobile = @LoginName Or EMail = @LoginName "); var tuples = new List<Tuple<string, object>>() { new Tuple<string, object>("LoginName", loginname), }; SqlParameter[] param = dal.Tuples2SqlParam(tuples); return dal.HasRecord(param); }
protected SqlParameter[] Tuples2SqlParam(List<Tuple<string, object>> tuples) { List<SqlParameter> listParams = new List<SqlParameter>(); foreach (var tuple in tuples) { listParams.Add(new SqlParameter("@" + tuple.Item1, tuple.Item2)); } return listParams.ToArray() as SqlParameter[]; }
借助了Tuple模板。
在sql语句组合过程中,对应的就是appendSql,可以自由组合查询条件,也不用区分数据类型;
由于可能涉及到各种各样的值,在tuples数组构造时根据实际需要动态增加就好。
不过有点遗憾的函数中param参数不支持二维数组的方式,不然把写成Tuples2SqlParam写成
protected SqlParameter[] Tuples2SqlParam(param <Tuple<string, object>> tuple)
的方式就更方便了。
不过对比我之前的写法:
protected SqlParameter[] Model2SqlParam4Reg(Model.User model) { List<SqlParameter> listParams = new List<SqlParameter>(); listParams.Add(new SqlParameter("@LoginName", model.LoginName)); listParams.Add(new SqlParameter("@Password", model.Password)); return listParams.ToArray() as SqlParameter[]; }
有多少业务场景就得写多少种转换函数,复用性还是提升了不少。
你有啥好建议吗?
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/55272.html