首页 > 代码库 > SqlHelper中IN集合场景下的参数处理
SqlHelper中IN集合场景下的参数处理
我手头有个古老的项目,持久层用的是古老的ADO.net。前两天去昆明旅游,其中的一个景点是云南民族村,通过导游介绍知道了一个古老的民族——基诺族,这是我国的第56个民族。 项目里的ado.net和基诺族一样古老。
话说,项目里数据访问层,好多都是拼的sql,这给sql注入提供了可乘之机,为了系统安全,决定在有限的时间内,将它改成参数化。
其中,有个根据多个订单号查询支付单的方法,签名如下:
public DataTable GetAlipayNotifyRecords(AlipayPaymentStatus status, params string[] trade_no)
那么,问题来了,因为sql里有in, 而 in(@no)的方式是行不通的。
怎么办呢? 首先想到的是对参数做处理:
public DataTable GetAlipayNotifyRecords(AlipayPaymentStatus status, params string[] trade_no){ string sql = @"select * from T_AlipayNotityRecord where trade_status=@trade_status and trade_no in(@trade_no)"; //string inValue = "http://www.mamicode.com/‘" + string.Join("‘,‘", trade_no) + "‘";//= string.Join(",", trade_no) string inValue = http://www.mamicode.com/""; trade_no.ToList().ForEach(no => inValue += " union all select ‘" + no+"‘"); inValue = inValue.Substring(" union all".Length); List<SqlParameter> paramList = new List<SqlParameter>() { new SqlParameter("@trade_status",status.ToString()), new SqlParameter("@trade_no",inValue), }; var ds = SqlHelper.SqlDataSet(ConfigFile.PayCenterConnection, sql, CommandType.Text, paramList.ToArray()); if (ds == null || ds.Tables.Count == 0) return null; return ds.Tables[0];}
经测试,无效。经分析可知,sqlhelper会把你参数值当成字符串,不会对其做转义。所以,不管怎么处理,都还是一串字符串。
后来呢,想到了一个方法,借union之力实现了:
public DataTable GetAlipayNotifyRecords(AlipayPaymentStatus status, params string[] trade_no){ string sql = @"select * from T_AlipayNotityRecord where trade_status=@trade_status and ({0})"; List<SqlParameter> paramList = new List<SqlParameter>() { new SqlParameter("@trade_status",status.ToString()), }; string sql1 = ""; for (int i=0;i<trade_no.Length;i++) { sql1 += " or trade_no=@no" + i; paramList.Add(new SqlParameter("@no" + i, trade_no[i])); } sql = string.Format(sql, sql1.Substring(" or ".Length)); var ds = SqlHelper.SqlDataSet(ConfigFile.PayCenterConnection, sql, CommandType.Text, paramList.ToArray()); if (ds == null || ds.Tables.Count == 0) return null; return ds.Tables[0];}
【结语】无意中从园子里看到一篇文章,不该活着的SqlHelper和DBHelper,很赞!
SqlHelper中IN集合场景下的参数处理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。