C#中,仿效Java中,SQL参数以?替代的做法,解决IN的防注入问题(续)
2011-07-27 13:09
567 查看
昨天写了C#中仿效Java内SQL参数以?替代的方案,但是区分了单个参数和数组参数,而且只能支持其中的一种,不能2种情况都支持。
今天突然发现,原来可以利用params object[]参数的时候可以将数组当作参数传入,当传入对象类型的IsArray为true的时候,可以区分出单个参数还是数组参数,这样就可以在任何情况下都能将参数以?的形式替代。
由于SQL内的参数,可以是单个参数和数组参数混合的形式,因此需要属性来区分数组参数和单个参数的下标。
为了方便获取当前的单个参数名和数组参数名,我使用属性的Get来获取名字。
转化的过程中,主要是对于参数替代符号?的处理,我使用正则类的Replace方法来实现。具体代码如下:
个人觉得,有些想法应该尝试一下,虽然一开始写的不好,但是随着多次实践与思考,肯定能将代码写的更好,写的不好之处,请多多见谅。
今天突然发现,原来可以利用params object[]参数的时候可以将数组当作参数传入,当传入对象类型的IsArray为true的时候,可以区分出单个参数还是数组参数,这样就可以在任何情况下都能将参数以?的形式替代。
由于SQL内的参数,可以是单个参数和数组参数混合的形式,因此需要属性来区分数组参数和单个参数的下标。
/// <summary> /// 单参数下标 /// </summary> int ParamIndex { get; set; } /// <summary> /// 数组参数下标 /// </summary> int ArrayIndex { get; set; }
为了方便获取当前的单个参数名和数组参数名,我使用属性的Get来获取名字。
/// <summary> /// 单参数名 /// </summary> string SingleParam { get { return string.Format("@param_{0}", this.ParamIndex); } } /// <summary> /// 数组参数名 /// </summary> string ArrayParam { get { return string.Format("@array_{0}", this.ArrayIndex); } }
转化的过程中,主要是对于参数替代符号?的处理,我使用正则类的Replace方法来实现。具体代码如下:
/// <summary> /// 转化问号参数 /// </summary> /// <param name="sql">带问号的SQL语句</param> /// <param name="paramValues">参数值数组</param> /// <returns></returns> public SqlParameter[] CastUnknowMark(ref string sql, object[] paramValues) { //如存在问号参数并且参数值数组>0,则遍历每个问号参数,如参数下标超出参数值数量范围则抛出异常, //如当前下标的参数值为数组,则以等同于参数值数组数量的参数替换问号参数,否则替换为单个参数 IList<SqlParameter> parameterList = new List<SqlParameter>(); if(0 <= sql.IndexOf("?") && paramValues != null && 0 < paramValues.Length) { sql = new Regex(@"\?").Replace(sql, mark => { string paramName = this.SingleParam; if(this.ParamIndex < paramValues.Length) { object paramValue = paramValues[this.ParamIndex]; if(paramValue.GetType().IsArray) { IList values = paramValue as IList; IList<string> paramNameList = new List<string>(); foreach(object obj in values) { this.ArrayIndex++; paramNameList.Add(this.ArrayParam); parameterList.Add(new SqlParameter(this.ArrayParam, obj)); } paramName = string.Join(",", paramNameList.ToArray()); } else { parameterList.Add(new SqlParameter(this.SingleParam, paramValue)); } } else { throw new Exception("参数值数量小于问号参数数量!"); } this.ParamIndex++; return paramName; }); } return parameterList.ToArray(); }
个人觉得,有些想法应该尝试一下,虽然一开始写的不好,但是随着多次实践与思考,肯定能将代码写的更好,写的不好之处,请多多见谅。
相关文章推荐
- C#中,仿效Java中,SQL参数以?替代的做法,解决IN的防注入问题
- "java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 12"异常问题的解决
- 解决SQL中in参数在存储过程中的传递有关问题
- 解决SQL中in参数在存储过程中的传递问题
- java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 1解决办法
- 关于spring boot自动注入出现Consider defining a bean of type 'xxx' in your configuration问题解决方案
- 解决存储过程中SQL字符串语句执行引入参数的问题
- 如何解决java.lang.IllegalArgumentException: Illegal character in query at index 的问题?
- ubuntu中geany 编译java--in/sh: javac: not found问题解决
- Sql 2005 存储过程参数【多次引用】结合C#影响输出速度问题
- Java 开发报表时参数丢失问题解决方案
- C#解决EventHandler参数无法传递问题
- java.sql.SQLException: 索引中丢失 IN 或 OUT 参数
- Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack问题解决
- 解决Exception in thread "main" java.lang.NoClassDefFoundError: java/sql/Savepoint
- JMeter命令行执行及问题解决 Error in NonGUIDriver java.lang.RuntimeException: Could not find the TestPlan class!
- java ,c# 解决安全沙箱问题
- 润乾报表报出“索引中丢失 IN 或 OUT 参数”问题解决办法
- 关于在java中连接MS SQL Server 2005 JDBC的问题及解决办法
- 奋斗了n(n>7)小时,终于解决了连接远程JMS JNDI的问题:java.rmi.NoSuchObjectException: no such object in table