Corrected Time and Date types handling in SQL Server.
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
<Copyright>Copyright © RUSSEK Software 2012-2023</Copyright>
|
||||
<Company>RUSSEK Software</Company>
|
||||
<Authors>Grzegorz Russek</Authors>
|
||||
<VersionPrefix>1.6</VersionPrefix>
|
||||
<VersionPrefix>1.7</VersionPrefix>
|
||||
<RepositoryUrl>https://git.dr4cul4.pl/RUSSEK-Software/DynamORM</RepositoryUrl>
|
||||
<PackageProjectUrl>https://dr4cul4.pl</PackageProjectUrl>
|
||||
<Product>DynamORM</Product>
|
||||
|
||||
@@ -282,9 +282,9 @@ namespace DynamORM
|
||||
p.DbType = TypeMap.TryGetNullable(type) ?? DbType.String;
|
||||
|
||||
if (type == typeof(DynamicExpando) || type == typeof(ExpandoObject))
|
||||
p.Value = ((IDictionary<string, object>)item).Values.FirstOrDefault();
|
||||
p.Value = CorrectValue(p.DbType, ((IDictionary<string, object>)item).Values.FirstOrDefault());
|
||||
else
|
||||
p.Value = item;
|
||||
p.Value = CorrectValue(p.DbType, item);
|
||||
|
||||
if (p.DbType == DbType.String)
|
||||
p.Size = item.ToString().Length > 4000 ? -1 : 4000;
|
||||
@@ -324,7 +324,7 @@ namespace DynamORM
|
||||
p.Scale = 4;
|
||||
}
|
||||
|
||||
p.Value = value == null ? DBNull.Value : value;
|
||||
p.Value = CorrectValue(p.DbType, value);
|
||||
}
|
||||
else if (value == null || value == DBNull.Value)
|
||||
p.Value = DBNull.Value;
|
||||
@@ -337,7 +337,7 @@ namespace DynamORM
|
||||
else if (p.DbType == DbType.String)
|
||||
p.Size = value.ToString().Length > 4000 ? -1 : 4000;
|
||||
|
||||
p.Value = value;
|
||||
p.Value = CorrectValue(p.DbType, value);
|
||||
}
|
||||
|
||||
cmd.Parameters.Add(p);
|
||||
@@ -345,6 +345,24 @@ namespace DynamORM
|
||||
return cmd;
|
||||
}
|
||||
|
||||
private static object CorrectValue(DbType type, object value)
|
||||
{
|
||||
if (value == null || value == DBNull.Value)
|
||||
return DBNull.Value;
|
||||
|
||||
if ((type == DbType.String || type == DbType.AnsiString || type == DbType.StringFixedLength || type == DbType.AnsiStringFixedLength) &&
|
||||
!(value is string))
|
||||
return value.ToString();
|
||||
else if (type == DbType.Guid && value is string)
|
||||
return Guid.Parse(value.ToString());
|
||||
else if (type == DbType.Guid && value is byte[] && ((byte[])value).Length == 16)
|
||||
return new Guid((byte[])value);
|
||||
else if (type == DbType.DateTime && value is TimeSpan) // HACK: This is specific for SQL Server, to be verified with other databases
|
||||
return DateTime.Today.Add((TimeSpan)value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/// <summary>Extension for adding single parameter determining only type of object.</summary>
|
||||
/// <param name="cmd">Command to handle.</param>
|
||||
/// <param name="builder">Query builder containing schema.</param>
|
||||
@@ -377,7 +395,7 @@ namespace DynamORM
|
||||
p.Scale = 4;
|
||||
}
|
||||
|
||||
p.Value = item.Value == null ? DBNull.Value : item.Value;
|
||||
p.Value = item.Value == null ? DBNull.Value : CorrectValue(p.DbType, item.Value);
|
||||
}
|
||||
else if (item.Value == null || item.Value == DBNull.Value)
|
||||
p.Value = DBNull.Value;
|
||||
@@ -390,7 +408,7 @@ namespace DynamORM
|
||||
else if (p.DbType == DbType.String)
|
||||
p.Size = item.Value.ToString().Length > 4000 ? -1 : 4000;
|
||||
|
||||
p.Value = item.Value;
|
||||
p.Value = CorrectValue(p.DbType, item.Value);
|
||||
}
|
||||
|
||||
cmd.Parameters.Add(p);
|
||||
@@ -417,7 +435,7 @@ namespace DynamORM
|
||||
param.Size = size;
|
||||
param.Precision = precision;
|
||||
param.Scale = scale;
|
||||
param.Value = value;
|
||||
param.Value = CorrectValue(param.DbType, value);
|
||||
command.Parameters.Add(param);
|
||||
|
||||
return command;
|
||||
@@ -463,7 +481,7 @@ namespace DynamORM
|
||||
param.DbType = databaseType;
|
||||
param.Precision = precision;
|
||||
param.Scale = scale;
|
||||
param.Value = value;
|
||||
param.Value = CorrectValue(param.DbType, value);
|
||||
command.Parameters.Add(param);
|
||||
|
||||
return command;
|
||||
@@ -484,7 +502,7 @@ namespace DynamORM
|
||||
param.DbType = databaseType;
|
||||
param.Precision = precision;
|
||||
param.Scale = scale;
|
||||
param.Value = value;
|
||||
param.Value = CorrectValue(param.DbType, value);
|
||||
command.Parameters.Add(param);
|
||||
|
||||
return command;
|
||||
@@ -524,7 +542,7 @@ namespace DynamORM
|
||||
param.Direction = parameterDirection;
|
||||
param.DbType = databaseType;
|
||||
param.Size = size;
|
||||
param.Value = value ?? DBNull.Value;
|
||||
param.Value = CorrectValue(param.DbType, value ?? DBNull.Value);
|
||||
command.Parameters.Add(param);
|
||||
|
||||
return command;
|
||||
@@ -543,7 +561,7 @@ namespace DynamORM
|
||||
param.ParameterName = parameterName;
|
||||
param.DbType = databaseType;
|
||||
param.Size = size;
|
||||
param.Value = value ?? DBNull.Value;
|
||||
param.Value = CorrectValue(param.DbType, value ?? DBNull.Value);
|
||||
command.Parameters.Add(param);
|
||||
|
||||
return command;
|
||||
@@ -560,7 +578,7 @@ namespace DynamORM
|
||||
IDbDataParameter param = command.CreateParameter();
|
||||
param.ParameterName = parameterName;
|
||||
param.DbType = databaseType;
|
||||
param.Value = value ?? DBNull.Value;
|
||||
param.Value = CorrectValue(param.DbType, value ?? DBNull.Value);
|
||||
command.Parameters.Add(param);
|
||||
|
||||
return command;
|
||||
@@ -611,7 +629,8 @@ namespace DynamORM
|
||||
{
|
||||
try
|
||||
{
|
||||
((IDbDataParameter)command.Parameters[parameterName]).Value = value;
|
||||
var p = ((IDbDataParameter)command.Parameters[parameterName]);
|
||||
p.Value = CorrectValue(p.DbType, value);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -630,7 +649,8 @@ namespace DynamORM
|
||||
{
|
||||
try
|
||||
{
|
||||
((IDbDataParameter)command.Parameters[index]).Value = value;
|
||||
var p = ((IDbDataParameter)command.Parameters[index]);
|
||||
p.Value = CorrectValue(p.DbType, value);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user