1+ using System . Data ;
2+ using System . Threading . Tasks ;
3+ using NUnit . Framework ;
4+ using ServiceStack . DataAnnotations ;
5+
6+ namespace ServiceStack . OrmLite . Tests
7+ {
8+ public class LetterFrequency
9+ {
10+ [ AutoIncrement ]
11+ public int Id { get ; set ; }
12+
13+ public string Letter { get ; set ; }
14+ }
15+
16+ [ TestFixture ]
17+ public class CustomSqlTestsAsync : OrmLiteTestBase
18+ {
19+ private const string DropProcedureSql = @"
20+ IF OBJECT_ID('spSearchLetters') IS NOT NULL
21+ DROP PROCEDURE spSearchLetters" ;
22+
23+ private const string CreateProcedureSql = @"
24+ CREATE PROCEDURE spSearchLetters
25+ (
26+ @pLetter varchar(10),
27+ @pTotal int OUT
28+ )
29+ AS
30+ BEGIN
31+ SELECT @pTotal = COUNT(*) FROM LetterFrequency WHERE Letter = @pLetter
32+ SELECT * FROM LetterFrequency WHERE Letter = @pLetter
33+ END" ;
34+
35+ [ Test ]
36+ public async Task Can_execute_stored_procedure_using_SqlList_with_out_params ( )
37+ {
38+ using ( var db = OpenDbConnection ( ) )
39+ {
40+ db . DropAndCreateTable < LetterFrequency > ( ) ;
41+
42+ var rows = "A,B,B,C,C,C,D,D,E" . Split ( ',' ) . Map ( x => new LetterFrequency { Letter = x } ) ;
43+ await db . InsertAllAsync ( rows ) ;
44+
45+ await db . ExecuteSqlAsync ( DropProcedureSql ) ;
46+ await db . ExecuteSqlAsync ( CreateProcedureSql ) ;
47+
48+ IDbDataParameter pTotal = null ;
49+ var results = await db . SqlListAsync < LetterFrequency > ( "spSearchLetters" ,
50+ cmd => {
51+ cmd . CommandType = CommandType . StoredProcedure ;
52+ cmd . AddParam ( "pLetter" , "C" ) ;
53+ pTotal = cmd . AddParam ( "pTotal" , direction : ParameterDirection . Output ) ;
54+ } ) ;
55+
56+ Assert . That ( results . Count , Is . EqualTo ( 3 ) ) ;
57+ Assert . That ( pTotal . Value , Is . EqualTo ( "3" ) ) ;
58+ }
59+ }
60+
61+ [ Test ]
62+ public async Task Can_execute_stored_procedure_using_SqlProc_with_out_params ( )
63+ {
64+ using ( var db = OpenDbConnection ( ) )
65+ {
66+ db . DropAndCreateTable < LetterFrequency > ( ) ;
67+
68+ var rows = "A,B,B,C,C,C,D,D,E" . Split ( ',' ) . Map ( x => new LetterFrequency { Letter = x } ) ;
69+ await db . InsertAllAsync ( rows ) ;
70+
71+ await db . ExecuteSqlAsync ( DropProcedureSql ) ;
72+ await db . ExecuteSqlAsync ( CreateProcedureSql ) ;
73+
74+ var cmd = db . SqlProc ( "spSearchLetters" , new { pLetter = "C" } ) ;
75+
76+ Assert . That ( ( ( OrmLiteCommand ) cmd ) . IsDisposed , Is . False ) ;
77+
78+ var pTotal = cmd . AddParam ( "pTotal" , direction : ParameterDirection . Output ) ;
79+ var results = await cmd . ConvertToListAsync < LetterFrequency > ( ) ;
80+
81+ Assert . That ( results . Count , Is . EqualTo ( 3 ) ) ;
82+ Assert . That ( pTotal . Value , Is . EqualTo ( "3" ) ) ;
83+ }
84+ }
85+
86+ [ Test ]
87+ public async Task Can_execute_stored_proceduce_returning_scalars ( )
88+ {
89+ using ( var db = OpenDbConnection ( ) )
90+ {
91+ using ( var cmd = db . SqlProc (
92+ "GetUserIdsFromEmailAddresses" , new { EmailAddresses = "as@if.com" } ) )
93+ {
94+ var userIds = await cmd . ConvertToListAsync < int > ( ) ;
95+
96+ Assert . That ( userIds . Count , Is . GreaterThan ( 0 ) ) ;
97+ }
98+ }
99+ }
100+ }
101+ }
0 commit comments