您的位置:首页 > 编程语言 > Java开发

C#中,仿效Java中,SQL参数以?替代的做法,解决IN的防注入问题(续)

2011-07-27 13:09 477 查看
昨天写了C#中仿效Java内SQL参数以?替代的方案,但是区分了单个参数和数组参数,而且只能支持其中的一种,不能2种情况都支持。

今天突然发现,原来可以利用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();
}


  

个人觉得,有些想法应该尝试一下,虽然一开始写的不好,但是随着多次实践与思考,肯定能将代码写的更好,写的不好之处,请多多见谅。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐