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