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

Commit a3625be

Browse files
committed
Add new opt-in SqlServerParameterizedSqlExpression, enable with OrmLiteConfig.UseParameterizeSqlExpressions
1 parent 4464222 commit a3625be

File tree

4 files changed

+79
-27
lines changed

4 files changed

+79
-27
lines changed

src/ServiceStack.OrmLite.SqlServer/SqlServerExpression.cs

Lines changed: 74 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,56 +3,106 @@
33

44
namespace ServiceStack.OrmLite.SqlServer
55
{
6-
public class SqlServerExpression<T> : SqlExpression<T>
7-
{
6+
public class SqlServerExpression<T> : SqlExpression<T>
7+
{
88
public SqlServerExpression(IOrmLiteDialectProvider dialectProvider)
99
: base(dialectProvider) {}
1010

1111
public override string ToUpdateStatement(T item, bool excludeDefaults = false)
1212
{
13+
return SqlServerExpressionUtils.ToSqlServerUpdateStatement(this, item, excludeDefaults);
14+
}
15+
16+
public override string GetSubstringSql(object quotedColumn, int startIndex, int? length = null)
17+
{
18+
return length != null
19+
? string.Format("substring({0}, {1}, {2})", quotedColumn, startIndex, length.Value)
20+
: string.Format("substring({0}, {1}, LEN({0}) - {1} + 1)", quotedColumn, startIndex);
21+
}
22+
23+
public override SqlExpression<T> OrderByRandom()
24+
{
25+
return base.OrderBy("NEWID()");
26+
}
27+
}
28+
29+
public class SqlServerParameterizedSqlExpression<T> : ParameterizedSqlExpression<T>
30+
{
31+
public SqlServerParameterizedSqlExpression(IOrmLiteDialectProvider dialectProvider)
32+
: base(dialectProvider) {}
33+
34+
public override string ToUpdateStatement(T item, bool excludeDefaults = false)
35+
{
36+
return SqlServerExpressionUtils.ToSqlServerUpdateStatement(this, item, excludeDefaults);
37+
}
38+
39+
public override string GetSubstringSql(object quotedColumn, int startIndex, int? length = null)
40+
{
41+
return length != null
42+
? string.Format("substring({0}, {1}, {2})", quotedColumn, startIndex, length.Value)
43+
: string.Format("substring({0}, {1}, LEN({0}) - {1} + 1)", quotedColumn, startIndex);
44+
}
45+
46+
public override SqlExpression<T> OrderByRandom()
47+
{
48+
return base.OrderBy("NEWID()");
49+
}
50+
51+
protected override void ConvertToPlaceholderAndParameter(ref object right)
52+
{
53+
var paramName = Params.Count.ToString();
54+
var paramValue = right;
55+
var parameter = CreateParam(paramName, paramValue);
56+
57+
// Prevents a new plan cache for each different string length. Every string is parameterized as NVARCHAR(max)
58+
if (parameter.DbType == System.Data.DbType.String)
59+
parameter.Size = -1;
60+
61+
Params.Add(parameter);
62+
63+
right = parameter.ParameterName;
64+
}
65+
}
66+
67+
internal class SqlServerExpressionUtils
68+
{
69+
internal static string ToSqlServerUpdateStatement<T>(SqlExpression<T> q, T item, bool excludeDefaults = false)
70+
{
71+
var modelDef = q.ModelDef;
72+
var dialectProvider = q.DialectProvider;
73+
1374
var setFields = new StringBuilder();
1475

15-
foreach (var fieldDef in ModelDef.FieldDefinitions)
76+
foreach (var fieldDef in modelDef.FieldDefinitions)
1677
{
1778
if (fieldDef.ShouldSkipUpdate()) continue;
1879
if (fieldDef.IsRowVersion) continue;
19-
if (UpdateFields.Count > 0
20-
&& !UpdateFields.Contains(fieldDef.Name)
21-
|| fieldDef.AutoIncrement) continue; // added
80+
if (q.UpdateFields.Count > 0
81+
&& !q.UpdateFields.Contains(fieldDef.Name)
82+
|| fieldDef.AutoIncrement)
83+
continue; // added
2284

2385
var value = fieldDef.GetValue(item);
2486
if (excludeDefaults
2587
&& (value == null || (!fieldDef.IsNullable && value.Equals(value.GetType().GetDefaultValue()))))
2688
continue;
2789

28-
fieldDef.GetQuotedValue(item, DialectProvider);
90+
fieldDef.GetQuotedValue(item, dialectProvider);
2991

30-
if (setFields.Length > 0)
92+
if (setFields.Length > 0)
3193
setFields.Append(", ");
3294

3395
setFields
34-
.Append(DialectProvider.GetQuotedColumnName(fieldDef.FieldName))
96+
.Append(dialectProvider.GetQuotedColumnName(fieldDef.FieldName))
3597
.Append("=")
36-
.Append(DialectProvider.GetQuotedValue(value, fieldDef.FieldType));
98+
.Append(dialectProvider.GetQuotedValue(value, fieldDef.FieldType));
3799
}
38100

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

42104
return string.Format("UPDATE {0} SET {1} {2}",
43-
base.DialectProvider.GetQuotedTableName(ModelDef), setFields, WhereExpression);
105+
dialectProvider.GetQuotedTableName(modelDef), setFields, q.WhereExpression);
44106
}
45-
46-
public override string GetSubstringSql(object quotedColumn, int startIndex, int? length = null)
47-
{
48-
return length != null
49-
? string.Format("substring({0}, {1}, {2})", quotedColumn, startIndex, length.Value)
50-
: string.Format("substring({0}, {1}, LEN({0}) - {1} + 1)", quotedColumn, startIndex );
51-
}
52-
53-
public override SqlExpression<T> OrderByRandom()
54-
{
55-
return base.OrderBy("NEWID()");
56-
}
57-
}
107+
}
58108
}

src/ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,9 @@ public void EnsureUtc(bool shouldEnsureUtc)
108108

109109
public override SqlExpression<T> SqlExpression<T>()
110110
{
111-
return new SqlServerExpression<T>(this);
111+
return !OrmLiteConfig.UseParameterizeSqlExpressions
112+
? new SqlServerExpression<T>(this)
113+
: (SqlExpression<T>)new SqlServerParameterizedSqlExpression<T>(this);
112114
}
113115

114116
public override bool DoesTableExist(IDbCommand dbCmd, string tableName, string schema = null)

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1310,7 +1310,7 @@ protected virtual object VisitNewArray(NewArrayExpression na)
13101310
return sb.ToString();
13111311
}
13121312

1313-
protected virtual List<Object> VisitNewArrayFromExpressionList(NewArrayExpression na)
1313+
protected virtual List<object> VisitNewArrayFromExpressionList(NewArrayExpression na)
13141314
{
13151315
var exprs = VisitExpressionList(na.Expressions);
13161316
return exprs;

src/ServiceStack.OrmLite/OrmLiteConfig.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public static IOrmLiteExecFilter ExecFilter
190190
(fieldName ?? "").Replace(" ", "");
191191

192192
/// <summary>
193-
/// Only supported in Oracle DialectProvider
193+
/// Only used in Oracle or SqlServer DialectProvider
194194
/// </summary>
195195
public static bool UseParameterizeSqlExpressions { get; set; }
196196

0 commit comments

Comments
 (0)