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

Commit b628a2d

Browse files
committed
Add support for generating ToInsertStatement/ToUpdateStatement and merging params into SQL
1 parent f61daca commit b628a2d

File tree

5 files changed

+118
-0
lines changed

5 files changed

+118
-0
lines changed

src/ServiceStack.OrmLite/IOrmLiteDialectProvider.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,5 +201,9 @@ string ToCreateIndexStatement<T>(Expression<Func<T, object>> field,
201201

202202
string GetLoadChildrenSubSelect<From>(SqlExpression<From> expr);
203203
string ToRowCountStatement(string innerSql);
204+
205+
string ToUpdateStatement<T>(IDbCommand dbCmd, T item, ICollection<string> updateFields = null);
206+
string ToInsertStatement<T>(IDbCommand dbCmd, T item, ICollection<string> insertFields = null);
207+
string MergeParamsIntoSql(string sql, IEnumerable<IDbDataParameter> dbParams);
204208
}
205209
}

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,20 @@ public virtual string ToInsertRowStatement(IDbCommand cmd, object objWithPropert
627627
return sql;
628628
}
629629

630+
public virtual string ToInsertStatement<T>(IDbCommand dbCmd, T item, ICollection<string> insertFields = null)
631+
{
632+
dbCmd.Parameters.Clear();
633+
var dialectProvider = dbCmd.GetDialectProvider();
634+
dialectProvider.PrepareParameterizedInsertStatement<T>(dbCmd);
635+
636+
if (string.IsNullOrEmpty(dbCmd.CommandText))
637+
return null;
638+
639+
dialectProvider.SetParameterValues<T>(dbCmd, item);
640+
641+
return MergeParamsIntoSql(dbCmd.CommandText, ToArray(dbCmd.Parameters));
642+
}
643+
630644
public virtual void PrepareParameterizedInsertStatement<T>(IDbCommand cmd, ICollection<string> insertFields = null)
631645
{
632646
var sbColumnNames = StringBuilderCache.Allocate();
@@ -670,6 +684,41 @@ public virtual void PrepareParameterizedInsertStatement<T>(IDbCommand cmd, IColl
670684
StringBuilderCacheAlt.ReturnAndFree(sbColumnValues));
671685
}
672686

687+
public virtual string ToUpdateStatement<T>(IDbCommand dbCmd, T item, ICollection<string> updateFields = null)
688+
{
689+
dbCmd.Parameters.Clear();
690+
var dialectProvider = dbCmd.GetDialectProvider();
691+
dialectProvider.PrepareParameterizedUpdateStatement<T>(dbCmd);
692+
693+
if (string.IsNullOrEmpty(dbCmd.CommandText))
694+
return null;
695+
696+
dialectProvider.SetParameterValues<T>(dbCmd, item);
697+
698+
return MergeParamsIntoSql(dbCmd.CommandText, ToArray(dbCmd.Parameters));
699+
}
700+
701+
IDbDataParameter[] ToArray(IDataParameterCollection dbParams)
702+
{
703+
var to = new IDbDataParameter[dbParams.Count];
704+
for (int i = 0; i < dbParams.Count; i++)
705+
{
706+
to[i] = (IDbDataParameter) dbParams[i];
707+
}
708+
return to;
709+
}
710+
711+
public virtual string MergeParamsIntoSql(string sql, IEnumerable<IDbDataParameter> dbParams)
712+
{
713+
foreach (var dbParam in dbParams)
714+
{
715+
var varName = dbParam.ParameterName;
716+
var quotedValue = GetQuotedValue(dbParam.Value, dbParam.Value.GetType());
717+
sql = sql.Replace(varName, quotedValue);
718+
}
719+
return sql;
720+
}
721+
673722
public virtual bool PrepareParameterizedUpdateStatement<T>(IDbCommand cmd, ICollection<string> updateFields = null)
674723
{
675724
var sql = StringBuilderCache.Allocate();

src/ServiceStack.OrmLite/OrmLiteWriteApi.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,5 +322,21 @@ public static void ExecuteProcedure<T>(this IDbConnection dbConn, T obj)
322322
{
323323
dbConn.Exec(dbCmd => dbCmd.ExecuteProcedure(obj));
324324
}
325+
326+
/// <summary>
327+
/// Generates inline UPDATE SQL Statement
328+
/// </summary>
329+
public static string ToUpdateStatement<T>(this IDbConnection dbConn, T item, ICollection<string> updateFields = null)
330+
{
331+
return dbConn.Exec(dbCmd => dbCmd.GetDialectProvider().ToUpdateStatement(dbCmd, item, updateFields));
332+
}
333+
334+
/// <summary>
335+
/// Generates inline INSERT SQL Statement
336+
/// </summary>
337+
public static string ToInsertStatement<T>(this IDbConnection dbConn, T item, ICollection<string> insertFields = null)
338+
{
339+
return dbConn.Exec(dbCmd => dbCmd.GetDialectProvider().ToInsertStatement(dbCmd, item, insertFields));
340+
}
325341
}
326342
}

tests/ServiceStack.OrmLite.Tests/ServiceStack.OrmLite.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@
142142
<Compile Include="Support\ArtistTrackTestBase.cs" />
143143
<Compile Include="Support\JoinSqlBuilder.cs" />
144144
<Compile Include="TemporaryNamingStrategy.cs" />
145+
<Compile Include="ToInsertAndUpdateStatementTests.cs" />
145146
<Compile Include="UseCase\ArtistTrackSqlExpressions.cs" />
146147
<Compile Include="UseCase\ExpressionsAuthorTests.cs" />
147148
<Compile Include="Expression\ComplexJoinTests.cs" />
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using NUnit.Framework;
2+
using ServiceStack.OrmLite.Tests.Shared;
3+
using ServiceStack.Text;
4+
5+
namespace ServiceStack.OrmLite.Tests
6+
{
7+
[TestFixture]
8+
public class ToInsertAndUpdateStatementTests
9+
: OrmLiteTestBase
10+
{
11+
[Test]
12+
public void Can_use_ToUpdateStatement_to_generate_inline_SQL()
13+
{
14+
using (var db = OpenDbConnection())
15+
{
16+
db.DropAndCreateTable<Person>();
17+
db.InsertAll(Person.Rockstars);
18+
19+
var row = db.SingleById<Person>(1);
20+
row.Age = 42;
21+
22+
var sql = db.ToUpdateStatement(row);
23+
sql.Print();
24+
db.ExecuteSql(sql);
25+
26+
var updatedRow = db.SingleById<Person>(1);
27+
Assert.That(updatedRow.Equals(row));
28+
}
29+
}
30+
31+
[Test]
32+
public void Can_use_ToInsertStatement_to_generate_inline_SQL()
33+
{
34+
using (var db = OpenDbConnection())
35+
{
36+
db.DropAndCreateTable<Person>();
37+
var row = Person.Rockstars[0];
38+
39+
var sql = db.ToInsertStatement(row);
40+
sql.Print();
41+
db.ExecuteSql(sql);
42+
43+
var insertedRow = db.SingleById<Person>(row.Id);
44+
Assert.That(insertedRow.Equals(row));
45+
}
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)