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

Commit 2c0259c

Browse files
committed
Add AddParam / CopyParamsTo API's
1 parent 159f697 commit 2c0259c

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed

src/ServiceStack.OrmLite/Expressions/ParameterizedSqlExpression.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Data;
23
using System.Linq.Expressions;
34

45
namespace ServiceStack.OrmLite
@@ -33,11 +34,7 @@ protected virtual void ConvertToPlaceholderAndParameter(ref object right)
3334
if (!OrmLiteConfig.UseParameterizeSqlExpressions)
3435
return;
3536

36-
var paramName = Params.Count.ToString();
37-
var paramValue = right;
38-
39-
var parameter = CreateParam(paramName, paramValue);
40-
Params.Add(parameter);
37+
var parameter = AddParam(right);
4138

4239
right = parameter.ParameterName;
4340
}

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -742,43 +742,61 @@ public string SqlColumn(string columnName)
742742
return DialectProvider.GetQuotedColumnName(columnName);
743743
}
744744

745+
public virtual IDbDataParameter AddParam(object value)
746+
{
747+
var paramName = Params.Count.ToString();
748+
var paramValue = value;
749+
750+
var parameter = CreateParam(paramName, paramValue);
751+
Params.Add(parameter);
752+
return parameter;
753+
}
754+
755+
public virtual void CopyParamsTo(IDbCommand dbCmd)
756+
{
757+
foreach (var sqlParam in Params)
758+
{
759+
dbCmd.Parameters.Add(sqlParam);
760+
}
761+
}
762+
745763
public virtual string ToDeleteRowStatement()
746764
{
747765
return string.Format("DELETE FROM {0} {1}",
748766
DialectProvider.GetQuotedTableName(modelDef), WhereExpression);
749767
}
750768

751-
public virtual string ToUpdateStatement(T item, bool excludeDefaults = false)
769+
public virtual void PrepareUpdateStatement(IDbCommand dbCmd, T item, bool excludeDefaults = false)
752770
{
771+
CopyParamsTo(dbCmd);
772+
753773
var setFields = new StringBuilder();
754774

755775
foreach (var fieldDef in modelDef.FieldDefinitions)
756776
{
757777
if (fieldDef.ShouldSkipUpdate()) continue;
758778
if (fieldDef.IsRowVersion) continue;
759-
if (updateFields.Count > 0
760-
&& !updateFields.Contains(fieldDef.Name)) continue; // added
779+
if (UpdateFields.Count > 0
780+
&& !UpdateFields.Contains(fieldDef.Name)) continue; // added
761781

762782
var value = fieldDef.GetValue(item);
763783
if (excludeDefaults
764784
&& (value == null || (!fieldDef.IsNullable && value.Equals(value.GetType().GetDefaultValue()))))
765785
continue;
766786

767-
fieldDef.GetQuotedValue(item, DialectProvider);
768-
769787
if (setFields.Length > 0)
770788
setFields.Append(", ");
771789

772790
setFields
773791
.Append(DialectProvider.GetQuotedColumnName(fieldDef.FieldName))
774792
.Append("=")
775-
.Append(DialectProvider.GetQuotedValue(value, fieldDef.FieldType));
793+
.Append(DialectProvider.AddParam(dbCmd, value).ParameterName);
776794
}
777795

778796
if (setFields.Length == 0)
779797
throw new ArgumentException("No non-null or non-default values were provided for type: " + typeof(T).Name);
780798

781-
return string.Format("UPDATE {0} SET {1} {2}",
799+
dbCmd.CommandText = string.Format("UPDATE {0} SET {1} {2}",
782800
DialectProvider.GetQuotedTableName(modelDef), setFields, WhereExpression);
783801
}
784802

0 commit comments

Comments
 (0)