1
+ using System . Collections . Generic ;
2
+ using System . Data ;
3
+ using System . Linq ;
4
+ using System . Threading . Tasks ;
5
+ using NUnit . Framework ;
6
+ using ServiceStack . Text ;
7
+
8
+ namespace ServiceStack . OrmLite . Tests
9
+ {
10
+ public class DummyTable
11
+ {
12
+ public int Id { get ; set ; }
13
+ public string Name { get ; set ; }
14
+ }
15
+
16
+ [ TestFixture ]
17
+ public class SqlServerProviderTestsAsync
18
+ {
19
+ private IDbConnection db ;
20
+
21
+ [ TestFixtureSetUp ]
22
+ public void TestFixtureSetUp ( )
23
+ {
24
+ db = Config . OpenDbConnection ( ) ;
25
+ }
26
+
27
+ [ TestFixtureTearDown ]
28
+ public void TearDown ( )
29
+ {
30
+ db . Dispose ( ) ;
31
+ }
32
+
33
+ [ Test ]
34
+ public async Task Can_SqlList_StoredProc_returning_Table_Async ( )
35
+ {
36
+ var sql = @"CREATE PROCEDURE dbo.DummyTable
37
+ @Times integer
38
+ AS
39
+ BEGIN
40
+ SET NOCOUNT ON;
41
+
42
+ CREATE TABLE #Temp
43
+ (
44
+ Id integer NOT NULL,
45
+ Name nvarchar(50) COLLATE DATABASE_DEFAULT NOT NULL
46
+ );
47
+
48
+ declare @i int
49
+ set @i=1
50
+ WHILE @i < @Times
51
+ BEGIN
52
+ INSERT INTO #Temp (Id, Name) VALUES (@i, CAST(@i as nvarchar))
53
+ SET @i = @i + 1
54
+ END
55
+
56
+ SELECT * FROM #Temp;
57
+
58
+ DROP TABLE #Temp;
59
+ END;" ;
60
+ await db . ExecuteSqlAsync ( "IF OBJECT_ID('DummyTable') IS NOT NULL DROP PROC DummyTable" ) ;
61
+ await db . ExecuteSqlAsync ( sql ) ;
62
+
63
+ var expected = 0 ;
64
+ 10 . Times ( i => expected += i ) ;
65
+
66
+ var results = await db . SqlListAsync < DummyTable > ( "EXEC DummyTable @Times" , new { Times = 10 } ) ;
67
+ results . PrintDump ( ) ;
68
+ Assert . That ( results . Sum ( x => x . Id ) , Is . EqualTo ( expected ) ) ;
69
+
70
+ results = await db . SqlListAsync < DummyTable > ( "EXEC DummyTable 10" ) ;
71
+ Assert . That ( results . Sum ( x => x . Id ) , Is . EqualTo ( expected ) ) ;
72
+
73
+ results = await db . SqlListAsync < DummyTable > ( "EXEC DummyTable @Times" , new Dictionary < string , object > { { "Times" , 10 } } ) ;
74
+ Assert . That ( results . Sum ( x => x . Id ) , Is . EqualTo ( expected ) ) ;
75
+ }
76
+
77
+ [ Test ]
78
+ public async Task Can_SqlColumn_StoredProc_returning_Column_Async ( )
79
+ {
80
+ var sql = @"CREATE PROCEDURE dbo.DummyColumn
81
+ @Times integer
82
+ AS
83
+ BEGIN
84
+ SET NOCOUNT ON;
85
+
86
+ CREATE TABLE #Temp
87
+ (
88
+ Id integer NOT NULL,
89
+ );
90
+
91
+ declare @i int
92
+ set @i=1
93
+ WHILE @i < @Times
94
+ BEGIN
95
+ INSERT INTO #Temp (Id) VALUES (@i)
96
+ SET @i = @i + 1
97
+ END
98
+
99
+ SELECT * FROM #Temp;
100
+
101
+ DROP TABLE #Temp;
102
+ END;" ;
103
+ await db . ExecuteSqlAsync ( "IF OBJECT_ID('DummyColumn') IS NOT NULL DROP PROC DummyColumn" ) ;
104
+ await db . ExecuteSqlAsync ( sql ) ;
105
+
106
+ var expected = 0 ;
107
+ 10 . Times ( i => expected += i ) ;
108
+
109
+ var results = await db . SqlColumnAsync < int > ( "EXEC DummyColumn @Times" , new { Times = 10 } ) ;
110
+ results . PrintDump ( ) ;
111
+ Assert . That ( results . Sum ( ) , Is . EqualTo ( expected ) ) ;
112
+
113
+ results = await db . SqlColumnAsync < int > ( "EXEC DummyColumn 10" ) ;
114
+ Assert . That ( results . Sum ( ) , Is . EqualTo ( expected ) ) ;
115
+
116
+ results = await db . SqlColumnAsync < int > ( "EXEC DummyColumn @Times" , new Dictionary < string , object > { { "Times" , 10 } } ) ;
117
+ Assert . That ( results . Sum ( ) , Is . EqualTo ( expected ) ) ;
118
+ }
119
+
120
+ [ Test ]
121
+ public async Task Can_SqlColumn_StoredProc_returning_StringColumn_Async ( )
122
+ {
123
+ var sql = @"CREATE PROCEDURE dbo.DummyColumn
124
+ @Times integer
125
+ AS
126
+ BEGIN
127
+ SET NOCOUNT ON;
128
+
129
+ CREATE TABLE #Temp
130
+ (
131
+ Name nvarchar(50) not null
132
+ );
133
+
134
+ declare @i int
135
+ set @i=0
136
+ WHILE @i < @Times
137
+ BEGIN
138
+ INSERT INTO #Temp (Name) VALUES (CAST(NEWID() AS nvarchar(50)))
139
+ SET @i = @i + 1
140
+ END
141
+
142
+ SELECT * FROM #Temp;
143
+
144
+ DROP TABLE #Temp;
145
+ END;" ;
146
+ await db . ExecuteSqlAsync ( "IF OBJECT_ID('DummyColumn') IS NOT NULL DROP PROC DummyColumn" ) ;
147
+ await db . ExecuteSqlAsync ( sql ) ;
148
+
149
+ // This produces a compiler error
150
+ var results = await db . SqlColumnAsync < string > ( "EXEC DummyColumn @Times" , new { Times = 10 } ) ;
151
+ results . PrintDump ( ) ;
152
+ Assert . That ( results . Count , Is . EqualTo ( 10 ) ) ;
153
+ }
154
+
155
+ [ Test ]
156
+ public async Task Can_SqlScalar_StoredProc_returning_Scalar_Async ( )
157
+ {
158
+ var sql = @"CREATE PROCEDURE dbo.DummyScalar
159
+ @Times integer
160
+ AS
161
+ BEGIN
162
+ SET NOCOUNT ON;
163
+
164
+ SELECT @Times AS Id
165
+ END;" ;
166
+ await db . ExecuteSqlAsync ( "IF OBJECT_ID('DummyScalar') IS NOT NULL DROP PROC DummyScalar" ) ;
167
+ await db . ExecuteSqlAsync ( sql ) ;
168
+
169
+ const int expected = 10 ;
170
+
171
+ var result = await db . SqlScalarAsync < int > ( "EXEC DummyScalar @Times" , new { Times = 10 } ) ;
172
+ result . PrintDump ( ) ;
173
+ Assert . That ( result , Is . EqualTo ( expected ) ) ;
174
+
175
+ result = await db . SqlScalarAsync < int > ( "EXEC DummyScalar 10" ) ;
176
+ Assert . That ( result , Is . EqualTo ( expected ) ) ;
177
+
178
+ result = await db . SqlScalarAsync < int > ( "EXEC DummyScalar @Times" , new Dictionary < string , object > { { "Times" , 10 } } ) ;
179
+ Assert . That ( result , Is . EqualTo ( expected ) ) ;
180
+
181
+ result = await db . SqlScalarAsync < int > ( "SELECT 10" ) ;
182
+ Assert . That ( result , Is . EqualTo ( expected ) ) ;
183
+ }
184
+
185
+ [ Test ]
186
+ public async Task Can_SqlScalar_StoredProc_passing_null_parameter_Async ( )
187
+ {
188
+ const string sql = @"CREATE PROCEDURE dbo.DummyScalar
189
+ @Times integer
190
+ AS
191
+ BEGIN
192
+ SET NOCOUNT ON;
193
+
194
+ SELECT @Times AS Id
195
+ END;" ;
196
+ await db . ExecuteSqlAsync ( "IF OBJECT_ID('DummyScalar') IS NOT NULL DROP PROC DummyScalar" ) ;
197
+ await db . ExecuteSqlAsync ( sql ) ;
198
+
199
+ var result = await db . SqlScalarAsync < int ? > ( "EXEC DummyScalar @Times" , new { Times = ( int ? ) null } ) ;
200
+ Assert . That ( result , Is . Null ) ;
201
+
202
+ result = await db . SqlScalarAsync < int ? > ( "EXEC DummyScalar NULL" ) ;
203
+ Assert . That ( result , Is . Null ) ;
204
+
205
+ result = await db . SqlScalarAsync < int ? > ( "EXEC DummyScalar @Times" , new Dictionary < string , object > { { "Times" , null } } ) ;
206
+ Assert . That ( result , Is . Null ) ;
207
+
208
+ result = await db . SqlScalarAsync < int ? > ( "SELECT NULL" ) ;
209
+ Assert . That ( result , Is . Null ) ;
210
+ }
211
+
212
+ [ Test ]
213
+ public async Task Can_SqlList_StoredProc_passing_null_parameter_Async ( )
214
+ {
215
+ const string sql = @"CREATE PROCEDURE dbo.DummyProc
216
+ @Name nvarchar(50)
217
+ AS
218
+ BEGIN
219
+ SET NOCOUNT ON;
220
+
221
+ SELECT 1 AS Id, 'Name_1' AS Name WHERE @Name IS NULL
222
+ UNION ALL
223
+ SELECT 2 AS Id, 'Name_2' AS Name WHERE @Name IS NOT NULL
224
+ UNION ALL
225
+ SELECT 3 AS Id, 'Name_3' AS Name WHERE @Name IS NULL
226
+
227
+ END;" ;
228
+ await db . ExecuteSqlAsync ( "IF OBJECT_ID('DummyProc') IS NOT NULL DROP PROC DummyProc" ) ;
229
+ await db . ExecuteSqlAsync ( sql ) ;
230
+
231
+ var results = await db . SqlColumnAsync < DummyTable > ( "EXEC DummyProc @Name" , new { Name = ( string ) null } ) ;
232
+ Assert . That ( results . Count , Is . EqualTo ( 2 ) ) ;
233
+ Assert . That ( results [ 0 ] . Name , Is . EqualTo ( "Name_1" ) ) ;
234
+ Assert . That ( results [ 1 ] . Name , Is . EqualTo ( "Name_3" ) ) ;
235
+ }
236
+
237
+ [ Test ]
238
+ public async Task Can_SqlList_StoredProc_receiving_only_first_column_and_null_Async ( )
239
+ {
240
+ const string sql = @"CREATE PROCEDURE dbo.DummyScalar
241
+ AS
242
+ BEGIN
243
+ SET NOCOUNT ON;
244
+
245
+ SELECT NULL AS Id, 'Name_1' AS Name
246
+ UNION ALL
247
+ SELECT NULL AS Id, 'Name_2' AS Name
248
+ END;" ;
249
+ await db . ExecuteSqlAsync ( "IF OBJECT_ID('DummyScalar') IS NOT NULL DROP PROC DummyScalar" ) ;
250
+ await db . ExecuteSqlAsync ( sql ) ;
251
+
252
+ var results = await db . SqlColumnAsync < int ? > ( "EXEC DummyScalar" ) ;
253
+ Assert . That ( results . Count , Is . EqualTo ( 2 ) ) ;
254
+ Assert . That ( results [ 0 ] , Is . Null ) ;
255
+ Assert . That ( results [ 1 ] , Is . Null ) ;
256
+ }
257
+ }
258
+ }
0 commit comments