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

Commit 159f697

Browse files
committed
Change ToUpdateRowStatement to PrepareUpdateRowStatement which now users db params
1 parent a3b484f commit 159f697

File tree

8 files changed

+108
-167
lines changed

8 files changed

+108
-167
lines changed

src/ServiceStack.OrmLite.Firebird/FirebirdOrmLiteDialectProvider.cs

Lines changed: 17 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ public override void PrepareParameterizedInsertStatement<T>(IDbCommand cmd, ICol
237237
GetQuotedTableName(modelDef), sbColumnNames, sbColumnValues);
238238
}
239239

240-
public override string ToUpdateRowStatement(object objWithProperties, ICollection<string> updateFields = null)
240+
public override void PrepareUpdateRowStatement(IDbCommand dbCmd, object objWithProperties, ICollection<string> updateFields = null)
241241
{
242242
if (updateFields == null)
243243
updateFields = new List<string>();
@@ -255,50 +255,31 @@ public override string ToUpdateRowStatement(object objWithProperties, ICollectio
255255
if ((fieldDef.IsPrimaryKey || fieldDef.Name == OrmLiteConfig.IdField)
256256
&& updateFields.Count == 0)
257257
{
258-
if (sqlFilter.Length > 0) sqlFilter.Append(" AND ");
258+
if (sqlFilter.Length > 0)
259+
sqlFilter.Append(" AND ");
259260

260-
sqlFilter.AppendFormat("{0}={1}",
261-
GetQuotedColumnName(fieldDef.FieldName),
262-
fieldDef.GetQuotedValue(objWithProperties));
261+
sqlFilter
262+
.Append(GetQuotedColumnName(fieldDef.FieldName))
263+
.Append("=")
264+
.Append(this.AddParam(dbCmd, fieldDef.GetValue(objWithProperties)).ParameterName);
263265

264266
continue;
265267
}
266-
if (updateFields.Count > 0 && !updateFields.Contains(fieldDef.Name)) continue;
267-
if (sql.Length > 0) sql.Append(",");
268-
sql.AppendFormat("{0}={1}",
269-
GetQuotedColumnName(fieldDef.FieldName),
270-
fieldDef.GetQuotedValue(objWithProperties));
271-
}
272268

273-
var updateSql = string.Format("UPDATE {0} \nSET {1} {2}",
274-
GetQuotedTableName(modelDef), sql, (sqlFilter.Length > 0 ? "\nWHERE " + sqlFilter : ""));
275-
276-
return updateSql;
277-
}
278-
279-
280-
public override string ToDeleteRowStatement(object objWithProperties)
281-
{
282-
var tableType = objWithProperties.GetType();
283-
var modelDef = GetModel(tableType);
269+
if (updateFields.Count > 0 && !updateFields.Contains(fieldDef.Name))
270+
continue;
284271

285-
var sqlFilter = new StringBuilder();
272+
if (sql.Length > 0)
273+
sql.Append(",");
286274

287-
foreach (var fieldDef in modelDef.FieldDefinitions)
288-
{
289-
if (fieldDef.IsPrimaryKey || fieldDef.Name == OrmLiteConfig.IdField)
290-
{
291-
if (sqlFilter.Length > 0) sqlFilter.Append(" AND ");
292-
sqlFilter.AppendFormat("{0} = {1}",
293-
GetQuotedColumnName(fieldDef.FieldName),
294-
fieldDef.GetQuotedValue(objWithProperties));
295-
}
275+
sql
276+
.Append(GetQuotedColumnName(fieldDef.FieldName))
277+
.Append("=")
278+
.Append(this.AddParam(dbCmd, fieldDef.GetValue(objWithProperties)).ParameterName);
296279
}
297280

298-
var deleteSql = string.Format("DELETE FROM {0} WHERE {1}",
299-
GetQuotedTableName(modelDef), sqlFilter);
300-
301-
return deleteSql;
281+
dbCmd.CommandText = string.Format("UPDATE {0} \nSET {1} {2}",
282+
GetQuotedTableName(modelDef), sql, (sqlFilter.Length > 0 ? "\nWHERE " + sqlFilter : ""));
302283
}
303284

304285
public override string ToCreateTableStatement(Type tableType)

src/ServiceStack.OrmLite.Oracle/OracleOrmLiteDialectProvider.cs

Lines changed: 17 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@ public override string ToInsertRowStatement(IDbCommand dbCommand, object objWith
709709
return sql;
710710
}
711711

712-
public override string ToUpdateRowStatement(object objWithProperties, ICollection<string> updateFields = null)
712+
public override void PrepareUpdateRowStatement(IDbCommand dbCmd, object objWithProperties, ICollection<string> updateFields = null)
713713
{
714714
var sqlFilter = new StringBuilder();
715715
var sql = new StringBuilder();
@@ -724,49 +724,31 @@ public override string ToUpdateRowStatement(object objWithProperties, ICollectio
724724
if ((fieldDef.IsPrimaryKey || fieldDef.Name == OrmLiteConfig.IdField)
725725
&& updateFieldsEmptyOrNull)
726726
{
727-
if (sqlFilter.Length > 0) sqlFilter.Append(" AND ");
727+
if (sqlFilter.Length > 0)
728+
sqlFilter.Append(" AND ");
728729

729-
sqlFilter.AppendFormat("{0} = {1}",
730-
GetQuotedColumnName(fieldDef.FieldName),
731-
fieldDef.GetQuotedValue(objWithProperties));
730+
sqlFilter
731+
.Append(GetQuotedColumnName(fieldDef.FieldName))
732+
.Append("=")
733+
.Append(this.AddParam(dbCmd, fieldDef.GetValue(objWithProperties)).ParameterName);
732734

733735
continue;
734736
}
735-
if (!updateFieldsEmptyOrNull && !updateFields.Contains(fieldDef.Name)) continue;
736-
if (sql.Length > 0) sql.Append(",");
737-
sql.AppendFormat("{0}={1}",
738-
GetQuotedColumnName(fieldDef.FieldName),
739-
fieldDef.GetQuotedValue(objWithProperties));
740-
}
741737

742-
var updateSql = string.Format("UPDATE {0} \nSET {1} {2}",
743-
GetQuotedTableName(modelDef), sql, (sqlFilter.Length > 0 ? "\nWHERE " + sqlFilter : ""));
744-
745-
return updateSql;
746-
}
747-
748-
public override string ToDeleteRowStatement(object objWithProperties)
749-
{
750-
var tableType = objWithProperties.GetType();
751-
var modelDef = GetModel(tableType);
738+
if (!updateFieldsEmptyOrNull && !updateFields.Contains(fieldDef.Name))
739+
continue;
752740

753-
var sqlFilter = new StringBuilder();
741+
if (sql.Length > 0)
742+
sql.Append(",");
754743

755-
foreach (var fieldDef in modelDef.FieldDefinitions)
756-
{
757-
if (fieldDef.IsPrimaryKey || fieldDef.Name == OrmLiteConfig.IdField)
758-
{
759-
if (sqlFilter.Length > 0) sqlFilter.Append(" AND ");
760-
sqlFilter.AppendFormat("{0} = {1}",
761-
GetQuotedColumnName(fieldDef.FieldName),
762-
fieldDef.GetQuotedValue(objWithProperties));
763-
}
744+
sql
745+
.Append(GetQuotedColumnName(fieldDef.FieldName))
746+
.Append("=")
747+
.Append(this.AddParam(dbCmd, fieldDef.GetValue(objWithProperties)).ParameterName);
764748
}
765749

766-
var deleteSql = string.Format("DELETE FROM {0} WHERE {1}",
767-
GetQuotedTableName(modelDef), sqlFilter);
768-
769-
return deleteSql;
750+
dbCmd.CommandText = string.Format("UPDATE {0} \nSET {1} {2}",
751+
GetQuotedTableName(modelDef), sql, (sqlFilter.Length > 0 ? "\nWHERE " + sqlFilter : ""));
770752
}
771753

772754
public override string ToCreateTableStatement(Type tableType)

src/ServiceStack.OrmLite.SqlServer/SqlServerExpression.cs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Data;
23
using System.Text;
34
using ServiceStack.OrmLite.SqlServer.Converters;
45

@@ -9,9 +10,9 @@ public class SqlServerExpression<T> : SqlExpression<T>
910
public SqlServerExpression(IOrmLiteDialectProvider dialectProvider)
1011
: base(dialectProvider) {}
1112

12-
public override string ToUpdateStatement(T item, bool excludeDefaults = false)
13+
public override void PrepareUpdateStatement(IDbCommand dbCmd, T item, bool excludeDefaults = false)
1314
{
14-
return SqlServerExpressionUtils.ToSqlServerUpdateStatement(this, item, excludeDefaults);
15+
SqlServerExpressionUtils.PrepareSqlServerUpdateStatement(dbCmd, this, item, excludeDefaults);
1516
}
1617

1718
public override string GetSubstringSql(object quotedColumn, int startIndex, int? length = null)
@@ -32,9 +33,9 @@ public class SqlServerParameterizedSqlExpression<T> : ParameterizedSqlExpression
3233
public SqlServerParameterizedSqlExpression(IOrmLiteDialectProvider dialectProvider)
3334
: base(dialectProvider) {}
3435

35-
public override string ToUpdateStatement(T item, bool excludeDefaults = false)
36+
public override void PrepareUpdateStatement(IDbCommand dbCmd, T item, bool excludeDefaults = false)
3637
{
37-
return SqlServerExpressionUtils.ToSqlServerUpdateStatement(this, item, excludeDefaults);
38+
SqlServerExpressionUtils.PrepareSqlServerUpdateStatement(dbCmd, this, item, excludeDefaults);
3839
}
3940

4041
public override string GetSubstringSql(object quotedColumn, int startIndex, int? length = null)
@@ -77,10 +78,12 @@ protected override void VisitFilter(string operand, object originalLeft, object
7778

7879
internal class SqlServerExpressionUtils
7980
{
80-
internal static string ToSqlServerUpdateStatement<T>(SqlExpression<T> q, T item, bool excludeDefaults = false)
81+
internal static void PrepareSqlServerUpdateStatement<T>(IDbCommand dbCmd, SqlExpression<T> q, T item, bool excludeDefaults = false)
8182
{
83+
q.CopyParamsTo(dbCmd);
84+
8285
var modelDef = q.ModelDef;
83-
var dialectProvider = q.DialectProvider;
86+
var DialectProvider = q.DialectProvider;
8487

8588
var setFields = new StringBuilder();
8689

@@ -98,22 +101,21 @@ internal static string ToSqlServerUpdateStatement<T>(SqlExpression<T> q, T item,
98101
&& (value == null || (!fieldDef.IsNullable && value.Equals(value.GetType().GetDefaultValue()))))
99102
continue;
100103

101-
fieldDef.GetQuotedValue(item, dialectProvider);
102-
103104
if (setFields.Length > 0)
104105
setFields.Append(", ");
105106

107+
var param = DialectProvider.AddParam(dbCmd, value);
106108
setFields
107-
.Append(dialectProvider.GetQuotedColumnName(fieldDef.FieldName))
109+
.Append(DialectProvider.GetQuotedColumnName(fieldDef.FieldName))
108110
.Append("=")
109-
.Append(dialectProvider.GetQuotedValue(value, fieldDef.FieldType));
111+
.Append(param.ParameterName);
110112
}
111113

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

115-
return string.Format("UPDATE {0} SET {1} {2}",
116-
dialectProvider.GetQuotedTableName(modelDef), setFields, q.WhereExpression);
117+
dbCmd.CommandText = string.Format("UPDATE {0} SET {1} {2}",
118+
DialectProvider.GetQuotedTableName(modelDef), setFields, q.WhereExpression);
117119
}
118120
}
119121
}

src/ServiceStack.OrmLite.VistaDB/VistaDBExpression.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Data;
23
using System.Linq;
34
using System.Text;
45
using System.Linq.Expressions;
@@ -10,8 +11,10 @@ public class VistaDbExpression<T> : ParameterizedSqlExpression<T>
1011
public VistaDbExpression(IOrmLiteDialectProvider dialectProvider)
1112
: base(dialectProvider) {}
1213

13-
public override string ToUpdateStatement(T item, bool excludeDefaults = false)
14+
public override void PrepareUpdateStatement(IDbCommand dbCmd, T item, bool excludeDefaults = false)
1415
{
16+
CopyParamsTo(dbCmd);
17+
1518
var setFields = new StringBuilder();
1619

1720
foreach (var fieldDef in ModelDef.FieldDefinitions)
@@ -24,18 +27,20 @@ public override string ToUpdateStatement(T item, bool excludeDefaults = false)
2427
&& (value == null || (!fieldDef.IsNullable && value.Equals(value.GetType().GetDefaultValue()))))
2528
continue;
2629

27-
fieldDef.GetQuotedValue(item);
30+
if (setFields.Length > 0)
31+
setFields.Append(", ");
2832

29-
if (setFields.Length > 0) setFields.Append(",");
30-
setFields.AppendFormat("{0} = {1}",
31-
DialectProvider.GetQuotedColumnName(fieldDef.FieldName),
32-
DialectProvider.GetQuotedValue(value, fieldDef.FieldType));
33+
var param = DialectProvider.AddParam(dbCmd, value);
34+
setFields
35+
.Append(DialectProvider.GetQuotedColumnName(fieldDef.FieldName))
36+
.Append("=")
37+
.Append(param.ParameterName);
3338
}
3439

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

38-
return string.Format("UPDATE {0} SET {1} {2}",
43+
dbCmd.CommandText = string.Format("UPDATE {0} SET {1} {2}",
3944
DialectProvider.GetQuotedTableName(ModelDef), setFields, WhereExpression);
4045
}
4146

src/ServiceStack.OrmLite/Async/WriteExpressionCommandExtensionsAsync.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ internal static Task<int> UpdateOnlyAsync<T>(this IDbCommand dbCmd, T model, Fun
1616

1717
internal static Task<int> UpdateOnlyAsync<T>(this IDbCommand dbCmd, T model, SqlExpression<T> onlyFields, CancellationToken token)
1818
{
19-
var sql = dbCmd.UpdateOnlySql(model, onlyFields);
20-
return dbCmd.ExecuteSqlAsync(sql, onlyFields.Params, token);
19+
dbCmd.UpdateOnlySql(model, onlyFields);
20+
return dbCmd.ExecNonQueryAsync(token);
2121
}
2222

2323
internal static Task<int> UpdateOnlyAsync<T, TKey>(this IDbCommand dbCmd, T obj,
@@ -41,8 +41,8 @@ internal static Task<int> UpdateNonDefaultsAsync<T>(this IDbCommand dbCmd, T ite
4141

4242
var q = dbCmd.GetDialectProvider().SqlExpression<T>();
4343
q.Where(obj);
44-
var sql = q.ToUpdateStatement(item, excludeDefaults: true);
45-
return dbCmd.ExecuteSqlAsync(sql, q.Params, token);
44+
q.PrepareUpdateStatement(dbCmd, item, excludeDefaults: true);
45+
return dbCmd.ExecNonQueryAsync(token);
4646
}
4747

4848
internal static Task<int> UpdateAsync<T>(this IDbCommand dbCmd, T item, Expression<Func<T, bool>> expression, CancellationToken token)
@@ -52,17 +52,18 @@ internal static Task<int> UpdateAsync<T>(this IDbCommand dbCmd, T item, Expressi
5252

5353
var q = dbCmd.GetDialectProvider().SqlExpression<T>();
5454
q.Where(expression);
55-
var sql = q.ToUpdateStatement(item);
56-
return dbCmd.ExecuteSqlAsync(sql, q.Params, token);
55+
q.PrepareUpdateStatement(dbCmd, item);
56+
return dbCmd.ExecNonQueryAsync(token);
5757
}
5858

5959
internal static Task<int> UpdateAsync<T>(this IDbCommand dbCmd, object updateOnly, Expression<Func<T, bool>> where, CancellationToken token)
6060
{
6161
var q = dbCmd.GetDialectProvider().SqlExpression<T>();
6262
var whereSql = q.Where(@where).WhereExpression;
63-
var updateSql = WriteExpressionCommandExtensions.UpdateSql<T>(dbCmd.GetDialectProvider(), updateOnly, whereSql);
63+
q.CopyParamsTo(dbCmd);
64+
dbCmd.PrepareUpdateAnonSql<T>(dbCmd.GetDialectProvider(), updateOnly, whereSql);
6465

65-
return dbCmd.ExecuteSqlAsync(updateSql, q.Params, token);
66+
return dbCmd.ExecNonQueryAsync(token);
6667
}
6768

6869
internal static Task<int> UpdateFmtAsync<T>(this IDbCommand dbCmd, string set, string where, CancellationToken token)

0 commit comments

Comments
 (0)