Commit fa06c306 authored by Marc Gravell's avatar Marc Gravell
parent dc6b077f
...@@ -345,7 +345,7 @@ object ITypeHandler.Parse(Type destinationType, object value) ...@@ -345,7 +345,7 @@ object ITypeHandler.Parse(Type destinationType, object value)
void ITypeHandler.SetValue(IDbDataParameter parameter, object value) void ITypeHandler.SetValue(IDbDataParameter parameter, object value)
{ {
parameter.Value = ((object)value) ?? DBNull.Value; parameter.Value = SanitizeParameterValue(value);
if (parameter is System.Data.SqlClient.SqlParameter) if (parameter is System.Data.SqlClient.SqlParameter)
{ {
((System.Data.SqlClient.SqlParameter)parameter).UdtTypeName = udtTypeName; ((System.Data.SqlClient.SqlParameter)parameter).UdtTypeName = udtTypeName;
...@@ -2745,7 +2745,7 @@ public static void PackListParameters(IDbCommand command, string namePrefix, obj ...@@ -2745,7 +2745,7 @@ public static void PackListParameters(IDbCommand command, string namePrefix, obj
if (FeatureSupport.Get(command.Connection).Arrays) if (FeatureSupport.Get(command.Connection).Arrays)
{ {
var arrayParm = command.CreateParameter(); var arrayParm = command.CreateParameter();
arrayParm.Value = value ?? DBNull.Value; arrayParm.Value = SanitizeParameterValue(value);
arrayParm.ParameterName = namePrefix; arrayParm.ParameterName = namePrefix;
command.Parameters.Add(arrayParm); command.Parameters.Add(arrayParm);
} }
...@@ -2775,7 +2775,7 @@ public static void PackListParameters(IDbCommand command, string namePrefix, obj ...@@ -2775,7 +2775,7 @@ public static void PackListParameters(IDbCommand command, string namePrefix, obj
} }
else else
{ {
listParam.Value = item ?? DBNull.Value; listParam.Value = SanitizeParameterValue(item);
command.Parameters.Add(listParam); command.Parameters.Add(listParam);
} }
} }
...@@ -2832,7 +2832,34 @@ public static void PackListParameters(IDbCommand command, string namePrefix, obj ...@@ -2832,7 +2832,34 @@ public static void PackListParameters(IDbCommand command, string namePrefix, obj
} }
} }
internal static object SanitizeParameterValue(object value)
{
if (value == null) return DBNull.Value;
if (value is Enum)
{
TypeCode typeCode;
if (value is IConvertible)
{
typeCode = ((IConvertible)value).GetTypeCode();
}
else
{
typeCode = TypeExtensions.GetTypeCode(Enum.GetUnderlyingType(value.GetType()));
}
switch (typeCode)
{
case TypeCode.Byte: return (byte)value;
case TypeCode.SByte: return (sbyte)value;
case TypeCode.Int16: return (short)value;
case TypeCode.Int32: return (int)value;
case TypeCode.Int64: return (long)value;
case TypeCode.UInt16: return (ushort)value;
case TypeCode.UInt32: return (uint)value;
case TypeCode.UInt64: return (ulong)value;
}
}
return value;
}
private static IEnumerable<PropertyInfo> FilterParameters(IEnumerable<PropertyInfo> parameters, string sql) private static IEnumerable<PropertyInfo> FilterParameters(IEnumerable<PropertyInfo> parameters, string sql)
{ {
return parameters.Where(p => Regex.IsMatch(sql, @"[?@:]" + p.Name + "([^a-z0-9_]+|$)", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.CultureInvariant)); return parameters.Where(p => Regex.IsMatch(sql, @"[?@:]" + p.Name + "([^a-z0-9_]+|$)", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.CultureInvariant));
...@@ -4758,7 +4785,7 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity) ...@@ -4758,7 +4785,7 @@ protected void AddParameters(IDbCommand command, SqlMapper.Identity identity)
p.Direction = param.ParameterDirection; p.Direction = param.ParameterDirection;
if (handler == null) if (handler == null)
{ {
p.Value = val ?? DBNull.Value; p.Value = SqlMapper.SanitizeParameterValue(val);
if (dbType != null && p.DbType != dbType) if (dbType != null && p.DbType != dbType)
{ {
p.DbType = dbType.Value; p.DbType = dbType.Value;
...@@ -5073,7 +5100,7 @@ void SqlMapper.ICustomQueryParameter.AddParameter(IDbCommand command, string nam ...@@ -5073,7 +5100,7 @@ void SqlMapper.ICustomQueryParameter.AddParameter(IDbCommand command, string nam
} }
internal static void Set(IDbDataParameter parameter, DataTable table, string typeName) internal static void Set(IDbDataParameter parameter, DataTable table, string typeName)
{ {
parameter.Value = (object)table ?? DBNull.Value; parameter.Value = SqlMapper.SanitizeParameterValue(table);
if (string.IsNullOrEmpty(typeName) && table != null) if (string.IsNullOrEmpty(typeName) && table != null)
{ {
typeName = SqlMapper.GetTypeName(table); typeName = SqlMapper.GetTypeName(table);
...@@ -5135,7 +5162,7 @@ public void AddParameter(IDbCommand command, string name) ...@@ -5135,7 +5162,7 @@ public void AddParameter(IDbCommand command, string name)
} }
var param = command.CreateParameter(); var param = command.CreateParameter();
param.ParameterName = name; param.ParameterName = name;
param.Value = (object)Value ?? DBNull.Value; param.Value = SqlMapper.SanitizeParameterValue(Value);
if (Length == -1 && Value != null && Value.Length <= DefaultLength) if (Length == -1 && Value != null && Value.Length <= DefaultLength)
{ {
param.Size = DefaultLength; param.Size = DefaultLength;
......
...@@ -3208,9 +3208,7 @@ public void LiteralReplacementEnumAndString() ...@@ -3208,9 +3208,7 @@ public void LiteralReplacementEnumAndString()
y.Equals(123.45M); y.Equals(123.45M);
z.Equals(AnotherEnum.A); z.Equals(AnotherEnum.A);
} }
#if DNXCORE50
[FrameworkFail("https://github.com/dotnet/corefx/issues/1613")]
#endif
public void LiteralReplacementDynamicEnumAndString() public void LiteralReplacementDynamicEnumAndString()
{ {
var args = new DynamicParameters(); var args = new DynamicParameters();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment