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 = "[email protected] " } ) )
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