避免SQL漏洞注入攻击,往往采用的是参数化查询!然而在使用参数化查询中,往往为了方便就直接通过构造方法来进行数据的初始化了,然而这样就引发一个这样的问题,当参数值为0时,就出现参数为空的情况了。
一.参数化查询的几种写法:
- 使用parameter写法:
- 写法一:
-
-
Parameter p =new Parameter("@id",值); cmd.Parameters.Add(p);
- 写法二(推荐):
-
Parameter p =new Parameter() {ParameterName="@id",Value="值"}; cmd.Parameters.Add(p);
-
- 使用parameter数组写法:
- 写法一:
-
SqlParameter[] pms= { new SqlParameter("@id",值), ....... } ; cmd.Parameter.AddRange(pms);
- 写法二(推荐):
-
SqlParameter[] pms= { new SqlParameter("@id", SqlDbType.VarChar), ....... } ; parameters[0].Value = "值"; cmd.Parameter.AddRange(pms);
二.通过构造方法存在的一点问题:
在参数化查询使用使用构造方法时,在进行构造方法匹配时:零(0)会被匹配成 MySqlDbType类型
- MySqlParameter的几种构造方法:
public MySqlParameter(); public MySqlParameter(string parameterName, MySqlDbType dbType); public MySqlParameter(string parameterName, object value); public MySqlParameter(string parameterName, MySqlDbType dbType, int size); public MySqlParameter(string parameterName, MySqlDbType dbType, int size, string sourceColumn); public MySqlParameter(string parameterName, MySqlDbType dbType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string sourceColumn, DataRowVersion sourceVersion, object value);
问:0为什么没有匹配成object类型方法呢?
解释:MySqlDbType是一个枚举类型,0就对应了Decimal类型了
public enum MySqlDbType { Decimal = 0, Byte = 1, Int16 = 2, Int32 = 3, Float = 4, Double = 5, Timestamp = 7, Int64 = 8, Int24 = 9, Date = 10, Time = 11, DateTime = 12, [Obsolete("The Datetime enum value is obsolete. Please use DateTime.")] Datetime = 12, Year = 13, Newdate = 14, VarString = 15, Bit = 16, }
注:所以在进行参数化查询时,尽量选择方法二,进行参数化查询