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

Commit 0f17bd3

Browse files
committed
Add better API's for executing SP's with OUT params
1 parent 6e9b4e3 commit 0f17bd3

File tree

5 files changed

+144
-3
lines changed

5 files changed

+144
-3
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System.Data;
2+
using NUnit.Framework;
3+
using ServiceStack.DataAnnotations;
4+
5+
namespace ServiceStack.OrmLite.MySql.Tests
6+
{
7+
public class LetterFrequency
8+
{
9+
[AutoIncrement]
10+
public int Id { get; set; }
11+
12+
public string Letter { get; set; }
13+
}
14+
15+
[TestFixture]
16+
public class CustomSqlTests : OrmLiteTestBase
17+
{
18+
string spSql = @"DROP PROCEDURE IF EXISTS spSearchLetters;
19+
CREATE PROCEDURE spSearchLetters (IN pLetter varchar(10), OUT pTotal int)
20+
BEGIN
21+
SELECT COUNT(*) FROM LetterFrequency WHERE Letter = pLetter INTO pTotal;
22+
SELECT * FROM LetterFrequency WHERE Letter = pLetter;
23+
END";
24+
25+
[Test]
26+
public void Can_execute_stored_procedure_using_SqlList_with_out_params()
27+
{
28+
using (var db = OpenDbConnection())
29+
{
30+
db.DropAndCreateTable<LetterFrequency>();
31+
32+
var rows = "A,B,B,C,C,C,D,D,E".Split(',').Map(x => new LetterFrequency { Letter = x });
33+
db.InsertAll(rows);
34+
35+
db.ExecuteSql(spSql);
36+
37+
IDbDataParameter pTotal = null;
38+
var results = db.SqlList<LetterFrequency>("spSearchLetters",
39+
cmd =>
40+
{
41+
cmd.CommandType = CommandType.StoredProcedure;
42+
cmd.AddParam("pLetter", "C");
43+
pTotal = cmd.AddParam("pTotal", direction: ParameterDirection.Output);
44+
});
45+
46+
Assert.That(results.Count, Is.EqualTo(3));
47+
Assert.That(pTotal.Value, Is.EqualTo(3));
48+
}
49+
}
50+
51+
[Test]
52+
public void Can_execute_stored_procedure_using_SqlProc_with_out_params()
53+
{
54+
using (var db = OpenDbConnection())
55+
{
56+
db.DropAndCreateTable<LetterFrequency>();
57+
58+
var rows = "A,B,B,C,C,C,D,D,E".Split(',').Map(x => new LetterFrequency { Letter = x });
59+
db.InsertAll(rows);
60+
61+
db.ExecuteSql(spSql);
62+
63+
var cmd = db.SqlProc("spSearchLetters", new { pLetter = "C" });
64+
var pTotal = cmd.AddParam("pTotal", direction: ParameterDirection.Output);
65+
var results = cmd.ConvertToList<LetterFrequency>();
66+
67+
Assert.That(results.Count, Is.EqualTo(3));
68+
Assert.That(pTotal.Value, Is.EqualTo(3));
69+
}
70+
}
71+
}
72+
}

src/ServiceStack.OrmLite.MySql.Tests/ServiceStack.OrmLite.MySql.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
<Link>Properties\GlobalAssemblyInfo.cs</Link>
7777
</Compile>
7878
<Compile Include="BooleanTests.cs" />
79+
<Compile Include="CustomSqlTests.cs" />
7980
<Compile Include="DateTimeColumnTest.cs" />
8081
<Compile Include="EnumTests.cs" />
8182
<Compile Include="Expressions\AdditiveExpressionsTest.cs" />

src/ServiceStack.OrmLite/OrmLiteReadConnectionExtensions.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,24 @@ public static List<T> SqlList<T>(this IDbConnection dbConn, string sql, Dictiona
419419
return dbConn.Exec(dbCmd => dbCmd.SqlList<T>(sql, dict));
420420
}
421421

422+
/// <summary>
423+
/// Returns results from an arbitrary parameterized raw sql query with a dbCmd filter. E.g:
424+
/// <para>db.SqlList&lt;Person&gt;("EXEC GetRockstarsAged @age", dbCmd => ...)</para>
425+
/// </summary>
426+
public static List<T> SqlList<T>(this IDbConnection dbConn, string sql, Action<IDbCommand> dbCmdFilter)
427+
{
428+
return dbConn.Exec(dbCmd => dbCmd.SqlList<T>(sql, dbCmdFilter));
429+
}
430+
431+
/// <summary>
432+
/// Prepare Stored Procedure with Input parameters, optionally populated with Input Params. E.g:
433+
/// <para>var cmd = db.SqlProc("GetRockstarsAged", new { age = 42 })</para>
434+
/// </summary>
435+
public static IDbCommand SqlProc(this IDbConnection dbConn, string name, object inParams = null, bool excludeDefaults = false)
436+
{
437+
return dbConn.Exec(dbCmd => dbCmd.SqlProc(name, inParams, excludeDefaults));
438+
}
439+
422440
/// <summary>
423441
/// Returns the first column in a List using an SqlExpression. E.g:
424442
/// <para>db.SqlColumn&lt;string&gt;(db.From&lt;Person&gt;().Select(x => x.LastName).Where(q => q.Age < 50))</para>

src/ServiceStack.OrmLite/OrmLiteReadExtensions.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,14 @@ internal static List<T> SqlList<T>(this IDbCommand dbCmd, string sql, Dictionary
378378
return dbCmd.ConvertToList<T>();
379379
}
380380

381+
internal static List<T> SqlList<T>(this IDbCommand dbCmd, string sql, Action<IDbCommand> dbCmdFilter)
382+
{
383+
if (dbCmdFilter != null) dbCmdFilter(dbCmd);
384+
dbCmd.CommandText = sql;
385+
386+
return dbCmd.ConvertToList<T>();
387+
}
388+
381389
internal static List<T> SqlColumn<T>(this IDbCommand dbCmd, string sql, object anonType = null)
382390
{
383391
if (anonType != null) dbCmd.SetParameters<T>(anonType, excludeDefaults: false);
@@ -910,5 +918,47 @@ public static FieldDefinition GetSelfRefFieldDefIfExists(ModelDefinition modelDe
910918

911919
return refField;
912920
}
921+
922+
public static IDbDataParameter AddParam(this IDbCommand dbCmd,
923+
string name,
924+
object value = null,
925+
ParameterDirection direction = ParameterDirection.Input,
926+
DbType? dbType = null)
927+
{
928+
var p = dbCmd.CreateParam(name, value, direction, dbType);
929+
dbCmd.Parameters.Add(p);
930+
return p;
931+
}
932+
933+
public static IDbDataParameter CreateParam(this IDbCommand dbCmd,
934+
string name,
935+
object value = null,
936+
ParameterDirection direction = ParameterDirection.Input,
937+
DbType? dbType=null)
938+
{
939+
var p = dbCmd.CreateParameter();
940+
var dialectProvider = OrmLiteConfig.DialectProvider;
941+
p.ParameterName = dialectProvider.GetParam(name);
942+
p.Direction = direction;
943+
if (value != null)
944+
{
945+
p.Value = value;
946+
p.DbType = dialectProvider.GetColumnDbType(value.GetType());
947+
}
948+
if (dbType != null)
949+
p.DbType = dbType.Value;
950+
return p;
951+
}
952+
953+
internal static IDbCommand SqlProc(this IDbCommand dbCmd, string name, object inParams = null, bool excludeDefaults = false)
954+
{
955+
dbCmd.CommandType = CommandType.StoredProcedure;
956+
dbCmd.CommandText = name;
957+
dbCmd.CommandTimeout = OrmLiteConfig.CommandTimeout;
958+
959+
dbCmd.SetParameters(inParams, excludeDefaults);
960+
961+
return dbCmd;
962+
}
913963
}
914964
}

src/ServiceStack.OrmLite/OrmLiteResultsFilterExtensions.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ internal static List<T> ExprConvertToList<T>(this IDbCommand dbCmd, string sql =
9999
}
100100
}
101101

102-
internal static T ConvertTo<T>(this IDbCommand dbCmd, string sql = null)
102+
public static T ConvertTo<T>(this IDbCommand dbCmd, string sql = null)
103103
{
104104
if (sql != null)
105105
dbCmd.CommandText = sql;
@@ -131,7 +131,7 @@ internal static object ConvertTo(this IDbCommand dbCmd, Type refType, string sql
131131
}
132132
}
133133

134-
internal static T Scalar<T>(this IDbCommand dbCmd, string sql = null)
134+
public static T Scalar<T>(this IDbCommand dbCmd, string sql = null)
135135
{
136136
if (sql != null)
137137
dbCmd.CommandText = sql;
@@ -147,7 +147,7 @@ internal static T Scalar<T>(this IDbCommand dbCmd, string sql = null)
147147
}
148148
}
149149

150-
internal static object Scalar(this IDbCommand dbCmd, string sql = null)
150+
public static object Scalar(this IDbCommand dbCmd, string sql = null)
151151
{
152152
if (sql != null)
153153
dbCmd.CommandText = sql;

0 commit comments

Comments
 (0)