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

Commit f78fb70

Browse files
committed
Use constant size for db string params
1 parent d2d6fac commit f78fb70

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

src/ServiceStack.OrmLite/Converters/StringConverter.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ public virtual string GetColumnDefinition(int? stringLength)
3636
: $"VARCHAR({stringLength.GetValueOrDefault(StringLength)})";
3737
}
3838

39+
public override void InitDbParam(IDbDataParameter p, Type fieldType)
40+
{
41+
base.InitDbParam(p, fieldType);
42+
43+
if (p.Size == default)
44+
{
45+
p.Size = StringLength;
46+
}
47+
}
48+
3949
public override object FromDbValue(Type fieldType, object value)
4050
{
4151
if (value is string strValue)

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,12 @@ public virtual void SetParameterValue<T>(FieldDefinition fieldDef, IDataParamete
968968
{
969969
var value = GetValueOrDbNull<T>(fieldDef, obj);
970970
p.Value = value;
971+
972+
if (value is string s && p is IDbDataParameter dataParam && dataParam.Size > 0 && s?.Length > dataParam.Size)
973+
{
974+
// db param Size set in StringConverter
975+
dataParam.Size = s.Length;
976+
}
971977
}
972978

973979
protected virtual object GetValue<T>(FieldDefinition fieldDef, object obj)

tests/ServiceStack.OrmLite.Tests/OrmLiteUpdateTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,38 @@ public void Can_UpdateOnly_fields_case_insensitive()
702702
Assert.That(updatedRow.Age, Is.EqualTo(27));
703703
}
704704
}
705+
706+
[Test]
707+
public void Does_use_constant_size_string_params()
708+
{
709+
using (var db = OpenDbConnection())
710+
{
711+
db.DropAndCreateTable<Person>();
712+
713+
var converter = db.GetDialectProvider().GetStringConverter();
714+
715+
void AssertDbStringParamSizes(IDbCommand cmd)
716+
{
717+
foreach (IDbDataParameter p in cmd.Parameters)
718+
{
719+
if (p.Value is string s)
720+
{
721+
Assert.That(p.Size, Is.EqualTo(converter.StringLength));
722+
}
723+
}
724+
}
725+
726+
var hendrix = new Person(1, "Jimi", "Hendrix", 27);
727+
db.Insert(hendrix, commandFilter: AssertDbStringParamSizes);
728+
729+
hendrix.FirstName = "Updated";
730+
731+
db.Update(hendrix, commandFilter: AssertDbStringParamSizes);
732+
733+
var row = db.SingleById<Person>(hendrix.Id);
734+
Assert.That(row.FirstName, Is.EqualTo("Updated"));
735+
}
736+
}
705737
}
706738

707739
[CompositeIndex("FirstName", "LastName")]

0 commit comments

Comments
 (0)