Corrected Time and Date types handling in SQL Server.

This commit is contained in:
2024-07-24 09:27:34 +02:00
parent 24b0b521a8
commit 6de41e166e
5 changed files with 1576 additions and 1524 deletions

View File

@@ -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>

View File

@@ -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)
{