Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 66189a2

Browse files
committed
Add support for data type conversion of db params in custom SQL
1 parent 3cc2a80 commit 66189a2

File tree

4 files changed

+49
-4
lines changed

4 files changed

+49
-4
lines changed

src/ServiceStack.OrmLite/IOrmLiteDialectProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ string GetColumnDefinition(
106106
Dictionary<string, FieldDefinition> GetFieldDefinitionMap(ModelDefinition modelDef);
107107

108108
object GetFieldValue(FieldDefinition fieldDef, object value);
109+
object GetFieldValue(Type fieldType, object value);
109110

110111
string ToUpdateRowStatement(object objWithProperties, ICollection<string> UpdateFields = null);
111112

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -903,6 +903,38 @@ public object GetFieldValue(FieldDefinition fieldDef, object value)
903903
}
904904
}
905905

906+
public object GetFieldValue(Type fieldType, object value)
907+
{
908+
if (value == null)
909+
return null;
910+
911+
IOrmLiteConverter converter = null;
912+
try
913+
{
914+
var isEnum = value.GetType().IsEnum || fieldType.IsEnum;
915+
if (isEnum)
916+
{
917+
converter = EnumConverter;
918+
return converter.ToDbValue(fieldType, value);
919+
}
920+
921+
if (Converters.TryGetValue(fieldType, out converter))
922+
return converter.ToDbValue(fieldType, value);
923+
924+
converter = !fieldType.IsValueType
925+
? (IOrmLiteConverter)ReferenceTypeConverter
926+
: ValueTypeConverter;
927+
928+
return converter.ToDbValue(fieldType, value);
929+
}
930+
catch (Exception ex)
931+
{
932+
Log.Error("Error in {0}.ToDbValue() for field of Type '{1}' with value '{2}'"
933+
.Fmt(converter.GetType().Name, fieldType, value != null ? value.GetType().Name : "undefined"), ex);
934+
throw;
935+
}
936+
}
937+
906938
protected virtual object GetValueOrDbNull<T>(FieldDefinition fieldDef, object obj)
907939
{
908940
var value = GetValue<T>(fieldDef, obj);

src/ServiceStack.OrmLite/OrmLiteReadCommandExtensions.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,14 @@ internal static IDbCommand SetParameters<T>(this IDbCommand dbCmd, object anonTy
159159
value = dialectProvider.GetFieldValue(fieldDef, value);
160160
var valueType = value != null ? value.GetType() : null;
161161
if (valueType != null && valueType != pi.PropertyType)
162-
{
163162
dialectProvider.InitDbParam(p, valueType);
164-
}
163+
}
164+
else
165+
{
166+
value = dialectProvider.GetFieldValue(pi.PropertyType, value);
167+
var valueType = value != null ? value.GetType() : null;
168+
if (valueType != null && valueType != pi.PropertyType)
169+
dialectProvider.InitDbParam(p, valueType);
165170
}
166171

167172
p.Value = value == null ?

tests/ServiceStack.OrmLite.Tests/DateTimeTests.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,9 +215,16 @@ public void Can_Select_Date_with_SqlList()
215215

216216
var row = db.SqlList<DateTimeObject>(
217217
"SELECT * FROM {0} WHERE Test = @dateTime".Fmt("DateTimeObject".SqlTable()), new { dateTime });
218-
219-
row.PrintDump();
220218
Assert.That(dateTime, Is.EqualTo(row[0].Test));
219+
220+
row = db.SqlList<DateTimeObject>(
221+
"SELECT * FROM {0} WHERE TestNullable = @dateTime".Fmt("DateTimeObject".SqlTable()), new { dateTime });
222+
Assert.That(dateTime, Is.EqualTo(row[0].TestNullable));
223+
224+
DateTime? nullableDate = dateTime;
225+
row = db.SqlList<DateTimeObject>(
226+
"SELECT * FROM {0} WHERE TestNullable = @nullableDate".Fmt("DateTimeObject".SqlTable()), new { nullableDate });
227+
Assert.That(dateTime, Is.EqualTo(row[0].TestNullable));
221228
}
222229
}
223230

0 commit comments

Comments
 (0)