2 // SqlCommandTest.cs - NUnit Test Cases for testing the
5 // Umadevi S (sumadevi@novell.com)
6 // Sureshkumar T (tsureshkumar@novell.com)
7 // Senganal T (tsenganal@novell.com)
9 // Copyright (c) 2004 Novell Inc., and the individuals listed
10 // on the ChangeLog entries.
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System.Data.Common;
35 using System.Data.SqlClient;
37 using System.Data.Sql;
39 using System.Globalization;
44 using NUnit.Framework;
46 namespace MonoTests.System.Data.SqlClient
49 [Category ("sqlserver")]
50 public class SqlCommandTest
54 string connectionString = ConnectionManager.Singleton.ConnectionString;
56 static readonly decimal SMALLMONEY_MAX = 214748.3647m;
57 static readonly decimal SMALLMONEY_MIN = -214748.3648m;
60 public void TearDown ()
73 [Test] // ctor (String, SqlConnection, SqlTransaction)
74 public void Constructor4 ()
76 string cmdText = "select @@version";
78 SqlTransaction trans = null;
79 SqlConnection connA = null;
80 SqlConnection connB = null;
82 // transaction from same connection
84 connA = new SqlConnection (connectionString);
87 trans = connA.BeginTransaction ();
88 cmd = new SqlCommand (cmdText, connA, trans);
90 Assert.AreEqual (cmdText, cmd.CommandText, "#A1");
91 Assert.AreEqual (30, cmd.CommandTimeout, "#A2");
92 Assert.AreEqual (CommandType.Text, cmd.CommandType, "#A3");
93 Assert.AreSame (connA, cmd.Connection, "#A4");
94 Assert.IsNull (cmd.Container, "#A5");
95 Assert.IsTrue (cmd.DesignTimeVisible, "#A6");
97 Assert.IsNull (cmd.Notification, "#A7");
98 Assert.IsTrue (cmd.NotificationAutoEnlist, "#A8");
100 Assert.IsNotNull (cmd.Parameters, "#A9");
101 Assert.AreEqual (0, cmd.Parameters.Count, "#A10");
102 Assert.IsNull (cmd.Site, "#A11");
103 Assert.AreSame (trans, cmd.Transaction, "#A12");
104 Assert.AreEqual (UpdateRowSource.Both, cmd.UpdatedRowSource, "#A13");
112 // transaction from other connection
114 connA = new SqlConnection (connectionString);
116 connB = new SqlConnection (connectionString);
119 trans = connB.BeginTransaction ();
120 cmd = new SqlCommand (cmdText, connA, trans);
122 Assert.AreEqual (cmdText, cmd.CommandText, "#B1");
123 Assert.AreEqual (30, cmd.CommandTimeout, "#B2");
124 Assert.AreEqual (CommandType.Text, cmd.CommandType, "#B3");
125 Assert.AreSame (connA, cmd.Connection, "#B4");
126 Assert.IsNull (cmd.Container, "#B5");
127 Assert.IsTrue (cmd.DesignTimeVisible, "#B6");
129 Assert.IsNull (cmd.Notification, "#B7");
130 Assert.IsTrue (cmd.NotificationAutoEnlist, "#B8");
132 Assert.IsNotNull (cmd.Parameters, "#B9");
133 Assert.AreEqual (0, cmd.Parameters.Count, "#B10");
134 Assert.IsNull (cmd.Site, "#B11");
135 Assert.AreSame (trans, cmd.Transaction, "#B12");
136 Assert.AreEqual (UpdateRowSource.Both, cmd.UpdatedRowSource, "#B13");
146 public void ExecuteScalar ()
148 conn = new SqlConnection (connectionString);
149 cmd = new SqlCommand ("" , conn);
150 cmd.CommandText = "Select count(*) from numeric_family where id<=4";
152 // Check the Return value for a Correct Query
155 result = cmd.ExecuteScalar ();
156 Assert.AreEqual (4, (int)result, "#A1 Query Result returned is incorrect");
158 cmd.CommandText = "select id , type_bit from numeric_family order by id asc";
159 result = Convert.ToInt32 (cmd.ExecuteScalar ());
160 Assert.AreEqual (1, result,
161 "#A2 ExecuteScalar Should return (1,1) the result set" );
163 cmd.CommandText = "select id from numeric_family where id=-1";
164 result = cmd.ExecuteScalar ();
165 Assert.IsNull (result, "#A3 Null should be returned if result set is empty");
167 // Check SqlException is thrown for Invalid Query
168 cmd.CommandText = "select count* from numeric_family";
170 result = cmd.ExecuteScalar ();
172 } catch (SqlException ex) {
173 // Incorrect syntax near the keyword 'from'
174 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#B2");
175 Assert.AreEqual ((byte) 15, ex.Class, "#B3");
176 Assert.IsNull (ex.InnerException, "#B4");
177 Assert.IsNotNull (ex.Message, "#B5");
178 Assert.IsTrue (ex.Message.IndexOf ("'from'") != -1, "#B6");
179 Assert.AreEqual (156, ex.Number, "#B7");
180 Assert.AreEqual ((byte) 1, ex.State, "#B8");
183 // Parameterized stored procedure calls
186 string string_value = "output value changed";
187 string return_value = "first column of first rowset";
190 "create procedure #tmp_executescalar_outparams "+
191 " (@p1 int, @p2 int out, @p3 varchar(200) out) "+
193 "select '" + return_value + "' as 'col1', @p1 as 'col2' "+
194 "set @p2 = @p2 * 2 "+
195 "set @p3 = N'" + string_value + "' "+
196 "select 'second rowset' as 'col1', 2 as 'col2' "+
199 cmd.CommandType = CommandType.Text;
200 cmd.ExecuteNonQuery ();
202 cmd.CommandText = "#tmp_executescalar_outparams";
203 cmd.CommandType = CommandType.StoredProcedure;
205 SqlParameter p1 = new SqlParameter ();
206 p1.ParameterName = "@p1";
207 p1.Direction = ParameterDirection.Input;
208 p1.DbType = DbType.Int32;
209 p1.Value = int_value;
210 cmd.Parameters.Add (p1);
212 SqlParameter p2 = new SqlParameter ();
213 p2.ParameterName = "@p2";
214 p2.Direction = ParameterDirection.InputOutput;
215 p2.DbType = DbType.Int32;
216 p2.Value = int_value;
217 cmd.Parameters.Add (p2);
219 SqlParameter p3 = new SqlParameter ();
220 p3.ParameterName = "@p3";
221 p3.Direction = ParameterDirection.Output;
222 p3.DbType = DbType.String;
224 cmd.Parameters.Add (p3);
226 result = cmd.ExecuteScalar ();
227 Assert.AreEqual (return_value, result, "#C1 ExecuteScalar Should return 'first column of first rowset'");
228 Assert.AreEqual (int_value * 2, p2.Value, "#C2 ExecuteScalar should fill the parameter collection with the outputted values");
229 Assert.AreEqual (string_value, p3.Value, "#C3 ExecuteScalar should fill the parameter collection with the outputted values");
234 cmd.ExecuteScalar ();
235 Assert.Fail ("#D1 Query should throw System.InvalidOperationException due to size = 0 and value = null");
236 } catch (InvalidOperationException ex) {
237 // String[2]: the Size property has an invalid
239 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2");
240 Assert.IsNull (ex.InnerException, "#D3");
241 Assert.IsNotNull (ex.Message, "#D4");
248 public void ExecuteScalar_Connection_PendingTransaction ()
250 conn = new SqlConnection (connectionString);
253 using (SqlTransaction trans = conn.BeginTransaction ()) {
254 cmd = new SqlCommand ("select @@version", conn);
257 cmd.ExecuteScalar ();
259 } catch (InvalidOperationException ex) {
260 // ExecuteScalar requires the command
261 // to have a transaction object when the
262 // connection assigned to the command is
263 // in a pending local transaction. The
264 // Transaction property of the command
265 // has not been initialized
266 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
267 Assert.IsNull (ex.InnerException, "#3");
268 Assert.IsNotNull (ex.Message, "#4");
270 Assert.IsTrue (ex.Message.IndexOf ("ExecuteScalar") != -1, "#5:" + ex.Message);
272 Assert.IsTrue (ex.Message.IndexOf ("Execute") != -1, "#5:" + ex.Message);
279 public void ExecuteScalar_Query_Invalid ()
281 conn = new SqlConnection (connectionString);
284 cmd = new SqlCommand ("InvalidQuery", conn);
286 cmd.ExecuteScalar ();
288 } catch (SqlException ex) {
289 // Could not find stored procedure 'InvalidQuery'
290 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
291 Assert.AreEqual ((byte) 16, ex.Class, "#3");
292 Assert.IsNull (ex.InnerException, "#4");
293 Assert.IsNotNull (ex.Message, "#5");
294 Assert.IsTrue (ex.Message.IndexOf ("'InvalidQuery'") != -1, "#6");
295 Assert.AreEqual (2812, ex.Number, "#7");
296 Assert.AreEqual ((byte) 62, ex.State, "#8");
301 public void ExecuteScalar_Transaction_NotAssociated ()
303 SqlTransaction trans = null;
304 SqlConnection connA = null;
305 SqlConnection connB = null;
308 connA = new SqlConnection (connectionString);
311 connB = new SqlConnection (connectionString);
314 trans = connA.BeginTransaction ();
316 cmd = new SqlCommand ("select @@version", connB, trans);
319 cmd.ExecuteScalar ();
321 } catch (InvalidOperationException ex) {
322 // The transaction object is not associated
323 // with the connection object
324 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
325 Assert.IsNull (ex.InnerException, "#A3");
326 Assert.IsNotNull (ex.Message, "#A4");
331 cmd = new SqlCommand ("select @@version", connB);
332 cmd.Transaction = trans;
335 cmd.ExecuteScalar ();
337 } catch (InvalidOperationException ex) {
338 // The transaction object is not associated
339 // with the connection object
340 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
341 Assert.IsNull (ex.InnerException, "#B3");
342 Assert.IsNotNull (ex.Message, "#B4");
357 public void ExecuteScalar_Transaction_Only ()
359 SqlTransaction trans = null;
361 conn = new SqlConnection (connectionString);
363 trans = conn.BeginTransaction ();
365 cmd = new SqlCommand ("select @@version");
366 cmd.Transaction = trans;
369 cmd.ExecuteScalar ();
371 } catch (InvalidOperationException ex) {
372 // ExecuteScalar: Connection property has not
374 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
375 Assert.IsNull (ex.InnerException, "#3");
376 Assert.IsNotNull (ex.Message, "#4");
378 Assert.IsTrue (ex.Message.StartsWith ("ExecuteScalar:"), "#5");
380 Assert.IsTrue (ex.Message.StartsWith ("ExecuteReader:"), "#5");
388 public void ExecuteNonQuery ()
390 conn = new SqlConnection (connectionString);
393 SqlTransaction trans = conn.BeginTransaction ();
395 cmd = conn.CreateCommand ();
396 cmd.Transaction = trans;
401 cmd.CommandText = "Select id from numeric_family where id=1";
402 result = cmd.ExecuteNonQuery ();
403 Assert.AreEqual (-1, result, "#A1");
405 cmd.CommandText = "Insert into numeric_family (id,type_int) values (100,200)";
406 result = cmd.ExecuteNonQuery ();
407 Assert.AreEqual (1, result, "#A2 One row shud be inserted");
409 cmd.CommandText = "Update numeric_family set type_int=300 where id=100";
410 result = cmd.ExecuteNonQuery ();
411 Assert.AreEqual (1, result, "#A3 One row shud be updated");
413 // Test Batch Commands
414 cmd.CommandText = "Select id from numeric_family where id=1;";
415 cmd.CommandText += "update numeric_family set type_int=10 where id=1000";
416 cmd.CommandText += "update numeric_family set type_int=10 where id=100";
417 result = cmd.ExecuteNonQuery ();
418 Assert.AreEqual (1, result, "#A4 One row shud be updated");
420 cmd.CommandText = "Delete from numeric_family where id=100";
421 result = cmd.ExecuteNonQuery ();
422 Assert.AreEqual (1, result, "#A5 One row shud be deleted");
427 // Parameterized stored procedure calls
430 string string_value = "output value changed";
433 "create procedure #tmp_executescalar_outparams " +
434 " (@p1 int, @p2 int out, @p3 varchar(200) out) " +
436 "select 'test' as 'col1', @p1 as 'col2' " +
437 "set @p2 = @p2 * 2 " +
438 "set @p3 = N'" + string_value + "' " +
439 "select 'second rowset' as 'col1', 2 as 'col2' " +
442 cmd.CommandType = CommandType.Text;
443 cmd.ExecuteNonQuery ();
445 cmd.CommandText = "#tmp_executescalar_outparams";
446 cmd.CommandType = CommandType.StoredProcedure;
448 SqlParameter p1 = new SqlParameter ();
449 p1.ParameterName = "@p1";
450 p1.Direction = ParameterDirection.Input;
451 p1.DbType = DbType.Int32;
452 p1.Value = int_value;
453 cmd.Parameters.Add (p1);
455 SqlParameter p2 = new SqlParameter ();
456 p2.ParameterName = "@p2";
457 p2.Direction = ParameterDirection.InputOutput;
458 p2.DbType = DbType.Int32;
459 p2.Value = int_value;
460 cmd.Parameters.Add (p2);
462 SqlParameter p3 = new SqlParameter ();
463 p3.ParameterName = "@p3";
464 p3.Direction = ParameterDirection.Output;
465 p3.DbType = DbType.String;
467 cmd.Parameters.Add (p3);
469 cmd.ExecuteNonQuery ();
470 Assert.AreEqual (int_value * 2, p2.Value, "#B1 ExecuteNonQuery should fill the parameter collection with the outputted values");
471 Assert.AreEqual (string_value, p3.Value, "#B2 ExecuteNonQuery should fill the parameter collection with the outputted values");
475 public void ExecuteNonQuery_Connection_PendingTransaction ()
477 conn = new SqlConnection (connectionString);
480 using (SqlTransaction trans = conn.BeginTransaction ()) {
481 cmd = new SqlCommand ("select @@version", conn);
484 cmd.ExecuteNonQuery ();
486 } catch (InvalidOperationException ex) {
487 // ExecuteNonQuery requires the command
488 // to have a transaction object when the
489 // connection assigned to the command is
490 // in a pending local transaction. The
491 // Transaction property of the command
492 // has not been initialized
493 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
494 Assert.IsNull (ex.InnerException, "#3");
495 Assert.IsNotNull (ex.Message, "#4");
497 Assert.IsTrue (ex.Message.IndexOf ("ExecuteNonQuery") != -1, "#5:" + ex.Message);
499 Assert.IsTrue (ex.Message.IndexOf ("Execute") != -1, "#5:" + ex.Message);
506 public void ExecuteNonQuery_Query_Invalid ()
508 conn = new SqlConnection (connectionString);
510 cmd = new SqlCommand ("select id1 from numeric_family", conn);
513 cmd.ExecuteNonQuery ();
515 } catch (SqlException ex) {
516 // Invalid column name 'id1'
517 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
518 Assert.AreEqual ((byte) 16, ex.Class, "#3");
519 Assert.IsNull (ex.InnerException, "#4");
520 Assert.IsNotNull (ex.Message, "#5");
521 Assert.IsTrue (ex.Message.IndexOf ("'id1'") != -1, "#6");
522 Assert.AreEqual (207, ex.Number, "#7");
523 Assert.AreEqual ((byte) 1, ex.State, "#8");
530 public void ExecuteNonQuery_Transaction_NotAssociated ()
532 SqlTransaction trans = null;
533 SqlConnection connA = null;
534 SqlConnection connB = null;
537 connA = new SqlConnection (connectionString);
540 connB = new SqlConnection (connectionString);
543 trans = connA.BeginTransaction ();
545 cmd = new SqlCommand ("select @@version", connB, trans);
548 cmd.ExecuteNonQuery ();
550 } catch (InvalidOperationException ex) {
551 // The transaction object is not associated
552 // with the connection object
553 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
554 Assert.IsNull (ex.InnerException, "#A3");
555 Assert.IsNotNull (ex.Message, "#A4");
560 cmd = new SqlCommand ("select @@version", connB);
561 cmd.Transaction = trans;
564 cmd.ExecuteNonQuery ();
566 } catch (InvalidOperationException ex) {
567 // The transaction object is not associated
568 // with the connection object
569 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
570 Assert.IsNull (ex.InnerException, "#B3");
571 Assert.IsNotNull (ex.Message, "#B4");
586 public void ExecuteNonQuery_Transaction_Only ()
588 conn = new SqlConnection (connectionString);
591 SqlTransaction trans = conn.BeginTransaction ();
593 cmd = new SqlCommand ("select @@version");
594 cmd.Transaction = trans;
597 cmd.ExecuteNonQuery ();
599 } catch (InvalidOperationException ex) {
600 // ExecuteNonQuery: Connection property has not
602 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
603 Assert.IsNull (ex.InnerException, "#3");
604 Assert.IsNotNull (ex.Message, "#4");
605 Assert.IsTrue (ex.Message.StartsWith ("ExecuteNonQuery:"), "#5");
611 [Test] // bug #412569
612 public void ExecuteReader ()
614 // Test for command behaviors
615 DataTable schemaTable = null;
616 SqlDataReader reader = null;
618 conn = new SqlConnection (connectionString);
620 cmd = new SqlCommand ("", conn);
621 cmd.CommandText = "Select id from numeric_family where id <=4 order by id asc;";
622 cmd.CommandText += "Select type_bit from numeric_family where id <=4 order by id asc";
624 // Test for default command behavior
625 reader = cmd.ExecuteReader ();
629 while (reader.Read ())
631 Assert.AreEqual (4, rows, "#1 Multiple rows shud be returned");
634 } while (reader.NextResult ());
635 Assert.AreEqual (2, results, "#2 Multiple result sets shud be returned");
638 // Test if closing reader, closes the connection
639 reader = cmd.ExecuteReader (CommandBehavior.CloseConnection);
641 Assert.AreEqual (ConnectionState.Closed, conn.State,
642 "#3 Command Behavior is not followed");
645 // Test if row info and primary Key info is returned
646 reader = cmd.ExecuteReader (CommandBehavior.KeyInfo);
647 schemaTable = reader.GetSchemaTable ();
648 Assert.IsTrue (reader.HasRows, "#4 Data Rows shud also be returned");
649 Assert.IsTrue ((bool) schemaTable.Rows [0] ["IsKey"],
650 "#5 Primary Key info shud be returned");
653 // Test only column information is returned
654 reader = cmd.ExecuteReader (CommandBehavior.SchemaOnly);
655 schemaTable = reader.GetSchemaTable ();
656 Assert.IsFalse (reader.HasRows, "#6 row data shud not be returned");
657 Assert.AreEqual (DBNull.Value, schemaTable.Rows [0] ["IsKey"],
658 "#7 Primary Key info shud not be returned");
659 Assert.AreEqual ("id", schemaTable.Rows [0] ["ColumnName"],
660 "#8 Schema Data is Incorrect");
663 // Test only one result set (first) is returned
664 reader = cmd.ExecuteReader (CommandBehavior.SingleResult);
665 schemaTable = reader.GetSchemaTable ();
666 Assert.IsFalse (reader.NextResult (),
667 "#9 Only one result set shud be returned");
668 Assert.AreEqual ("id", schemaTable.Rows [0] ["ColumnName"],
669 "#10 The result set returned shud be the first result set");
672 // Test only one row is returned for all result sets
673 // msdotnet doesnt work correctly.. returns only one result set
674 reader = cmd.ExecuteReader (CommandBehavior.SingleRow);
678 while (reader.Read ())
680 Assert.AreEqual (1, rows, "#11 Only one row shud be returned");
683 } while (reader.NextResult ());
686 // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=357085
687 Assert.AreEqual (1, results, "#12 Multiple result sets shud be returned");
692 public void ExecuteReader_Connection_PendingTransaction ()
694 conn = new SqlConnection (connectionString);
697 using (SqlTransaction trans = conn.BeginTransaction ()) {
698 cmd = new SqlCommand ("select @@version", conn);
701 cmd.ExecuteReader ();
703 } catch (InvalidOperationException ex) {
704 // ExecuteReader requires the command
705 // to have a transaction object when the
706 // connection assigned to the command is
707 // in a pending local transaction. The
708 // Transaction property of the command
709 // has not been initialized
710 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
711 Assert.IsNull (ex.InnerException, "#3");
712 Assert.IsNotNull (ex.Message, "#4");
714 Assert.IsTrue (ex.Message.IndexOf ("ExecuteReader") != -1, "#5:" + ex.Message);
716 Assert.IsTrue (ex.Message.IndexOf ("Execute") != -1, "#5:" + ex.Message);
723 public void ExecuteReader_Query_Invalid ()
725 conn = new SqlConnection (connectionString);
728 cmd = new SqlCommand ("InvalidQuery", conn);
730 cmd.ExecuteReader ();
732 } catch (SqlException ex) {
733 // Could not find stored procedure 'InvalidQuery'
734 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
735 Assert.AreEqual ((byte) 16, ex.Class, "#3");
736 Assert.IsNull (ex.InnerException, "#4");
737 Assert.IsNotNull (ex.Message, "#5");
738 Assert.IsTrue (ex.Message.IndexOf ("'InvalidQuery'") != -1, "#6");
739 Assert.AreEqual (2812, ex.Number, "#7");
740 Assert.AreEqual ((byte) 62, ex.State, "#8");
745 public void ExecuteReader_Transaction_NotAssociated ()
747 SqlTransaction trans = null;
748 SqlConnection connA = null;
749 SqlConnection connB = null;
752 connA = new SqlConnection (connectionString);
755 connB = new SqlConnection (connectionString);
758 trans = connA.BeginTransaction ();
760 cmd = new SqlCommand ("select @@version", connB, trans);
763 cmd.ExecuteReader ();
765 } catch (InvalidOperationException ex) {
766 // The transaction object is not associated
767 // with the connection object
768 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
769 Assert.IsNull (ex.InnerException, "#A3");
770 Assert.IsNotNull (ex.Message, "#A4");
775 cmd = new SqlCommand ("select @@version", connB);
776 cmd.Transaction = trans;
779 cmd.ExecuteReader ();
781 } catch (InvalidOperationException ex) {
782 // The transaction object is not associated
783 // with the connection object
784 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
785 Assert.IsNull (ex.InnerException, "#B3");
786 Assert.IsNotNull (ex.Message, "#B4");
801 public void ExecuteReader_Transaction_Only ()
803 SqlTransaction trans = null;
805 conn = new SqlConnection (connectionString);
807 trans = conn.BeginTransaction ();
809 cmd = new SqlCommand ("select @@version");
810 cmd.Transaction = trans;
813 cmd.ExecuteReader ();
815 } catch (InvalidOperationException ex) {
816 // ExecuteReader: Connection property has not
818 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
819 Assert.IsNull (ex.InnerException, "#3");
820 Assert.IsNotNull (ex.Message, "#4");
821 Assert.IsTrue (ex.Message.StartsWith ("ExecuteReader:"), "#5");
829 public void PrepareTest_CheckValidStatement ()
831 cmd = new SqlCommand ();
832 conn = new SqlConnection (connectionString);
835 cmd.CommandText = "Select id from numeric_family where id=@ID";
836 cmd.Connection = conn;
838 // Test if Parameters are correctly populated
839 cmd.Parameters.Clear ();
840 cmd.Parameters.Add ("@ID", SqlDbType.TinyInt);
841 cmd.Parameters["@ID"].Value = 2;
843 Assert.AreEqual (2, cmd.ExecuteScalar (), "#3 Prepared Stmt not working");
845 cmd.Parameters[0].Value = 3;
846 Assert.AreEqual (3, cmd.ExecuteScalar (), "#4 Prep Stmt not working");
851 public void Prepare ()
853 cmd = new SqlCommand ();
854 conn = new SqlConnection (connectionString);
857 cmd.CommandText = "Select id from numeric_family where id=@ID";
858 cmd.Connection = conn;
860 // Test InvalidOperation Exception is thrown if Parameter Type
861 // is not explicitly set
863 cmd.Parameters.AddWithValue ("@ID", 2);
865 cmd.Parameters.Add ("@ID", 2);
870 } catch (InvalidOperationException ex) {
871 // SqlCommand.Prepare method requires all parameters
872 // to have an explicitly set type
873 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
874 Assert.IsNull (ex.InnerException, "#A3");
875 Assert.IsNotNull (ex.Message, "#A4");
878 // Test Exception is thrown for variable size data if precision/scale
880 cmd.CommandText = "select type_varchar from string_family where type_varchar=@p1";
881 cmd.Parameters.Clear ();
882 cmd.Parameters.Add ("@p1", SqlDbType.VarChar);
883 cmd.Parameters["@p1"].Value = "afasasadadada";
887 } catch (InvalidOperationException ex) {
888 // SqlCommand.Prepare method requires all variable
889 // length parameters to have an explicitly set
891 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
892 Assert.IsNull (ex.InnerException, "#B3");
893 Assert.IsNotNull (ex.Message, "#B4");
896 // Test Exception is not thrown for Stored Procs
897 cmd.CommandType = CommandType.StoredProcedure;
898 cmd.CommandText = "ABFSDSFSF";
901 cmd.CommandType = CommandType.Text;
906 public void Prepare_Connection_PendingTransaction ()
908 conn = new SqlConnection (connectionString);
911 using (SqlTransaction trans = conn.BeginTransaction ()) {
912 // Text, without parameters
913 cmd = new SqlCommand ("select * from whatever where name=?", conn);
916 // Text, with parameters
917 cmd = new SqlCommand ("select * from whatever where name=?", conn);
918 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
922 } catch (InvalidOperationException ex) {
923 // Prepare requires the command to have a
924 // transaction object when the connection
925 // assigned to the command is in a pending
926 // local transaction. The Transaction
927 // property of the command has not been
929 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
930 Assert.IsNull (ex.InnerException, "#3");
931 Assert.IsNotNull (ex.Message, "#4");
933 Assert.IsTrue (ex.Message.IndexOf ("Prepare") != -1, "#5:" + ex.Message);
935 Assert.IsTrue (ex.Message.IndexOf ("Execute") != -1, "#5:" + ex.Message);
939 // Text, parameters cleared
940 cmd = new SqlCommand ("select * from whatever where name=?", conn);
941 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
942 cmd.Parameters.Clear ();
945 // StoredProcedure, without parameters
946 cmd = new SqlCommand ("FindCustomer", conn);
947 cmd.CommandType = CommandType.StoredProcedure;
950 // StoredProcedure, with parameters
951 cmd = new SqlCommand ("FindCustomer", conn);
952 cmd.CommandType = CommandType.StoredProcedure;
953 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
959 public void Prepare_Transaction_NotAssociated ()
961 SqlTransaction trans = null;
962 SqlConnection connA = null;
963 SqlConnection connB = null;
966 connA = new SqlConnection (connectionString);
969 connB = new SqlConnection (connectionString);
972 trans = connA.BeginTransaction ();
974 // Text, without parameters
975 cmd = new SqlCommand ("select @@version", connB, trans);
976 cmd.Transaction = trans;
979 // Text, with parameters
980 cmd = new SqlCommand ("select @@version", connB, trans);
981 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
985 } catch (InvalidOperationException ex) {
986 // The transaction is either not associated
987 // with the current connection or has been
989 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
990 Assert.IsNull (ex.InnerException, "#3");
991 Assert.IsNotNull (ex.Message, "#4");
994 // Text, parameters cleared
995 cmd = new SqlCommand ("select @@version", connB, trans);
996 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
997 cmd.Parameters.Clear ();
1000 // StoredProcedure, without parameters
1001 cmd = new SqlCommand ("FindCustomer", connB, trans);
1002 cmd.CommandType = CommandType.StoredProcedure;
1005 // StoredProcedure, with parameters
1006 cmd = new SqlCommand ("FindCustomer", connB, trans);
1007 cmd.CommandType = CommandType.StoredProcedure;
1008 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1021 public void Prepare_Transaction_Only ()
1023 SqlTransaction trans = null;
1025 conn = new SqlConnection (connectionString);
1027 trans = conn.BeginTransaction ();
1029 // Text, without parameters
1030 cmd = new SqlCommand ("select count(*) from whatever");
1031 cmd.Transaction = trans;
1035 Assert.Fail ("#A1");
1036 } catch (NullReferenceException) {
1042 // Text, with parameters
1043 cmd = new SqlCommand ("select count(*) from whatever");
1044 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1045 cmd.Transaction = trans;
1048 Assert.Fail ("#B1");
1050 } catch (NullReferenceException) {
1053 } catch (InvalidOperationException ex) {
1054 // Prepare: Connection property has not been
1056 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
1057 Assert.IsNull (ex.InnerException, "#B3");
1058 Assert.IsNotNull (ex.Message, "#B4");
1059 Assert.IsTrue (ex.Message.StartsWith ("Prepare:"), "#B5");
1063 // Text, parameters cleared
1064 cmd = new SqlCommand ("select count(*) from whatever");
1065 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1066 cmd.Parameters.Clear ();
1067 cmd.Transaction = trans;
1071 Assert.Fail ("#C1");
1072 } catch (NullReferenceException) {
1078 // StoredProcedure, without parameters
1079 cmd = new SqlCommand ("FindCustomer");
1080 cmd.CommandType = CommandType.StoredProcedure;
1081 cmd.Transaction = trans;
1085 Assert.Fail ("#D1");
1086 } catch (NullReferenceException) {
1092 // StoredProcedure, with parameters
1093 cmd = new SqlCommand ("FindCustomer");
1094 cmd.CommandType = CommandType.StoredProcedure;
1095 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1096 cmd.Transaction = trans;
1100 Assert.Fail ("#E1");
1101 } catch (NullReferenceException) {
1108 [Test] // bug #412576
1109 public void Connection ()
1111 SqlConnection connA = null;
1112 SqlConnection connB = null;
1113 SqlTransaction trans = null;
1116 connA = new SqlConnection (connectionString);
1119 connB = new SqlConnection (connectionString);
1122 cmd = connA.CreateCommand ();
1123 cmd.Connection = connB;
1124 Assert.AreSame (connB, cmd.Connection, "#A1");
1125 Assert.IsNull (cmd.Transaction, "#A2");
1128 trans = connA.BeginTransaction ();
1129 cmd = new SqlCommand ("select @@version", connA, trans);
1130 cmd.Connection = connB;
1131 Assert.AreSame (connB, cmd.Connection, "#B1");
1132 Assert.AreSame (trans, cmd.Transaction, "#B2");
1135 trans = connA.BeginTransaction ();
1136 cmd = new SqlCommand ("select @@version", connA, trans);
1138 Assert.AreSame (connA, cmd.Connection, "#C1");
1139 Assert.IsNull (cmd.Transaction, "#C2");
1140 cmd.Connection = connB;
1141 Assert.AreSame (connB, cmd.Connection, "#C3");
1142 Assert.IsNull (cmd.Transaction, "#C4");
1144 trans = connA.BeginTransaction ();
1145 cmd = new SqlCommand ("select @@version", connA, trans);
1146 cmd.Connection = null;
1147 Assert.IsNull (cmd.Connection, "#D1");
1148 Assert.AreSame (trans, cmd.Transaction, "#D2");
1160 public void Connection_Reader_Open ()
1162 SqlConnection connA = null;
1163 SqlConnection connB = null;
1164 SqlTransaction trans = null;
1167 connA = new SqlConnection (connectionString);
1170 connB = new SqlConnection (connectionString);
1173 trans = connA.BeginTransaction ();
1174 SqlCommand cmdA = new SqlCommand ("select @@version", connA, trans);
1176 SqlCommand cmdB = new SqlCommand ("select @@version", connA, trans);
1177 using (SqlDataReader reader = cmdB.ExecuteReader ()) {
1179 cmdA.Connection = connA;
1180 Assert.AreSame (connA, cmdA.Connection, "#A1");
1181 Assert.AreSame (trans, cmdA.Transaction, "#A2");
1184 cmdA.Connection = connA;
1185 Assert.Fail ("#A1");
1186 } catch (InvalidOperationException ex) {
1187 // The SqlCommand is currently busy
1189 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
1190 Assert.IsNull (ex.InnerException, "#A3");
1191 Assert.IsNotNull (ex.Message, "#A4");
1193 Assert.AreSame (connA, cmdA.Connection, "#A5");
1194 Assert.AreSame (trans, cmdA.Transaction, "#A6");
1199 cmdA.Connection = connB;
1200 Assert.AreSame (connB, cmdA.Connection, "#B1");
1201 Assert.AreSame (trans, cmdA.Transaction, "#B2");
1204 cmdA.Connection = connB;
1205 Assert.Fail ("#B1");
1206 } catch (InvalidOperationException ex) {
1207 // The SqlCommand is currently busy
1209 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
1210 Assert.IsNull (ex.InnerException, "#B3");
1211 Assert.IsNotNull (ex.Message, "#B4");
1213 Assert.AreSame (connA, cmdA.Connection, "#B5");
1214 Assert.AreSame (trans, cmdA.Transaction, "#B6");
1219 cmdA.Connection = null;
1220 Assert.IsNull (cmdA.Connection, "#C1");
1221 Assert.AreSame (trans, cmdA.Transaction, "#C2");
1224 cmdA.Connection = null;
1225 Assert.Fail ("#C1");
1226 } catch (InvalidOperationException ex) {
1227 // The SqlCommand is currently busy
1229 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2");
1230 Assert.IsNull (ex.InnerException, "#C3");
1231 Assert.IsNotNull (ex.Message, "#C4");
1233 Assert.AreSame (connA, cmdA.Connection, "#C5");
1234 Assert.AreSame (trans, cmdA.Transaction, "#C6");
1249 public void Transaction ()
1251 SqlConnection connA = null;
1252 SqlConnection connB = null;
1254 SqlTransaction transA = null;
1255 SqlTransaction transB = null;
1258 connA = new SqlConnection (connectionString);
1261 connB = new SqlConnection (connectionString);
1264 transA = connA.BeginTransaction ();
1265 transB = connB.BeginTransaction ();
1267 SqlCommand cmd = new SqlCommand ("select @@version", connA, transA);
1268 cmd.Transaction = transA;
1269 Assert.AreSame (connA, cmd.Connection, "#A1");
1270 Assert.AreSame (transA, cmd.Transaction, "#A2");
1271 cmd.Transaction = transB;
1272 Assert.AreSame (connA, cmd.Connection, "#B1");
1273 Assert.AreSame (transB, cmd.Transaction, "#B2");
1274 cmd.Transaction = null;
1275 Assert.AreSame (connA, cmd.Connection, "#C1");
1276 Assert.IsNull (cmd.Transaction, "#C2");
1289 [Test] // bug #412579
1290 public void Transaction_Reader_Open ()
1292 SqlConnection connA = null;
1293 SqlConnection connB = null;
1295 SqlTransaction transA = null;
1296 SqlTransaction transB = null;
1299 connA = new SqlConnection (connectionString);
1302 connB = new SqlConnection (connectionString);
1305 transA = connA.BeginTransaction ();
1306 transB = connB.BeginTransaction ();
1308 SqlCommand cmdA = new SqlCommand ("select * from employee", connA, transA);
1310 SqlCommand cmdB = new SqlCommand ("select * from employee", connA, transA);
1311 using (SqlDataReader reader = cmdB.ExecuteReader ()) {
1313 cmdA.Transaction = transA;
1314 Assert.AreSame (transA, cmdA.Transaction, "#A1");
1317 cmdA.Transaction = transA;
1318 Assert.Fail ("#A1");
1319 } catch (InvalidOperationException ex) {
1320 // The SqlCommand is currently busy
1322 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
1323 Assert.IsNull (ex.InnerException, "#A3");
1324 Assert.IsNotNull (ex.Message, "#A4");
1326 Assert.AreSame (transA, cmdA.Transaction, "#A5");
1331 cmdA.Transaction = transB;
1332 Assert.AreSame (transB, cmdA.Transaction, "#B1");
1335 cmdA.Transaction = transB;
1336 Assert.Fail ("#B1");
1337 } catch (InvalidOperationException ex) {
1338 // The SqlCommand is currently busy
1340 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
1341 Assert.IsNull (ex.InnerException, "#B3");
1342 Assert.IsNotNull (ex.Message, "#B4");
1344 Assert.AreSame (transA, cmdA.Transaction, "#B5");
1349 cmdA.Transaction = null;
1350 Assert.IsNull (cmdA.Transaction, "#C1");
1353 cmdA.Transaction = null;
1354 Assert.Fail ("#C1");
1355 } catch (InvalidOperationException ex) {
1356 // The SqlCommand is currently busy
1358 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2");
1359 Assert.IsNull (ex.InnerException, "#C3");
1360 Assert.IsNotNull (ex.Message, "#C4");
1362 Assert.AreSame (transA, cmdA.Transaction, "#C5");
1367 cmdA.Transaction = transA;
1368 Assert.AreSame (transA, cmdA.Transaction, "#D1");
1369 cmdA.Transaction = transB;
1370 Assert.AreSame (transB, cmdA.Transaction, "#D2");
1384 public void ExecuteNonQueryTempProcedureTest ()
1386 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
1388 ConnectionManager.Singleton.OpenConnection ();
1389 // create temp sp here, should normally be created in Setup of test
1390 // case, but cannot be done right now because of ug #68978
1391 DBHelper.ExecuteNonQuery (conn, CREATE_TMP_SP_TEMP_INSERT_PERSON);
1392 SqlCommand cmd = new SqlCommand();
1393 cmd.Connection = conn;
1394 cmd.CommandText = "#sp_temp_insert_employee";
1395 cmd.CommandType = CommandType.StoredProcedure;
1396 Object TestPar = "test";
1397 cmd.Parameters.Add("@fname", SqlDbType.VarChar);
1398 cmd.Parameters ["@fname"].Value = TestPar;
1399 Assert.AreEqual(1,cmd.ExecuteNonQuery());
1401 DBHelper.ExecuteNonQuery (conn, string.Format (
1402 CultureInfo.InvariantCulture,
1403 DROP_STORED_PROCEDURE, "#sp_temp_insert_employee"));
1404 DBHelper.ExecuteSimpleSP (conn, "sp_clean_person_table");
1405 ConnectionManager.Singleton.CloseConnection ();
1409 [Test] // bug #319598
1410 public void LongQueryTest ()
1412 SqlConnection conn = new SqlConnection (
1413 connectionString + ";Pooling=false");
1416 SqlCommand cmd = conn.CreateCommand ();
1417 String value = new String ('a', 10000);
1418 cmd.CommandText = String.Format ("Select '{0}'", value);
1419 cmd.ExecuteNonQuery ();
1423 [Test] // bug #319598
1424 public void LongStoredProcTest()
1426 SqlConnection conn = new SqlConnection (
1427 connectionString + ";Pooling=false");
1430 /*int size = conn.PacketSize;*/
1431 SqlCommand cmd = conn.CreateCommand ();
1432 // create a temp stored proc
1433 cmd.CommandText = "Create Procedure #sp_tmp_long_params ";
1434 cmd.CommandText += "@p1 nvarchar (4000), ";
1435 cmd.CommandText += "@p2 nvarchar (4000), ";
1436 cmd.CommandText += "@p3 nvarchar (4000), ";
1437 cmd.CommandText += "@p4 nvarchar (4000) out ";
1438 cmd.CommandText += "As ";
1439 cmd.CommandText += "Begin ";
1440 cmd.CommandText += "Set @p4 = N'Hello' ";
1441 cmd.CommandText += "Return 2 ";
1442 cmd.CommandText += "End";
1443 cmd.ExecuteNonQuery ();
1446 cmd.CommandType = CommandType.StoredProcedure;
1447 cmd.CommandText = "#sp_tmp_long_params";
1449 String value = new String ('a', 4000);
1450 SqlParameter p1 = new SqlParameter ("@p1",
1451 SqlDbType.NVarChar,4000);
1454 SqlParameter p2 = new SqlParameter ("@p2",
1455 SqlDbType.NVarChar,4000);
1458 SqlParameter p3 = new SqlParameter ("@p3",
1459 SqlDbType.NVarChar,4000);
1462 SqlParameter p4 = new SqlParameter ("@p4",
1463 SqlDbType.NVarChar,4000);
1464 p4.Direction = ParameterDirection.Output;
1466 // for now, name shud be @RETURN_VALUE
1467 // can be changed once RPC is implemented
1468 SqlParameter p5 = new SqlParameter ("@RETURN_VALUE", SqlDbType.Int);
1469 p5.Direction = ParameterDirection.ReturnValue;
1471 cmd.Parameters.Add (p1);
1472 cmd.Parameters.Add (p2);
1473 cmd.Parameters.Add (p3);
1474 cmd.Parameters.Add (p4);
1475 cmd.Parameters.Add (p5);
1477 cmd.ExecuteNonQuery ();
1478 Assert.AreEqual ("Hello", p4.Value, "#1");
1479 Assert.AreEqual (2, p5.Value, "#2");
1483 [Test] // bug #319694
1484 public void DateTimeParameterTest ()
1486 SqlConnection conn = new SqlConnection (connectionString);
1489 SqlCommand cmd = conn.CreateCommand ();
1490 cmd.CommandText = "select * from datetime_family where type_datetime=@p1";
1491 cmd.Parameters.Add ("@p1", SqlDbType.DateTime).Value= "10-10-2005";
1492 // shudnt cause and exception
1493 SqlDataReader rdr = cmd.ExecuteReader ();
1499 * Verifies whether an enum value is converted to a numeric value when
1500 * used as value for a numeric parameter (bug #66630)
1503 public void EnumParameterTest ()
1505 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
1507 ConnectionManager.Singleton.OpenConnection ();
1508 // create temp sp here, should normally be created in Setup of test
1509 // case, but cannot be done right now because of ug #68978
1510 DBHelper.ExecuteNonQuery (conn, "CREATE PROCEDURE #Bug66630 ("
1511 + "@Status smallint = 7"
1513 + "AS" + Environment.NewLine
1514 + "BEGIN" + Environment.NewLine
1515 + "SELECT CAST(5 AS int), @Status" + Environment.NewLine
1518 SqlCommand cmd = new SqlCommand("#Bug66630", conn);
1519 cmd.CommandType = CommandType.StoredProcedure;
1520 cmd.Parameters.Add("@Status", SqlDbType.Int).Value = Status.Error;
1522 using (SqlDataReader dr = cmd.ExecuteReader()) {
1523 // one record should be returned
1524 Assert.IsTrue(dr.Read(), "EnumParameterTest#1");
1525 // we should get two field in the result
1526 Assert.AreEqual(2, dr.FieldCount, "EnumParameterTest#2");
1528 Assert.AreEqual("int", dr.GetDataTypeName(0), "EnumParameterTest#3");
1529 Assert.AreEqual(5, dr.GetInt32(0), "EnumParameterTest#4");
1531 Assert.AreEqual("smallint", dr.GetDataTypeName(1), "EnumParameterTest#5");
1532 Assert.AreEqual((short) Status.Error, dr.GetInt16(1), "EnumParameterTest#6");
1533 // only one record should be returned
1534 Assert.IsFalse(dr.Read(), "EnumParameterTest#7");
1537 DBHelper.ExecuteNonQuery (conn, "if exists (select name from sysobjects " +
1538 " where name like '#temp_Bug66630' and type like 'P') " +
1539 " drop procedure #temp_Bug66630; ");
1540 ConnectionManager.Singleton.CloseConnection ();
1545 public void CloneTest ()
1547 conn = new SqlConnection (connectionString);
1550 SqlTransaction trans = conn.BeginTransaction ();
1552 cmd = new SqlCommand ();
1553 cmd.Connection = conn;
1554 cmd.Transaction = trans;
1556 SqlCommand clone = (((ICloneable) (cmd)).Clone ()) as SqlCommand;
1557 Assert.AreSame (conn, clone.Connection);
1558 Assert.AreSame (trans, clone.Transaction);
1562 public void StoredProc_NoParameterTest ()
1564 string query = "create procedure #tmp_sp_proc as begin";
1565 query += " select 'data' end";
1566 SqlConnection conn = new SqlConnection (connectionString);
1567 SqlCommand cmd = conn.CreateCommand ();
1568 cmd.CommandText = query;
1570 cmd.ExecuteNonQuery ();
1572 cmd.CommandType = CommandType.StoredProcedure;
1573 cmd.CommandText = "#tmp_sp_proc";
1574 using (SqlDataReader reader = cmd.ExecuteReader()) {
1576 Assert.AreEqual ("data", reader.GetString(0),"#1");
1578 Assert.Fail ("#2 Select shud return data");
1584 public void StoredProc_ParameterTest ()
1586 string create_query = CREATE_TMP_SP_PARAM_TEST;
1587 string drop_query = string.Format (CultureInfo.InvariantCulture,
1588 DROP_STORED_PROCEDURE, "#tmp_sp_param_test");
1590 SqlConnection conn = new SqlConnection (connectionString);
1593 SqlCommand cmd = conn.CreateCommand ();
1595 string error = string.Empty;
1596 while (label != -1) {
1600 // Test BigInt Param
1601 DBHelper.ExecuteNonQuery (conn,
1602 String.Format (create_query, "bigint"));
1603 rpc_helper_function (cmd, SqlDbType.BigInt, 0,
1604 Int64.MaxValue, Int64.MaxValue,
1606 rpc_helper_function (cmd, SqlDbType.BigInt, 0,
1607 Int64.MinValue, Int64.MinValue,
1609 rpc_helper_function (cmd, SqlDbType.BigInt, 0,
1610 DBNull.Value, DBNull.Value,
1614 // Test Binary Param
1615 DBHelper.ExecuteNonQuery (conn,
1616 String.Format (create_query, "binary(5)"));
1617 rpc_helper_function (cmd, SqlDbType.Binary, 5,
1618 new byte [] { 1, 2, 3, 4, 5 },
1619 new byte [] { 1, 2, 3, 4, 5 },
1620 new byte [] { 1, 2, 3, 4, 5 });
1622 rpc_helper_function (cmd, SqlDbType.Binary, 5,
1623 DBNull.Value, DBNull.Value,
1626 rpc_helper_function (cmd, SqlDbType.Binary, 2,
1628 new byte [] { 0, 0, 0, 0, 0 },
1629 new byte [] { 0, 0 });
1633 DBHelper.ExecuteNonQuery (conn,
1634 String.Format (create_query, "bit"));
1635 rpc_helper_function (cmd, SqlDbType.Bit, 0,
1637 rpc_helper_function (cmd, SqlDbType.Bit, 0,
1638 false, false, false);
1639 rpc_helper_function (cmd, SqlDbType.Bit, 0,
1640 DBNull.Value, DBNull.Value,
1645 DBHelper.ExecuteNonQuery (conn,
1646 String.Format (create_query, "char(10)"));
1647 rpc_helper_function (cmd, SqlDbType.Char, 10,
1648 "characters", "characters",
1651 rpc_helper_function (cmd, SqlDbType.Char, 3,
1652 "characters", "cha ",
1654 rpc_helper_function (cmd, SqlDbType.Char, 3,
1658 rpc_helper_function (cmd, SqlDbType.Char, 5,
1659 DBNull.Value, DBNull.Value,
1664 DBHelper.ExecuteNonQuery (conn,
1665 String.Format (create_query, "datetime"));
1666 rpc_helper_function (cmd, SqlDbType.DateTime, 0, "2079-06-06 23:59:00",
1667 new DateTime (2079, 6, 6, 23, 59, 0),
1668 new DateTime (2079, 6, 6, 23, 59, 0));
1669 rpc_helper_function (cmd, SqlDbType.DateTime, 0, "2009-04-12 10:39:45",
1670 new DateTime (2009, 4, 12, 10, 39, 45),
1671 new DateTime (2009, 4, 12, 10, 39, 45));
1672 rpc_helper_function (cmd, SqlDbType.DateTime, 0,
1673 DBNull.Value, DBNull.Value,
1677 // Test Decimal Param
1678 DBHelper.ExecuteNonQuery (conn,
1679 String.Format (create_query, "decimal(10,2)"));
1680 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1681 10.665, 10.67m, 11m);
1682 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1684 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1685 -5.657, -5.66m, -6m);
1686 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1687 DBNull.Value, DBNull.Value,
1692 DBHelper.ExecuteNonQuery (conn,
1693 String.Format (create_query, "float"));
1694 rpc_helper_function (cmd, SqlDbType.Float, 0,
1696 rpc_helper_function (cmd, SqlDbType.Float, 0,
1697 10.54, 10.54, 10.54);
1698 rpc_helper_function (cmd, SqlDbType.Float, 0,
1700 rpc_helper_function (cmd, SqlDbType.Float, 0,
1701 -5.34, -5.34, -5.34);
1702 rpc_helper_function (cmd, SqlDbType.Float, 0,
1703 DBNull.Value, DBNull.Value,
1709 DBHelper.ExecuteNonQuery (conn,
1710 String.Format(create_query, "image"));
1711 rpc_helper_function (cmd, SqlDbType.Image, 0, );
1712 rpc_helper_function (cmd, SqlDbType.Image, 0, );
1713 rpc_helper_function (cmd, SqlDbType.Image, 0, );
1717 // Test Integer Param
1718 DBHelper.ExecuteNonQuery (conn,
1719 String.Format (create_query, "int"));
1720 rpc_helper_function (cmd, SqlDbType.Int, 0,
1722 rpc_helper_function (cmd, SqlDbType.Int, 0,
1724 rpc_helper_function (cmd, SqlDbType.Int, 0,
1726 rpc_helper_function (cmd, SqlDbType.Int, 0,
1727 int.MaxValue, int.MaxValue,
1729 rpc_helper_function (cmd, SqlDbType.Int, 0,
1730 int.MinValue, int.MinValue,
1732 rpc_helper_function (cmd, SqlDbType.Int, 0,
1733 DBNull.Value, DBNull.Value,
1738 DBHelper.ExecuteNonQuery (conn,
1739 String.Format (create_query, "money"));
1740 rpc_helper_function (cmd, SqlDbType.Money, 0,
1742 rpc_helper_function (cmd, SqlDbType.Money, 0,
1743 10.54, 10.54m, 10.54m);
1744 rpc_helper_function (cmd, SqlDbType.Money, 0,
1746 rpc_helper_function (cmd, SqlDbType.Money, 0,
1747 -5.34, -5.34m, -5.34m);
1748 rpc_helper_function (cmd, SqlDbType.Money, 0,
1749 5.34, 5.34m, 5.34m);
1750 rpc_helper_function (cmd, SqlDbType.Money, 0,
1751 -10.1234m, -10.1234m, -10.1234m);
1752 rpc_helper_function (cmd, SqlDbType.Money, 0,
1753 10.1234m, 10.1234m, 10.1234m);
1754 rpc_helper_function (cmd, SqlDbType.Money, 0,
1755 -2000000000m, -2000000000m, -2000000000m);
1756 rpc_helper_function (cmd, SqlDbType.Money, 0,
1757 2000000000m, 2000000000m, 2000000000m);
1758 rpc_helper_function (cmd, SqlDbType.Money, 0,
1759 -200000000.2345m, -200000000.2345m, -200000000.2345m);
1760 rpc_helper_function (cmd, SqlDbType.Money, 0,
1761 200000000.2345m, 200000000.2345m, 200000000.2345m);
1762 rpc_helper_function (cmd, SqlDbType.Money, 0,
1763 DBNull.Value, DBNull.Value,
1767 rpc_helper_function (cmd, SqlDbType.Money, 0,
1768 -200000000.234561m, -200000000.2346m, -200000000.2346m);
1769 rpc_helper_function (cmd, SqlDbType.Money, 0,
1770 -200000000.234551m, -200000000.2346m, -200000000.2346m);
1771 rpc_helper_function (cmd, SqlDbType.Money, 0,
1772 -200000000.234541m, -200000000.2345m, -200000000.2345m);
1773 rpc_helper_function (cmd, SqlDbType.Money, 0,
1774 200000000.234561m, 200000000.2346m, 200000000.2346m);
1775 rpc_helper_function (cmd, SqlDbType.Money, 0,
1776 200000000.234551m, 200000000.2346m, 200000000.2346m);
1777 rpc_helper_function (cmd, SqlDbType.Money, 0,
1778 200000000.234541m, 200000000.2345m, 200000000.2345m);
1779 rpc_helper_function (cmd, SqlDbType.Money, 0,
1780 -200000000.234461m, -200000000.2345m, -200000000.2345m);
1781 rpc_helper_function (cmd, SqlDbType.Money, 0,
1782 -200000000.234451m, -200000000.2345m, -200000000.2345m);
1783 rpc_helper_function (cmd, SqlDbType.Money, 0,
1784 -200000000.234441m, -200000000.2344m, -200000000.2344m);
1785 rpc_helper_function (cmd, SqlDbType.Money, 0,
1786 200000000.234461m, 200000000.2345m, 200000000.2345m);
1787 rpc_helper_function (cmd, SqlDbType.Money, 0,
1788 200000000.234451m, 200000000.2345m, 200000000.2345m);
1789 rpc_helper_function (cmd, SqlDbType.Money, 0,
1790 200000000.234441m, 200000000.2344m, 200000000.2344m);
1791 // FIXME: we round toward even in SqlParameter.ConvertToFrameworkType
1793 rpc_helper_function (cmd, SqlDbType.Money, 0,
1794 -200000000.234550m, -200000000.2346m, -200000000.2346m);
1795 rpc_helper_function (cmd, SqlDbType.Money, 0,
1796 200000000.234550m, 200000000.2346m, 200000000.2346m);
1797 rpc_helper_function (cmd, SqlDbType.Money, 0,
1798 -200000000.234450m, -200000000.2345m, -200000000.2345m);
1799 rpc_helper_function (cmd, SqlDbType.Money, 0,
1800 200000000.234450m, 200000000.2345m, 200000000.2345m);
1805 DBHelper.ExecuteNonQuery (conn,
1806 String.Format (create_query, "nchar(10)"));
1807 rpc_helper_function (cmd, SqlDbType.NChar, 10,
1808 "characters", "characters",
1810 rpc_helper_function (cmd, SqlDbType.NChar, 3,
1811 "characters", "cha ",
1813 rpc_helper_function (cmd, SqlDbType.NChar, 3,
1817 rpc_helper_function (cmd, SqlDbType.NChar, 5,
1818 DBNull.Value, DBNull.Value,
1824 DBHelper.ExecuteNonQuery (conn,
1825 String.Format (create_query, "ntext"));
1827 rpc_helper_function (cmd, SqlDbType.NText, 0, "ntext");
1828 rpc_helper_function (cmd, SqlDbType.NText, 0, "");
1829 rpc_helper_function (cmd, SqlDbType.NText, 0, null);
1833 // Test NVarChar Param
1834 DBHelper.ExecuteNonQuery (conn,
1835 String.Format (create_query, "nvarchar(10)"));
1836 rpc_helper_function (cmd, SqlDbType.NVarChar, 10,
1837 "nvarchar", "nvarchar", "nvarchar");
1838 rpc_helper_function (cmd, SqlDbType.NVarChar, 3,
1839 "nvarchar", "nva", "nva");
1841 rpc_helper_function (cmd, SqlDbType.NVarChar, 10,
1842 string.Empty, string.Empty, string.Empty);
1843 rpc_helper_function (cmd, SqlDbType.NVarChar, 10,
1844 DBNull.Value, DBNull.Value, DBNull.Value);
1849 DBHelper.ExecuteNonQuery (conn,
1850 String.Format (create_query, "real"));
1851 rpc_helper_function (cmd, SqlDbType.Real, 0,
1853 rpc_helper_function (cmd, SqlDbType.Real, 0,
1855 rpc_helper_function (cmd, SqlDbType.Real, 0,
1857 rpc_helper_function (cmd, SqlDbType.Real, 0,
1858 3.54d, 3.54f, 3.54f);
1859 rpc_helper_function (cmd, SqlDbType.Real, 0,
1861 rpc_helper_function (cmd, SqlDbType.Real, 0,
1862 10.5f, 10.5f, 10.5f);
1863 rpc_helper_function (cmd, SqlDbType.Real, 0,
1865 rpc_helper_function (cmd, SqlDbType.Real, 0,
1866 4.54m, 4.54f, 4.54f);
1867 rpc_helper_function (cmd, SqlDbType.Real, 0,
1868 -4.54m, -4.54f, -4.54f);
1869 rpc_helper_function (cmd, SqlDbType.Real, 0,
1870 DBNull.Value, DBNull.Value, DBNull.Value);
1873 // Test SmallDateTime Param
1874 DBHelper.ExecuteNonQuery (conn,
1875 String.Format (create_query, "smalldatetime"));
1876 rpc_helper_function (cmd, SqlDbType.SmallDateTime, 0,
1877 "6/6/2079 11:59:00 PM",
1878 new DateTime (2079, 6, 6, 23, 59, 0),
1879 new DateTime (2079, 6, 6, 23, 59, 0));
1880 rpc_helper_function (cmd, SqlDbType.SmallDateTime, 0,
1881 DBNull.Value, DBNull.Value,
1885 // Test SmallInt Param
1886 DBHelper.ExecuteNonQuery (conn,
1887 String.Format (create_query, "smallint"));
1888 rpc_helper_function (cmd, SqlDbType.SmallInt, 0,
1889 10, (short) 10, (short) 10);
1890 rpc_helper_function (cmd, SqlDbType.SmallInt, 0,
1891 -10, (short) -10, (short) -10);
1892 rpc_helper_function (cmd, SqlDbType.SmallInt, 0,
1893 short.MaxValue, short.MaxValue,
1895 rpc_helper_function (cmd, SqlDbType.SmallInt, 0,
1896 short.MinValue, short.MinValue,
1898 rpc_helper_function (cmd, SqlDbType.SmallInt, 0,
1899 DBNull.Value, DBNull.Value,
1903 // Test SmallMoney Param
1904 DBHelper.ExecuteNonQuery (conn,
1905 String.Format (create_query, "smallmoney"));
1906 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1908 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1910 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1911 3.54d, 3.54m, 3.54m);
1912 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1914 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1915 10.5f, 10.5m, 10.5m);
1916 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1918 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1919 4.54m, 4.54m, 4.54m);
1920 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1921 -4.54m, -4.54m, -4.54m);
1922 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1923 -214748.3648m, -214748.3648m, -214748.3648m);
1924 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1925 214748.3647m, 214748.3647m, 214748.3647m);
1926 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1927 DBNull.Value, DBNull.Value, DBNull.Value);
1930 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1931 -4.543361m, -4.5434m, -4.5434m);
1932 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1933 -4.543351m, -4.5434m, -4.5434m);
1934 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1935 -4.543341m, -4.5433m, -4.5433m);
1936 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1937 4.543361m, 4.5434m, 4.5434m);
1938 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1939 4.543351m, 4.5434m, 4.5434m);
1940 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1941 4.543341m, 4.5433m, 4.5433m);
1942 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1943 -4.543261m, -4.5433m, -4.5433m);
1944 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1945 -4.543251m, -4.5433m, -4.5433m);
1946 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1947 -4.543241m, -4.5432m, -4.5432m);
1948 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1949 4.543261m, 4.5433m, 4.5433m);
1950 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1951 4.543251m, 4.5433m, 4.5433m);
1952 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1953 4.543241m, 4.5432m, 4.5432m);
1954 // FIXME: we round toward even in SqlParameter.ConvertToFrameworkType
1956 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1957 -4.543350m, -4.5434m, -4.5434m);
1958 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1959 4.543350m, 4.5434m, 4.5434m);
1960 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1961 -4.543250m, -4.5433m, -4.5433m);
1962 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
1963 4.543250m, 4.5433m, 4.5433m);
1968 DBHelper.ExecuteNonQuery (conn,
1969 String.Format (create_query, "text"));
1971 rpc_helper_function (cmd, SqlDbType.Text, 0, "text");
1972 rpc_helper_function (cmd, SqlDbType.Text, 0, "");
1973 rpc_helper_function (cmd, SqlDbType.Text, 0, null);
1977 // Test TimeStamp Param
1979 DBHelper.ExecuteNonQuery (conn,
1980 String.Format(create_query,"timestamp"));
1981 rpc_helper_function (cmd, SqlDbType.TimeStamp, 0, "");
1982 rpc_helper_function (cmd, SqlDbType.TimeStamp, 0, "");
1983 rpc_helper_function (cmd, SqlDbType.TimeStamp, 0, null);
1987 // Test TinyInt Param
1988 DBHelper.ExecuteNonQuery (conn,
1989 String.Format(create_query,"tinyint"));
1990 rpc_helper_function (cmd, SqlDbType.TinyInt, 0,
1991 10.0d, (byte) 10, (byte) 10);
1992 rpc_helper_function (cmd, SqlDbType.TinyInt, 0,
1993 0, (byte) 0, (byte) 0);
1994 rpc_helper_function (cmd, SqlDbType.TinyInt, 0,
1995 byte.MaxValue, byte.MaxValue, byte.MaxValue);
1996 rpc_helper_function (cmd, SqlDbType.TinyInt, 0,
1997 byte.MinValue, byte.MinValue, byte.MinValue);
2000 // Test UniqueIdentifier Param
2002 DBHelper.ExecuteNonQuery (conn,
2003 String.Format(create_query,"uniqueidentifier"));
2004 rpc_helper_function (cmd, SqlDbType.UniqueIdentifier, 0, "0f159bf395b1d04f8c2ef5c02c3add96");
2005 rpc_helper_function (cmd, SqlDbType.UniqueIdentifier, 0, null);
2009 // Test VarBinary Param
2011 DBHelper.ExecuteNonQuery (conn,
2012 String.Format(create_query,"varbinary (10)"));
2013 rpc_helper_function (cmd, SqlDbType.VarBinary, 0,);
2014 rpc_helper_function (cmd, SqlDbType.VarBinary, 0,);
2015 rpc_helper_function (cmd, SqlDbType.VarBinary, 0, null);
2019 // Test Varchar Param
2020 DBHelper.ExecuteNonQuery (conn,
2021 String.Format(create_query,"varchar(10)"));
2022 rpc_helper_function (cmd, SqlDbType.VarChar, 7,
2023 "VarChar", "VarChar", "VarChar");
2024 rpc_helper_function (cmd, SqlDbType.VarChar, 5,
2025 "Var", "Var", "Var");
2027 rpc_helper_function (cmd, SqlDbType.VarChar, 3,
2028 "Varchar", "Var", "Var");
2029 rpc_helper_function (cmd, SqlDbType.VarChar, 10,
2030 string.Empty, string.Empty, string.Empty);
2031 rpc_helper_function (cmd, SqlDbType.VarChar, 10,
2032 DBNull.Value, DBNull.Value,
2037 // Test Variant Param
2039 DBHelper.ExecuteNonQuery (conn,
2040 String.Format(create_query,"variant"));
2041 rpc_helper_function (cmd, SqlDbType.Variant, 0, );
2042 rpc_helper_function (cmd, SqlDbType.Variant, 0, );
2043 rpc_helper_function (cmd, SqlDbType.Variant, 0, null);
2050 } catch (AssertionException ex) {
2051 error += String.Format (" Case {0} INCORRECT VALUE : {1}\n", label, ex.ToString ());
2052 } catch (Exception ex) {
2053 error += String.Format (" Case {0} NOT WORKING : {1}\n", label, ex.ToString ());
2058 DBHelper.ExecuteNonQuery (conn, drop_query);
2061 if (error.Length != 0)
2062 Assert.Fail (error);
2065 private void rpc_helper_function (SqlCommand cmd, SqlDbType type, int size, object input, object expectedRead, object expectedOut)
2067 cmd.Parameters.Clear ();
2068 SqlParameter param1;
2069 SqlParameter param2;
2071 param1 = new SqlParameter ("@param1", type, size);
2072 param2 = new SqlParameter ("@param2", type, size);
2074 param1 = new SqlParameter ("@param1", type);
2075 param2 = new SqlParameter ("@param2", type);
2078 SqlParameter retval = new SqlParameter ("retval", SqlDbType.Int);
2079 param1.Value = input;
2080 param1.Direction = ParameterDirection.Input;
2081 param2.Direction = ParameterDirection.Output;
2082 retval.Direction = ParameterDirection.ReturnValue;
2083 cmd.Parameters.Add (param1);
2084 cmd.Parameters.Add (param2);
2085 cmd.Parameters.Add (retval);
2086 cmd.CommandText = "#tmp_sp_param_test";
2087 cmd.CommandType = CommandType.StoredProcedure;
2088 using (SqlDataReader reader = cmd.ExecuteReader ()) {
2089 Assert.IsTrue (reader.Read (), "#1");
2090 AreEqual (expectedRead, reader.GetValue (0), "#2");
2091 Assert.IsFalse (reader.Read (), "#3");
2093 AreEqual (expectedOut, param2.Value, "#4");
2094 AreEqual (5, retval.Value, "#5");
2098 public void OutputParamSizeTest1 ()
2100 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2101 ConnectionManager.Singleton.OpenConnection ();
2102 cmd = new SqlCommand ();
2103 cmd.Connection = conn;
2105 cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
2106 cmd.CommandType = CommandType.Text;
2107 cmd.ExecuteNonQuery ();
2109 cmd.CommandText = "#testsize";
2110 cmd.CommandType = CommandType.StoredProcedure;
2112 SqlParameter p1 = new SqlParameter ();
2113 p1.ParameterName = "@p1";
2114 p1.Direction = ParameterDirection.InputOutput;
2115 p1.DbType = DbType.String;
2116 p1.IsNullable = false;
2117 cmd.Parameters.Add (p1);
2120 cmd.ExecuteNonQuery ();
2122 } catch (InvalidOperationException ex) {
2123 // String[0]: the Size property has an invalid
2125 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
2126 Assert.IsNull (ex.InnerException, "#3");
2127 Assert.IsNotNull (ex.Message, "#4");
2132 public void OutputParamSizeTest2 ()
2134 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2135 ConnectionManager.Singleton.OpenConnection ();
2136 cmd = new SqlCommand ();
2137 cmd.Connection = conn;
2139 cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
2140 cmd.CommandType = CommandType.Text;
2141 cmd.ExecuteNonQuery ();
2143 cmd.CommandText = "#testsize";
2144 cmd.CommandType = CommandType.StoredProcedure;
2146 SqlParameter p1 = new SqlParameter ();
2147 p1.ParameterName = "@p1";
2148 p1.Direction = ParameterDirection.Output;
2149 p1.DbType = DbType.String;
2150 p1.IsNullable = false;
2151 cmd.Parameters.Add (p1);
2154 cmd.ExecuteNonQuery ();
2156 } catch (InvalidOperationException ex) {
2157 // String[0]: the Size property has an invalid
2159 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
2160 Assert.IsNull (ex.InnerException, "#3");
2161 Assert.IsNotNull (ex.Message, "#4");
2166 public void OutputParamSizeTest3 ()
2168 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2169 ConnectionManager.Singleton.OpenConnection ();
2170 cmd = new SqlCommand ();
2171 cmd.Connection = conn;
2173 cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
2174 cmd.CommandType = CommandType.Text;
2175 cmd.ExecuteNonQuery ();
2177 cmd.CommandText = "#testsize";
2178 cmd.CommandType = CommandType.StoredProcedure;
2180 SqlParameter p1 = new SqlParameter ();
2181 p1.ParameterName = "@p1";
2182 p1.Direction = ParameterDirection.InputOutput;
2183 p1.DbType = DbType.String;
2184 p1.IsNullable = true;
2185 cmd.Parameters.Add (p1);
2188 cmd.ExecuteNonQuery ();
2190 } catch (InvalidOperationException ex) {
2191 // String[0]: the Size property has an invalid
2193 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
2194 Assert.IsNull (ex.InnerException, "#3");
2195 Assert.IsNotNull (ex.Message, "#4");
2200 public void OutputParamSizeTest4 ()
2202 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2203 ConnectionManager.Singleton.OpenConnection ();
2204 cmd = new SqlCommand ();
2205 cmd.Connection = conn;
2207 cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
2208 cmd.CommandType = CommandType.Text;
2209 cmd.ExecuteNonQuery ();
2211 cmd.CommandText = "#testsize";
2212 cmd.CommandType = CommandType.StoredProcedure;
2214 SqlParameter p1 = new SqlParameter ();
2215 p1.ParameterName = "@p1";
2216 p1.Direction = ParameterDirection.Output;
2217 p1.DbType = DbType.String;
2218 p1.IsNullable = true;
2219 cmd.Parameters.Add (p1);
2222 cmd.ExecuteNonQuery ();
2224 } catch (InvalidOperationException ex) {
2225 // String[0]: the Size property has an invalid
2227 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
2228 Assert.IsNull (ex.InnerException, "#3");
2229 Assert.IsNotNull (ex.Message, "#4");
2234 public void SmallMoney_Overflow_Max ()
2236 conn = new SqlConnection (connectionString);
2239 DBHelper.ExecuteNonQuery (conn, string.Format (
2240 CultureInfo.InvariantCulture, CREATE_TMP_SP_TYPE_TEST,
2242 //decimal overflow = 214748.36471m;
2243 decimal overflow = 214748.3648m;
2245 cmd = conn.CreateCommand ();
2246 cmd.CommandText = "#tmp_sp_type_test";
2247 cmd.CommandType = CommandType.StoredProcedure;
2249 SqlParameter param = cmd.Parameters.Add ("@param",
2250 SqlDbType.SmallMoney);
2251 param.Value = overflow;
2254 cmd.ExecuteScalar ();
2256 } catch (OverflowException ex) {
2257 // SqlDbType.SmallMoney overflow. Value '214748.36471'
2258 // is out of range. Must be between -214,748.3648 and 214,748.3647
2259 Assert.AreEqual (typeof (OverflowException), ex.GetType (), "#2");
2260 Assert.IsNull (ex.InnerException, "#3");
2261 Assert.IsNotNull (ex.Message, "#4");
2263 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2264 CultureInfo.InvariantCulture, "'{0}'",
2265 overflow)) != -1, "#5:" + ex.Message);
2267 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2268 CultureInfo.CurrentCulture, "'{0}'",
2269 overflow)) != -1, "#5:" + ex.Message);
2271 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2272 CultureInfo.InvariantCulture, "{0:N4}",
2273 SMALLMONEY_MIN)) != -1, "#6:" + ex.Message);
2274 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2275 CultureInfo.InvariantCulture, "{0:N4}",
2276 SMALLMONEY_MAX)) != -1, "#7:" + ex.Message);
2278 DBHelper.ExecuteNonQuery (conn, string.Format (
2279 CultureInfo.InvariantCulture,
2280 DROP_STORED_PROCEDURE, "#tmp_sp_type_test"));
2285 public void SmallMoney_Overflow_Min ()
2287 conn = new SqlConnection (connectionString);
2290 DBHelper.ExecuteNonQuery (conn, string.Format (
2291 CultureInfo.InvariantCulture, CREATE_TMP_SP_TYPE_TEST,
2293 //decimal overflow = -214748.36481m;
2294 decimal overflow = -214748.3649m;
2296 cmd = conn.CreateCommand ();
2297 cmd.CommandText = "#tmp_sp_type_test";
2298 cmd.CommandType = CommandType.StoredProcedure;
2300 SqlParameter param = cmd.Parameters.Add ("@param",
2301 SqlDbType.SmallMoney);
2302 param.Value = overflow;
2305 cmd.ExecuteScalar ();
2307 } catch (OverflowException ex) {
2308 // SqlDbType.SmallMoney overflow. Value '-214748,36481'
2309 // is out of range. Must be between -214,748.3648 and 214,748.3647
2310 Assert.AreEqual (typeof (OverflowException), ex.GetType (), "#2");
2311 Assert.IsNull (ex.InnerException, "#3");
2312 Assert.IsNotNull (ex.Message, "#4");
2314 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2315 CultureInfo.InvariantCulture, "'{0}'",
2316 overflow)) != -1, "#5:" + ex.Message);
2318 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2319 CultureInfo.CurrentCulture, "'{0}'",
2320 overflow)) != -1, "#5:" + ex.Message);
2322 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2323 CultureInfo.InvariantCulture, "{0:N4}",
2324 SMALLMONEY_MIN)) != -1, "#6:" + ex.Message);
2325 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2326 CultureInfo.InvariantCulture, "{0:N4}",
2327 SMALLMONEY_MAX)) != -1, "#7:" + ex.Message);
2329 DBHelper.ExecuteNonQuery (conn, string.Format (
2330 CultureInfo.InvariantCulture,
2331 DROP_STORED_PROCEDURE, "#tmp_sp_type_test"));
2337 public void NotificationTest ()
2339 cmd = new SqlCommand ();
2340 SqlNotificationRequest notification = new SqlNotificationRequest("MyNotification","MyService",15);
2341 Assert.AreEqual (null, cmd.Notification, "#1 The default value for this property should be null");
2342 cmd.Notification = notification;
2343 Assert.AreEqual ("MyService", cmd.Notification.Options, "#2 The value should be MyService as the constructor is initiated with this value");
2344 Assert.AreEqual (15, cmd.Notification.Timeout, "#2 The value should be 15 as the constructor is initiated with this value");
2348 public void NotificationAutoEnlistTest ()
2350 cmd = new SqlCommand ();
2351 Assert.AreEqual (true, cmd.NotificationAutoEnlist, "#1 Default value of the property should be true");
2352 cmd.NotificationAutoEnlist = false;
2353 Assert.AreEqual (false, cmd.NotificationAutoEnlist, "#2 The value of the property should be false after setting it to false");
2357 public void BeginExecuteXmlReaderTest ()
2359 cmd = new SqlCommand ();
2360 string connectionString1 = null;
2361 connectionString1 = ConnectionManager.Singleton.ConnectionString + "Asynchronous Processing=true";
2363 SqlConnection conn1 = new SqlConnection (connectionString1);
2365 cmd.CommandText = "Select lname from employee where id<2 FOR XML AUTO, XMLDATA";
2366 cmd.Connection = conn1;
2368 IAsyncResult result = cmd.BeginExecuteXmlReader ();
2369 XmlReader reader = cmd.EndExecuteXmlReader (result);
2370 while (reader.Read ()) {
2371 if (reader.LocalName.ToString () == "employee")
2372 Assert.AreEqual ("kumar", reader["lname"], "#1 ");
2375 ConnectionManager.Singleton.CloseConnection ();
2380 public void BeginExecuteXmlReaderExceptionTest ()
2382 cmd = new SqlCommand ();
2384 SqlConnection conn = new SqlConnection (connectionString);
2386 cmd.CommandText = "Select lname from employee where id<2 FOR XML AUTO, XMLDATA";
2387 cmd.Connection = conn;
2390 /*IAsyncResult result = */cmd.BeginExecuteXmlReader ();
2391 } catch (InvalidOperationException) {
2392 Assert.AreEqual (ConnectionManager.Singleton.ConnectionString, connectionString, "#1 Connection string has changed");
2395 Assert.Fail ("Expected Exception InvalidOperationException not thrown");
2397 ConnectionManager.Singleton.CloseConnection ();
2403 public void SqlCommandDisposeTest ()
2405 IDataReader reader = null;
2407 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2408 ConnectionManager.Singleton.OpenConnection ();
2410 IDbCommand command = conn.CreateCommand ();
2412 string sql = "SELECT * FROM employee";
2413 command.CommandText = sql;
2414 reader = command.ExecuteReader();
2418 while (reader.Read());
2421 ConnectionManager.Singleton.CloseConnection ();
2425 private void bug326182_OutputParamMixupTestCommon (int paramOrder,
2433 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2434 ConnectionManager.Singleton.OpenConnection ();
2435 string create_proc = "CREATE procedure #sp_326182 ( " + Environment.NewLine +
2436 "@param0 int out," + Environment.NewLine +
2437 "@param1 int out," + Environment.NewLine +
2438 "@param2 int out," + Environment.NewLine +
2439 "@param3 int out" + Environment.NewLine +
2440 ")" + Environment.NewLine +
2441 "as" + Environment.NewLine +
2442 "set @param0 = 100" + Environment.NewLine +
2443 "set @param1 = 101" + Environment.NewLine +
2444 "set @param2 = 102" + Environment.NewLine +
2445 "set @param3 = 103" + Environment.NewLine +
2449 SqlParameter param0 = new SqlParameter ("@param0", SqlDbType.Int);
2450 SqlParameter param1 = new SqlParameter ("@param1", SqlDbType.Int);
2451 SqlParameter param2 = new SqlParameter ("@param2", SqlDbType.Int);
2452 SqlParameter param3 = new SqlParameter ("@param3", SqlDbType.Int);
2453 SqlParameter rval = new SqlParameter ("@RETURN_VALUE", SqlDbType.Int);
2455 cmd = new SqlCommand();
2456 cmd.CommandText = create_proc;
2457 cmd.CommandType = CommandType.Text;
2458 cmd.Connection = conn;
2459 cmd.CommandTimeout = 90;
2460 cmd.ExecuteNonQuery ();
2462 cmd.CommandText = "dbo.[#sp_326182]";
2463 cmd.CommandType = CommandType.StoredProcedure;
2465 param0.Direction = ParameterDirection.Output;
2466 param1.Direction = ParameterDirection.Output;
2467 param2.Direction = ParameterDirection.Output;
2468 param3.Direction = ParameterDirection.Output;
2469 rval.Direction = ParameterDirection.ReturnValue;
2471 switch (paramOrder) {
2472 case 1: cmd.Parameters.Add (param0);
2473 cmd.Parameters.Add (param1);
2474 cmd.Parameters.Add (rval);
2475 cmd.Parameters.Add (param2);
2476 cmd.Parameters.Add (param3);
2478 case 2: cmd.Parameters.Add (rval);
2479 cmd.Parameters.Add (param1);
2480 cmd.Parameters.Add (param0);
2481 cmd.Parameters.Add (param2);
2482 cmd.Parameters.Add (param3);
2484 default: cmd.Parameters.Add (param0);
2485 cmd.Parameters.Add (param1);
2486 cmd.Parameters.Add (param2);
2487 cmd.Parameters.Add (param3);
2488 cmd.Parameters.Add (rval);
2492 cmd.ExecuteNonQuery ();
2494 /* Copy the param values to variables, just in case if
2495 * tests fail, we don't want the created sp to exist */
2496 param3Val = (int)cmd.Parameters["@param3"].Value;
2497 param1Val = (int)cmd.Parameters["@param1"].Value;
2498 rvalVal = (int)cmd.Parameters["@RETURN_VALUE"].Value;
2499 param2Val = (int)cmd.Parameters["@param2"].Value;
2500 param0Val = (int)cmd.Parameters["@param0"].Value;
2502 /* Delete the created stored procedure */
2503 cmd = conn.CreateCommand ();
2504 cmd.CommandText = "drop procedure #sp_326182";
2505 cmd.ExecuteNonQuery ();
2511 ConnectionManager.Singleton.CloseConnection ();
2517 public void bug326182_OutputParamMixupTest_Normal ()
2519 int param0Val, param1Val, param2Val, param3Val, rvalVal;
2521 //param0Val = param1Val = param2Val = param3Val = rvalVal = 0;
2523 bug326182_OutputParamMixupTestCommon (0, out param0Val, out param1Val,
2524 out param2Val, out param3Val, out rvalVal);
2525 Assert.AreEqual (103, param3Val);
2526 Assert.AreEqual (101, param1Val);
2527 Assert.AreEqual (2, rvalVal);
2528 Assert.AreEqual (102, param2Val);
2529 Assert.AreEqual (100, param0Val);
2533 public void bug326182_OutputParamMixupTest_RValInBetween ()
2535 int param0Val, param1Val, param2Val, param3Val, rvalVal;
2537 bug326182_OutputParamMixupTestCommon (1, out param0Val, out param1Val,
2538 out param2Val, out param3Val, out rvalVal);
2539 Assert.AreEqual (103, param3Val);
2540 Assert.AreEqual (101, param1Val);
2541 Assert.AreEqual (2, rvalVal);
2542 Assert.AreEqual (102, param2Val);
2543 Assert.AreEqual (100, param0Val);
2547 public void bug326182_OutputParamMixupTest_RValFirst ()
2549 int param0Val, param1Val, param2Val, param3Val, rvalVal;
2551 bug326182_OutputParamMixupTestCommon (2, out param0Val, out param1Val,
2552 out param2Val, out param3Val, out rvalVal);
2553 Assert.AreEqual (103, param3Val);
2554 Assert.AreEqual (101, param1Val);
2555 Assert.AreEqual (2, rvalVal);
2556 Assert.AreEqual (102, param2Val);
2557 Assert.AreEqual (100, param0Val);
2560 // used as workaround for bugs in NUnit 2.2.0
2561 static void AreEqual (object x, object y, string msg)
2563 if (x == null && y == null)
2565 if ((x == null || y == null))
2566 throw new AssertionException (string.Format (CultureInfo.InvariantCulture,
2567 "Expected: {0}, but was: {1}. {2}",
2568 x == null ? "<null>" : x, y == null ? "<null>" : y, msg));
2570 bool isArrayX = x.GetType ().IsArray;
2571 bool isArrayY = y.GetType ().IsArray;
2573 if (isArrayX && isArrayY) {
2574 Array arrayX = (Array) x;
2575 Array arrayY = (Array) y;
2577 if (arrayX.Length != arrayY.Length)
2578 throw new AssertionException (string.Format (CultureInfo.InvariantCulture,
2579 "Length of arrays differs. Expected: {0}, but was: {1}. {2}",
2580 arrayX.Length, arrayY.Length, msg));
2582 for (int i = 0; i < arrayX.Length; i++) {
2583 object itemX = arrayX.GetValue (i);
2584 object itemY = arrayY.GetValue (i);
2585 if (!itemX.Equals (itemY))
2586 throw new AssertionException (string.Format (CultureInfo.InvariantCulture,
2587 "Arrays differ at position {0}. Expected: {1}, but was: {2}. {3}",
2588 i, itemX, itemY, msg));
2590 } else if (!x.Equals (y)) {
2591 throw new AssertionException (string.Format (CultureInfo.InvariantCulture,
2592 "Expected: {0} ({1}), but was: {2} ({3}). {4}",
2593 x, x.GetType (), y, y.GetType (), msg));
2603 private static readonly string CREATE_TMP_SP_PARAM_TEST = "create procedure #tmp_sp_param_test (@param1 {0}, @param2 {0} output) as begin select @param1 set @param2=@param1 return 5 end";
2604 private readonly string CREATE_TMP_SP_TEMP_INSERT_PERSON = ("create procedure #sp_temp_insert_employee ( " + Environment.NewLine +
2605 "@fname varchar (20)) " + Environment.NewLine +
2606 "as " + Environment.NewLine +
2607 "begin" + Environment.NewLine +
2608 "declare @id int;" + Environment.NewLine +
2609 "select @id = max (id) from employee;" + Environment.NewLine +
2610 "set @id = @id + 6000 + 1;" + Environment.NewLine +
2611 "insert into employee (id, fname, dob, doj) values (@id, @fname, '1980-02-11', getdate ());" + Environment.NewLine +
2612 "return @id;" + Environment.NewLine +
2614 private static readonly string CREATE_TMP_SP_TYPE_TEST =
2615 "CREATE PROCEDURE #tmp_sp_type_test " +
2618 ") AS SELECT @param";
2619 private static readonly string DROP_STORED_PROCEDURE =
2620 "DROP PROCEDURE {0}";