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;
57 static readonly decimal SMALLMONEY_MAX = 214748.3647m;
58 static readonly decimal SMALLMONEY_MIN = -214748.3648m;
63 engine = ConnectionManager.Singleton.Engine;
67 public void TearDown ()
80 [Test] // ctor (String, SqlConnection, SqlTransaction)
81 public void Constructor4 ()
83 string cmdText = "select @@version";
85 SqlTransaction trans = null;
86 SqlConnection connA = null;
87 SqlConnection connB = null;
89 // transaction from same connection
91 connA = new SqlConnection (connectionString);
94 trans = connA.BeginTransaction ();
95 cmd = new SqlCommand (cmdText, connA, trans);
97 Assert.AreEqual (cmdText, cmd.CommandText, "#A1");
98 Assert.AreEqual (30, cmd.CommandTimeout, "#A2");
99 Assert.AreEqual (CommandType.Text, cmd.CommandType, "#A3");
100 Assert.AreSame (connA, cmd.Connection, "#A4");
101 Assert.IsNull (cmd.Container, "#A5");
102 Assert.IsTrue (cmd.DesignTimeVisible, "#A6");
104 Assert.IsNull (cmd.Notification, "#A7");
105 Assert.IsTrue (cmd.NotificationAutoEnlist, "#A8");
107 Assert.IsNotNull (cmd.Parameters, "#A9");
108 Assert.AreEqual (0, cmd.Parameters.Count, "#A10");
109 Assert.IsNull (cmd.Site, "#A11");
110 Assert.AreSame (trans, cmd.Transaction, "#A12");
111 Assert.AreEqual (UpdateRowSource.Both, cmd.UpdatedRowSource, "#A13");
119 // transaction from other connection
121 connA = new SqlConnection (connectionString);
123 connB = new SqlConnection (connectionString);
126 trans = connB.BeginTransaction ();
127 cmd = new SqlCommand (cmdText, connA, trans);
129 Assert.AreEqual (cmdText, cmd.CommandText, "#B1");
130 Assert.AreEqual (30, cmd.CommandTimeout, "#B2");
131 Assert.AreEqual (CommandType.Text, cmd.CommandType, "#B3");
132 Assert.AreSame (connA, cmd.Connection, "#B4");
133 Assert.IsNull (cmd.Container, "#B5");
134 Assert.IsTrue (cmd.DesignTimeVisible, "#B6");
136 Assert.IsNull (cmd.Notification, "#B7");
137 Assert.IsTrue (cmd.NotificationAutoEnlist, "#B8");
139 Assert.IsNotNull (cmd.Parameters, "#B9");
140 Assert.AreEqual (0, cmd.Parameters.Count, "#B10");
141 Assert.IsNull (cmd.Site, "#B11");
142 Assert.AreSame (trans, cmd.Transaction, "#B12");
143 Assert.AreEqual (UpdateRowSource.Both, cmd.UpdatedRowSource, "#B13");
152 [Test] // bug #341743
153 public void Dispose_Connection_Disposed ()
155 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
156 ConnectionManager.Singleton.OpenConnection ();
158 cmd = conn.CreateCommand ();
159 cmd.CommandText = "SELECT 'a'";
160 cmd.ExecuteNonQuery ();
164 Assert.AreSame (conn, cmd.Connection, "#1");
166 Assert.AreSame (conn, cmd.Connection, "#2");
170 public void ExecuteScalar ()
172 conn = new SqlConnection (connectionString);
173 cmd = new SqlCommand ("", conn);
174 cmd.CommandText = "Select count(*) from numeric_family where id<=4";
176 // Check the Return value for a Correct Query
179 result = cmd.ExecuteScalar ();
180 Assert.AreEqual (4, (int) result, "#A1 Query Result returned is incorrect");
182 cmd.CommandText = "select id , type_bit from numeric_family order by id asc";
183 result = Convert.ToInt32 (cmd.ExecuteScalar ());
184 Assert.AreEqual (1, result,
185 "#A2 ExecuteScalar Should return (1,1) the result set");
187 cmd.CommandText = "select id from numeric_family where id=-1";
188 result = cmd.ExecuteScalar ();
189 Assert.IsNull (result, "#A3 Null should be returned if result set is empty");
191 // Check SqlException is thrown for Invalid Query
192 cmd.CommandText = "select count* from numeric_family";
194 result = cmd.ExecuteScalar ();
196 } catch (SqlException ex) {
197 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#B2");
198 Assert.AreEqual ((byte) 15, ex.Class, "#B3");
199 Assert.IsNull (ex.InnerException, "#B4");
200 Assert.IsNotNull (ex.Message, "#B5");
201 if (ClientVersion == 7) {
202 // Incorrect syntax near '*'
203 Assert.IsTrue (ex.Message.IndexOf ("'*'") != -1, "#B6: " + ex.Message);
204 Assert.AreEqual (170, ex.Number, "#B7");
206 // Incorrect syntax near the keyword 'from'
207 Assert.IsTrue (ex.Message.IndexOf ("'from'") != -1, "#B6: " + ex.Message);
208 Assert.AreEqual (156, ex.Number, "#B7");
210 Assert.AreEqual ((byte) 1, ex.State, "#B8");
213 // Parameterized stored procedure calls
216 string string_value = "output value changed";
217 string return_value = "first column of first rowset";
220 "create procedure #tmp_executescalar_outparams " +
221 " (@p1 int, @p2 int out, @p3 varchar(200) out) " +
223 "select '" + return_value + "' as 'col1', @p1 as 'col2' " +
224 "set @p2 = @p2 * 2 " +
225 "set @p3 = N'" + string_value + "' " +
226 "select 'second rowset' as 'col1', 2 as 'col2' " +
229 cmd.CommandType = CommandType.Text;
230 cmd.ExecuteNonQuery ();
232 cmd.CommandText = "#tmp_executescalar_outparams";
233 cmd.CommandType = CommandType.StoredProcedure;
235 SqlParameter p1 = new SqlParameter ();
236 p1.ParameterName = "@p1";
237 p1.Direction = ParameterDirection.Input;
238 p1.DbType = DbType.Int32;
239 p1.Value = int_value;
240 cmd.Parameters.Add (p1);
242 SqlParameter p2 = new SqlParameter ();
243 p2.ParameterName = "@p2";
244 p2.Direction = ParameterDirection.InputOutput;
245 p2.DbType = DbType.Int32;
246 p2.Value = int_value;
247 cmd.Parameters.Add (p2);
249 SqlParameter p3 = new SqlParameter ();
250 p3.ParameterName = "@p3";
251 p3.Direction = ParameterDirection.Output;
252 p3.DbType = DbType.String;
254 cmd.Parameters.Add (p3);
256 result = cmd.ExecuteScalar ();
257 Assert.AreEqual (return_value, result, "#C1 ExecuteScalar Should return 'first column of first rowset'");
258 Assert.AreEqual (int_value * 2, p2.Value, "#C2 ExecuteScalar should fill the parameter collection with the outputted values");
259 Assert.AreEqual (string_value, p3.Value, "#C3 ExecuteScalar should fill the parameter collection with the outputted values");
264 cmd.ExecuteScalar ();
265 Assert.Fail ("#D1 Query should throw System.InvalidOperationException due to size = 0 and value = null");
266 } catch (InvalidOperationException ex) {
267 // String[2]: the Size property has an invalid
269 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#D2");
270 Assert.IsNull (ex.InnerException, "#D3");
271 Assert.IsNotNull (ex.Message, "#D4");
278 public void ExecuteScalar_CommandText_Empty ()
280 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
281 ConnectionManager.Singleton.OpenConnection ();
283 cmd = conn.CreateCommand ();
286 cmd.ExecuteScalar ();
288 } catch (InvalidOperationException ex) {
289 // ExecuteScalar: CommandText property
290 // has not been initialized
291 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
292 Assert.IsNull (ex.InnerException, "#A3");
293 Assert.IsNotNull (ex.Message, "#A4");
295 Assert.IsTrue (ex.Message.StartsWith ("ExecuteScalar"), "#A5:" + ex.Message);
297 Assert.IsTrue (ex.Message.StartsWith ("ExecuteReader"), "#A5:" + ex.Message);
301 cmd.CommandText = string.Empty;
304 cmd.ExecuteScalar ();
306 } catch (InvalidOperationException ex) {
307 // ExecuteScalar: CommandText property
308 // has not been initialized
309 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
310 Assert.IsNull (ex.InnerException, "#B3");
311 Assert.IsNotNull (ex.Message, "#B4");
313 Assert.IsTrue (ex.Message.StartsWith ("ExecuteScalar"), "#B5:" + ex.Message);
315 Assert.IsTrue (ex.Message.StartsWith ("ExecuteReader"), "#B5:" + ex.Message);
319 cmd.CommandText = null;
322 cmd.ExecuteScalar ();
324 } catch (InvalidOperationException ex) {
325 // ExecuteScalar: CommandText property
326 // has not been initialized
327 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2");
328 Assert.IsNull (ex.InnerException, "#C3");
329 Assert.IsNotNull (ex.Message, "#C4");
331 Assert.IsTrue (ex.Message.StartsWith ("ExecuteScalar"), "#C5:" + ex.Message);
333 Assert.IsTrue (ex.Message.StartsWith ("ExecuteReader"), "#C5:" + ex.Message);
339 public void ExecuteScalar_Connection_PendingTransaction ()
341 conn = new SqlConnection (connectionString);
344 using (SqlTransaction trans = conn.BeginTransaction ()) {
345 cmd = new SqlCommand ("select @@version", conn);
348 cmd.ExecuteScalar ();
350 } catch (InvalidOperationException ex) {
351 // ExecuteScalar requires the command
352 // to have a transaction object when the
353 // connection assigned to the command is
354 // in a pending local transaction. The
355 // Transaction property of the command
356 // has not been initialized
357 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
358 Assert.IsNull (ex.InnerException, "#3");
359 Assert.IsNotNull (ex.Message, "#4");
361 Assert.IsTrue (ex.Message.IndexOf ("ExecuteScalar") != -1, "#5:" + ex.Message);
363 Assert.IsTrue (ex.Message.IndexOf ("Execute") != -1, "#5:" + ex.Message);
370 public void ExecuteScalar_Query_Invalid ()
372 conn = new SqlConnection (connectionString);
375 cmd = new SqlCommand ("InvalidQuery", conn);
377 cmd.ExecuteScalar ();
379 } catch (SqlException ex) {
380 // Could not find stored procedure 'InvalidQuery'
381 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#2");
382 Assert.AreEqual ((byte) 16, ex.Class, "#3");
383 Assert.IsNull (ex.InnerException, "#4");
384 Assert.IsNotNull (ex.Message, "#5");
385 Assert.IsTrue (ex.Message.IndexOf ("'InvalidQuery'") != -1, "#6:" + ex.Message);
386 Assert.AreEqual (2812, ex.Number, "#7");
387 Assert.AreEqual ((byte) 62, ex.State, "#8");
392 public void ExecuteScalar_Transaction_NotAssociated ()
394 SqlTransaction trans = null;
395 SqlConnection connA = null;
396 SqlConnection connB = null;
399 connA = new SqlConnection (connectionString);
402 connB = new SqlConnection (connectionString);
405 trans = connA.BeginTransaction ();
407 cmd = new SqlCommand ("select @@version", connB, trans);
410 cmd.ExecuteScalar ();
412 } catch (InvalidOperationException ex) {
413 // The transaction object is not associated
414 // with the connection object
415 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
416 Assert.IsNull (ex.InnerException, "#A3");
417 Assert.IsNotNull (ex.Message, "#A4");
422 cmd = new SqlCommand ("select @@version", connB);
423 cmd.Transaction = trans;
426 cmd.ExecuteScalar ();
428 } catch (InvalidOperationException ex) {
429 // The transaction object is not associated
430 // with the connection object
431 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
432 Assert.IsNull (ex.InnerException, "#B3");
433 Assert.IsNotNull (ex.Message, "#B4");
448 public void ExecuteScalar_Transaction_Only ()
450 SqlTransaction trans = null;
452 conn = new SqlConnection (connectionString);
454 trans = conn.BeginTransaction ();
456 cmd = new SqlCommand ("select @@version");
457 cmd.Transaction = trans;
460 cmd.ExecuteScalar ();
462 } catch (InvalidOperationException ex) {
463 // ExecuteScalar: Connection property has not
465 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
466 Assert.IsNull (ex.InnerException, "#3");
467 Assert.IsNotNull (ex.Message, "#4");
469 Assert.IsTrue (ex.Message.StartsWith ("ExecuteScalar:"), "#5");
471 Assert.IsTrue (ex.Message.StartsWith ("ExecuteReader:"), "#5");
479 public void ExecuteNonQuery ()
481 conn = new SqlConnection (connectionString);
484 SqlTransaction trans = conn.BeginTransaction ();
486 cmd = conn.CreateCommand ();
487 cmd.Transaction = trans;
492 cmd.CommandText = "Select id from numeric_family where id=1";
493 result = cmd.ExecuteNonQuery ();
494 Assert.AreEqual (-1, result, "#A1");
496 cmd.CommandText = "Insert into numeric_family (id,type_int) values (100,200)";
497 result = cmd.ExecuteNonQuery ();
498 Assert.AreEqual (1, result, "#A2 One row shud be inserted");
500 cmd.CommandText = "Update numeric_family set type_int=300 where id=100";
501 result = cmd.ExecuteNonQuery ();
502 Assert.AreEqual (1, result, "#A3 One row shud be updated");
504 // Test Batch Commands
505 cmd.CommandText = "Select id from numeric_family where id=1;";
506 cmd.CommandText += "update numeric_family set type_int=10 where id=1000";
507 cmd.CommandText += "update numeric_family set type_int=10 where id=100";
508 result = cmd.ExecuteNonQuery ();
509 Assert.AreEqual (1, result, "#A4 One row shud be updated");
511 cmd.CommandText = "Delete from numeric_family where id=100";
512 result = cmd.ExecuteNonQuery ();
513 Assert.AreEqual (1, result, "#A5 One row shud be deleted");
518 // Parameterized stored procedure calls
521 string string_value = "output value changed";
524 "create procedure #tmp_executescalar_outparams " +
525 " (@p1 int, @p2 int out, @p3 varchar(200) out) " +
527 "select 'test' as 'col1', @p1 as 'col2' " +
528 "set @p2 = @p2 * 2 " +
529 "set @p3 = N'" + string_value + "' " +
530 "select 'second rowset' as 'col1', 2 as 'col2' " +
533 cmd.CommandType = CommandType.Text;
534 cmd.ExecuteNonQuery ();
536 cmd.CommandText = "#tmp_executescalar_outparams";
537 cmd.CommandType = CommandType.StoredProcedure;
539 SqlParameter p1 = new SqlParameter ();
540 p1.ParameterName = "@p1";
541 p1.Direction = ParameterDirection.Input;
542 p1.DbType = DbType.Int32;
543 p1.Value = int_value;
544 cmd.Parameters.Add (p1);
546 SqlParameter p2 = new SqlParameter ("@p2", int_value);
547 p2.Direction = ParameterDirection.InputOutput;
548 cmd.Parameters.Add (p2);
550 SqlParameter p3 = new SqlParameter ();
551 p3.ParameterName = "@p3";
552 p3.Direction = ParameterDirection.Output;
553 p3.DbType = DbType.String;
555 cmd.Parameters.Add (p3);
557 cmd.ExecuteNonQuery ();
558 Assert.AreEqual (int_value * 2, p2.Value, "#B1");
559 Assert.AreEqual (string_value, p3.Value, "#B2");
563 public void ExecuteNonQuery_Connection_PendingTransaction ()
565 conn = new SqlConnection (connectionString);
568 using (SqlTransaction trans = conn.BeginTransaction ()) {
569 cmd = new SqlCommand ("select @@version", conn);
572 cmd.ExecuteNonQuery ();
574 } catch (InvalidOperationException ex) {
575 // ExecuteNonQuery requires the command
576 // to have a transaction object when the
577 // connection assigned to the command is
578 // in a pending local transaction. The
579 // Transaction property of the command
580 // has not been initialized
581 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
582 Assert.IsNull (ex.InnerException, "#3");
583 Assert.IsNotNull (ex.Message, "#4");
585 Assert.IsTrue (ex.Message.IndexOf ("ExecuteNonQuery") != -1, "#5:" + ex.Message);
587 Assert.IsTrue (ex.Message.IndexOf ("Execute") != -1, "#5:" + ex.Message);
594 public void ExecuteNonQuery_Query_Invalid ()
596 conn = new SqlConnection (connectionString);
598 cmd = new SqlCommand ("select id1 from numeric_family", conn);
601 cmd.ExecuteNonQuery ();
603 } catch (SqlException ex) {
604 // Invalid column name 'id1'
605 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#A2");
606 Assert.AreEqual ((byte) 16, ex.Class, "#A3");
607 Assert.IsNull (ex.InnerException, "#A4");
608 Assert.IsNotNull (ex.Message, "#A5");
609 Assert.IsTrue (ex.Message.IndexOf ("'id1'") != -1, "#A6:" + ex.Message);
610 Assert.AreEqual (207, ex.Number, "#A7");
611 if (ClientVersion == 7)
612 Assert.AreEqual ((byte) 3, ex.State, "#A8");
614 Assert.AreEqual ((byte) 1, ex.State, "#A8");
617 // ensure connection is not closed after error
621 cmd.CommandText = "INSERT INTO numeric_family (id, type_int) VALUES (6100, 200)";
622 result = cmd.ExecuteNonQuery ();
623 Assert.AreEqual (1, result, "#B1");
625 cmd.CommandText = "DELETE FROM numeric_family WHERE id = 6100";
626 result = cmd.ExecuteNonQuery ();
627 Assert.AreEqual (1, result, "#B1");
631 public void ExecuteNonQuery_Transaction_NotAssociated ()
633 SqlTransaction trans = null;
634 SqlConnection connA = null;
635 SqlConnection connB = null;
638 connA = new SqlConnection (connectionString);
641 connB = new SqlConnection (connectionString);
644 trans = connA.BeginTransaction ();
646 cmd = new SqlCommand ("select @@version", connB, trans);
649 cmd.ExecuteNonQuery ();
651 } catch (InvalidOperationException ex) {
652 // The transaction object is not associated
653 // with the connection object
654 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
655 Assert.IsNull (ex.InnerException, "#A3");
656 Assert.IsNotNull (ex.Message, "#A4");
661 cmd = new SqlCommand ("select @@version", connB);
662 cmd.Transaction = trans;
665 cmd.ExecuteNonQuery ();
667 } catch (InvalidOperationException ex) {
668 // The transaction object is not associated
669 // with the connection object
670 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
671 Assert.IsNull (ex.InnerException, "#B3");
672 Assert.IsNotNull (ex.Message, "#B4");
687 public void ExecuteNonQuery_Transaction_Only ()
689 conn = new SqlConnection (connectionString);
692 SqlTransaction trans = conn.BeginTransaction ();
694 cmd = new SqlCommand ("select @@version");
695 cmd.Transaction = trans;
698 cmd.ExecuteNonQuery ();
700 } catch (InvalidOperationException ex) {
701 // ExecuteNonQuery: Connection property has not
703 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
704 Assert.IsNull (ex.InnerException, "#3");
705 Assert.IsNotNull (ex.Message, "#4");
706 Assert.IsTrue (ex.Message.StartsWith ("ExecuteNonQuery:"), "#5");
712 [Test] // bug #412569
713 public void ExecuteReader ()
715 // Test for command behaviors
716 DataTable schemaTable = null;
717 SqlDataReader reader = null;
719 conn = new SqlConnection (connectionString);
721 cmd = new SqlCommand ("", conn);
722 cmd.CommandText = "Select id from numeric_family where id <=4 order by id asc;";
723 cmd.CommandText += "Select type_bit from numeric_family where id <=4 order by id asc";
725 // Test for default command behavior
726 reader = cmd.ExecuteReader ();
730 while (reader.Read ())
732 Assert.AreEqual (4, rows, "#1 Multiple rows shud be returned");
735 } while (reader.NextResult ());
736 Assert.AreEqual (2, results, "#2 Multiple result sets shud be returned");
739 // Test if closing reader, closes the connection
740 reader = cmd.ExecuteReader (CommandBehavior.CloseConnection);
742 Assert.AreEqual (ConnectionState.Closed, conn.State,
743 "#3 Command Behavior is not followed");
746 // Test if row info and primary Key info is returned
747 reader = cmd.ExecuteReader (CommandBehavior.KeyInfo);
748 schemaTable = reader.GetSchemaTable ();
749 Assert.IsTrue (reader.HasRows, "#4 Data Rows shud also be returned");
750 Assert.IsTrue ((bool) schemaTable.Rows [0] ["IsKey"],
751 "#5 Primary Key info shud be returned");
754 // Test only column information is returned
755 reader = cmd.ExecuteReader (CommandBehavior.SchemaOnly);
756 schemaTable = reader.GetSchemaTable ();
757 Assert.IsFalse (reader.HasRows, "#6 row data shud not be returned");
758 Assert.AreEqual (DBNull.Value, schemaTable.Rows [0] ["IsKey"],
759 "#7 Primary Key info shud not be returned");
760 Assert.AreEqual ("id", schemaTable.Rows [0] ["ColumnName"],
761 "#8 Schema Data is Incorrect");
764 // Test only one result set (first) is returned
765 reader = cmd.ExecuteReader (CommandBehavior.SingleResult);
766 schemaTable = reader.GetSchemaTable ();
767 Assert.IsFalse (reader.NextResult (),
768 "#9 Only one result set shud be returned");
769 Assert.AreEqual ("id", schemaTable.Rows [0] ["ColumnName"],
770 "#10 The result set returned shud be the first result set");
773 // Test only one row is returned for all result sets
774 // msdotnet doesnt work correctly.. returns only one result set
775 reader = cmd.ExecuteReader (CommandBehavior.SingleRow);
779 while (reader.Read ())
781 Assert.AreEqual (1, rows, "#11 Only one row shud be returned");
784 } while (reader.NextResult ());
787 // https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=357085
788 Assert.AreEqual (1, results, "#12 Multiple result sets shud be returned");
793 public void ExecuteReader_Connection_PendingTransaction ()
795 conn = new SqlConnection (connectionString);
798 using (SqlTransaction trans = conn.BeginTransaction ()) {
799 cmd = new SqlCommand ("select @@version", conn);
802 cmd.ExecuteReader ();
804 } catch (InvalidOperationException ex) {
805 // ExecuteReader requires the command
806 // to have a transaction object when the
807 // connection assigned to the command is
808 // in a pending local transaction. The
809 // Transaction property of the command
810 // has not been initialized
811 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
812 Assert.IsNull (ex.InnerException, "#3");
813 Assert.IsNotNull (ex.Message, "#4");
815 Assert.IsTrue (ex.Message.IndexOf ("ExecuteReader") != -1, "#5:" + ex.Message);
817 Assert.IsTrue (ex.Message.IndexOf ("Execute") != -1, "#5:" + ex.Message);
824 public void ExecuteReader_Query_Invalid ()
826 conn = new SqlConnection (connectionString);
829 cmd = new SqlCommand ("InvalidQuery", conn);
831 cmd.ExecuteReader ();
833 } catch (SqlException ex) {
834 // Could not find stored procedure 'InvalidQuery'
835 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#A2");
836 Assert.AreEqual ((byte) 16, ex.Class, "#A3");
837 Assert.IsNull (ex.InnerException, "#A4");
838 Assert.IsNotNull (ex.Message, "#A5");
839 Assert.IsTrue (ex.Message.IndexOf ("'InvalidQuery'") != -1, "#A6:" + ex.Message);
840 Assert.AreEqual (2812, ex.Number, "#A7");
841 Assert.AreEqual ((byte) 62, ex.State, "#A8");
843 // connection is not closed
844 Assert.AreEqual (ConnectionState.Open, conn.State, "#A9");
848 cmd.ExecuteReader (CommandBehavior.CloseConnection);
850 } catch (SqlException ex) {
851 // Could not find stored procedure 'InvalidQuery'
852 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#B2");
853 Assert.AreEqual ((byte) 16, ex.Class, "#B3");
854 Assert.IsNull (ex.InnerException, "#B4");
855 Assert.IsNotNull (ex.Message, "#B5");
856 Assert.IsTrue (ex.Message.IndexOf ("'InvalidQuery'") != -1, "#B6:" + ex.Message);
857 Assert.AreEqual (2812, ex.Number, "#B7");
858 Assert.AreEqual ((byte) 62, ex.State, "#B8");
860 // connection is closed
861 Assert.AreEqual (ConnectionState.Closed, conn.State, "#B9");
866 public void ExecuteReader_Transaction_NotAssociated ()
868 SqlTransaction trans = null;
869 SqlConnection connA = null;
870 SqlConnection connB = null;
873 connA = new SqlConnection (connectionString);
876 connB = new SqlConnection (connectionString);
879 trans = connA.BeginTransaction ();
881 cmd = new SqlCommand ("select @@version", connB, trans);
884 cmd.ExecuteReader ();
886 } catch (InvalidOperationException ex) {
887 // The transaction object is not associated
888 // with the connection object
889 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
890 Assert.IsNull (ex.InnerException, "#A3");
891 Assert.IsNotNull (ex.Message, "#A4");
896 cmd = new SqlCommand ("select @@version", connB);
897 cmd.Transaction = trans;
900 cmd.ExecuteReader ();
902 } catch (InvalidOperationException ex) {
903 // The transaction object is not associated
904 // with the connection object
905 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
906 Assert.IsNull (ex.InnerException, "#B3");
907 Assert.IsNotNull (ex.Message, "#B4");
922 public void ExecuteReader_Transaction_Only ()
924 SqlTransaction trans = null;
926 conn = new SqlConnection (connectionString);
928 trans = conn.BeginTransaction ();
930 cmd = new SqlCommand ("select @@version");
931 cmd.Transaction = trans;
934 cmd.ExecuteReader ();
936 } catch (InvalidOperationException ex) {
937 // ExecuteReader: Connection property has not
939 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
940 Assert.IsNull (ex.InnerException, "#3");
941 Assert.IsNotNull (ex.Message, "#4");
942 Assert.IsTrue (ex.Message.StartsWith ("ExecuteReader:"), "#5");
950 public void PrepareTest_CheckValidStatement ()
952 cmd = new SqlCommand ();
953 conn = new SqlConnection (connectionString);
956 cmd.CommandText = "Select id from numeric_family where id=@ID";
957 cmd.Connection = conn;
959 // Test if Parameters are correctly populated
960 cmd.Parameters.Clear ();
961 cmd.Parameters.Add ("@ID", SqlDbType.TinyInt);
962 cmd.Parameters ["@ID"].Value = 2;
964 Assert.AreEqual (2, cmd.ExecuteScalar (), "#3 Prepared Stmt not working");
966 cmd.Parameters [0].Value = 3;
967 Assert.AreEqual (3, cmd.ExecuteScalar (), "#4 Prep Stmt not working");
972 public void Prepare ()
974 cmd = new SqlCommand ();
975 conn = new SqlConnection (connectionString);
978 cmd.CommandText = "Select id from numeric_family where id=@ID";
979 cmd.Connection = conn;
981 // Test InvalidOperation Exception is thrown if Parameter Type
982 // is not explicitly set
984 cmd.Parameters.AddWithValue ("@ID", 2);
986 cmd.Parameters.Add ("@ID", 2);
991 } catch (InvalidOperationException ex) {
992 // SqlCommand.Prepare method requires all parameters
993 // to have an explicitly set type
994 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
995 Assert.IsNull (ex.InnerException, "#A3");
996 Assert.IsNotNull (ex.Message, "#A4");
999 // Test Exception is thrown for variable size data if precision/scale
1001 cmd.CommandText = "select type_varchar from string_family where type_varchar=@p1";
1002 cmd.Parameters.Clear ();
1003 cmd.Parameters.Add ("@p1", SqlDbType.VarChar);
1004 cmd.Parameters ["@p1"].Value = "afasasadadada";
1007 Assert.Fail ("#B1");
1008 } catch (InvalidOperationException ex) {
1009 // SqlCommand.Prepare method requires all variable
1010 // length parameters to have an explicitly set
1012 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
1013 Assert.IsNull (ex.InnerException, "#B3");
1014 Assert.IsNotNull (ex.Message, "#B4");
1017 // Test Exception is not thrown for GUID - #569543
1019 cmd.CommandText = "select type_guid from string_family where type_guid=@p1";
1020 cmd.Parameters.Clear ();
1021 cmd.Parameters.Add ("@p1", DbType.Guid);
1022 cmd.Parameters ["@p1"].Value = new Guid ("1C47DD1D-891B-47E8-AAC8-F36608B31BC5");;
1024 } catch (Exception ex) {
1025 Assert.Fail ("#B2"+ex.Message);
1028 // Test Exception is not thrown for Stored Procs
1029 cmd.CommandType = CommandType.StoredProcedure;
1030 cmd.CommandText = "ABFSDSFSF";
1033 cmd.CommandType = CommandType.Text;
1038 public void Prepare_Connection_PendingTransaction ()
1040 conn = new SqlConnection (connectionString);
1043 using (SqlTransaction trans = conn.BeginTransaction ()) {
1044 // Text, without parameters
1045 cmd = new SqlCommand ("select * from whatever where name=?", conn);
1048 // Text, with parameters
1049 cmd = new SqlCommand ("select * from whatever where name=?", conn);
1050 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1054 } catch (InvalidOperationException ex) {
1055 // Prepare requires the command to have a
1056 // transaction object when the connection
1057 // assigned to the command is in a pending
1058 // local transaction. The Transaction
1059 // property of the command has not been
1061 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
1062 Assert.IsNull (ex.InnerException, "#3");
1063 Assert.IsNotNull (ex.Message, "#4");
1065 Assert.IsTrue (ex.Message.IndexOf ("Prepare") != -1, "#5:" + ex.Message);
1067 Assert.IsTrue (ex.Message.IndexOf ("Execute") != -1, "#5:" + ex.Message);
1071 // Text, parameters cleared
1072 cmd = new SqlCommand ("select * from whatever where name=?", conn);
1073 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1074 cmd.Parameters.Clear ();
1077 // StoredProcedure, without parameters
1078 cmd = new SqlCommand ("FindCustomer", conn);
1079 cmd.CommandType = CommandType.StoredProcedure;
1082 // StoredProcedure, with parameters
1083 cmd = new SqlCommand ("FindCustomer", conn);
1084 cmd.CommandType = CommandType.StoredProcedure;
1085 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1091 public void Prepare_Transaction_NotAssociated ()
1093 SqlTransaction trans = null;
1094 SqlConnection connA = null;
1095 SqlConnection connB = null;
1098 connA = new SqlConnection (connectionString);
1101 connB = new SqlConnection (connectionString);
1104 trans = connA.BeginTransaction ();
1106 // Text, without parameters
1107 cmd = new SqlCommand ("select @@version", connB, trans);
1108 cmd.Transaction = trans;
1111 // Text, with parameters
1112 cmd = new SqlCommand ("select @@version", connB, trans);
1113 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1117 } catch (InvalidOperationException ex) {
1118 // The transaction is either not associated
1119 // with the current connection or has been
1121 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
1122 Assert.IsNull (ex.InnerException, "#3");
1123 Assert.IsNotNull (ex.Message, "#4");
1126 // Text, parameters cleared
1127 cmd = new SqlCommand ("select @@version", connB, trans);
1128 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1129 cmd.Parameters.Clear ();
1132 // StoredProcedure, without parameters
1133 cmd = new SqlCommand ("FindCustomer", connB, trans);
1134 cmd.CommandType = CommandType.StoredProcedure;
1137 // StoredProcedure, with parameters
1138 cmd = new SqlCommand ("FindCustomer", connB, trans);
1139 cmd.CommandType = CommandType.StoredProcedure;
1140 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1153 public void Prepare_Transaction_Only ()
1155 SqlTransaction trans = null;
1157 conn = new SqlConnection (connectionString);
1159 trans = conn.BeginTransaction ();
1161 // Text, without parameters
1162 cmd = new SqlCommand ("select count(*) from whatever");
1163 cmd.Transaction = trans;
1167 Assert.Fail ("#A1");
1168 } catch (NullReferenceException) {
1174 // Text, with parameters
1175 cmd = new SqlCommand ("select count(*) from whatever");
1176 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1177 cmd.Transaction = trans;
1180 Assert.Fail ("#B1");
1182 } catch (NullReferenceException) {
1185 } catch (InvalidOperationException ex) {
1186 // Prepare: Connection property has not been
1188 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
1189 Assert.IsNull (ex.InnerException, "#B3");
1190 Assert.IsNotNull (ex.Message, "#B4");
1191 Assert.IsTrue (ex.Message.StartsWith ("Prepare:"), "#B5");
1195 // Text, parameters cleared
1196 cmd = new SqlCommand ("select count(*) from whatever");
1197 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1198 cmd.Parameters.Clear ();
1199 cmd.Transaction = trans;
1203 Assert.Fail ("#C1");
1204 } catch (NullReferenceException) {
1210 // StoredProcedure, without parameters
1211 cmd = new SqlCommand ("FindCustomer");
1212 cmd.CommandType = CommandType.StoredProcedure;
1213 cmd.Transaction = trans;
1217 Assert.Fail ("#D1");
1218 } catch (NullReferenceException) {
1224 // StoredProcedure, with parameters
1225 cmd = new SqlCommand ("FindCustomer");
1226 cmd.CommandType = CommandType.StoredProcedure;
1227 cmd.Parameters.Add ("@TestPar1", SqlDbType.Int);
1228 cmd.Transaction = trans;
1232 Assert.Fail ("#E1");
1233 } catch (NullReferenceException) {
1240 [Test] // bug #412576
1241 public void Connection ()
1243 SqlConnection connA = null;
1244 SqlConnection connB = null;
1245 SqlTransaction trans = null;
1248 connA = new SqlConnection (connectionString);
1251 connB = new SqlConnection (connectionString);
1254 cmd = connA.CreateCommand ();
1255 cmd.Connection = connB;
1256 Assert.AreSame (connB, cmd.Connection, "#A1");
1257 Assert.IsNull (cmd.Transaction, "#A2");
1260 trans = connA.BeginTransaction ();
1261 cmd = new SqlCommand ("select @@version", connA, trans);
1262 cmd.Connection = connB;
1263 Assert.AreSame (connB, cmd.Connection, "#B1");
1264 Assert.AreSame (trans, cmd.Transaction, "#B2");
1267 trans = connA.BeginTransaction ();
1268 cmd = new SqlCommand ("select @@version", connA, trans);
1270 Assert.AreSame (connA, cmd.Connection, "#C1");
1271 Assert.IsNull (cmd.Transaction, "#C2");
1272 cmd.Connection = connB;
1273 Assert.AreSame (connB, cmd.Connection, "#C3");
1274 Assert.IsNull (cmd.Transaction, "#C4");
1276 trans = connA.BeginTransaction ();
1277 cmd = new SqlCommand ("select @@version", connA, trans);
1278 cmd.Connection = null;
1279 Assert.IsNull (cmd.Connection, "#D1");
1280 Assert.AreSame (trans, cmd.Transaction, "#D2");
1292 public void Connection_Reader_Open ()
1294 SqlConnection connA = null;
1295 SqlConnection connB = null;
1296 SqlTransaction trans = null;
1299 connA = new SqlConnection (connectionString);
1302 connB = new SqlConnection (connectionString);
1305 trans = connA.BeginTransaction ();
1306 SqlCommand cmdA = new SqlCommand ("select @@version", connA, trans);
1308 SqlCommand cmdB = new SqlCommand ("select @@version", connA, trans);
1309 using (SqlDataReader reader = cmdB.ExecuteReader ()) {
1311 cmdA.Connection = connA;
1312 Assert.AreSame (connA, cmdA.Connection, "#A1");
1313 Assert.AreSame (trans, cmdA.Transaction, "#A2");
1316 cmdA.Connection = connA;
1317 Assert.Fail ("#A1");
1318 } catch (InvalidOperationException ex) {
1319 // The SqlCommand is currently busy
1321 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
1322 Assert.IsNull (ex.InnerException, "#A3");
1323 Assert.IsNotNull (ex.Message, "#A4");
1325 Assert.AreSame (connA, cmdA.Connection, "#A5");
1326 Assert.AreSame (trans, cmdA.Transaction, "#A6");
1331 cmdA.Connection = connB;
1332 Assert.AreSame (connB, cmdA.Connection, "#B1");
1333 Assert.AreSame (trans, cmdA.Transaction, "#B2");
1336 cmdA.Connection = connB;
1337 Assert.Fail ("#B1");
1338 } catch (InvalidOperationException ex) {
1339 // The SqlCommand is currently busy
1341 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
1342 Assert.IsNull (ex.InnerException, "#B3");
1343 Assert.IsNotNull (ex.Message, "#B4");
1345 Assert.AreSame (connA, cmdA.Connection, "#B5");
1346 Assert.AreSame (trans, cmdA.Transaction, "#B6");
1351 cmdA.Connection = null;
1352 Assert.IsNull (cmdA.Connection, "#C1");
1353 Assert.AreSame (trans, cmdA.Transaction, "#C2");
1356 cmdA.Connection = null;
1357 Assert.Fail ("#C1");
1358 } catch (InvalidOperationException ex) {
1359 // The SqlCommand is currently busy
1361 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2");
1362 Assert.IsNull (ex.InnerException, "#C3");
1363 Assert.IsNotNull (ex.Message, "#C4");
1365 Assert.AreSame (connA, cmdA.Connection, "#C5");
1366 Assert.AreSame (trans, cmdA.Transaction, "#C6");
1381 public void Transaction ()
1383 SqlConnection connA = null;
1384 SqlConnection connB = null;
1386 SqlTransaction transA = null;
1387 SqlTransaction transB = null;
1390 connA = new SqlConnection (connectionString);
1393 connB = new SqlConnection (connectionString);
1396 transA = connA.BeginTransaction ();
1397 transB = connB.BeginTransaction ();
1399 SqlCommand cmd = new SqlCommand ("select @@version", connA, transA);
1400 cmd.Transaction = transA;
1401 Assert.AreSame (connA, cmd.Connection, "#A1");
1402 Assert.AreSame (transA, cmd.Transaction, "#A2");
1403 cmd.Transaction = transB;
1404 Assert.AreSame (connA, cmd.Connection, "#B1");
1405 Assert.AreSame (transB, cmd.Transaction, "#B2");
1406 cmd.Transaction = null;
1407 Assert.AreSame (connA, cmd.Connection, "#C1");
1408 Assert.IsNull (cmd.Transaction, "#C2");
1421 [Test] // bug #412579
1422 public void Transaction_Reader_Open ()
1424 SqlConnection connA = null;
1425 SqlConnection connB = null;
1427 SqlTransaction transA = null;
1428 SqlTransaction transB = null;
1431 connA = new SqlConnection (connectionString);
1434 connB = new SqlConnection (connectionString);
1437 transA = connA.BeginTransaction ();
1438 transB = connB.BeginTransaction ();
1440 SqlCommand cmdA = new SqlCommand ("select * from employee", connA, transA);
1442 SqlCommand cmdB = new SqlCommand ("select * from employee", connA, transA);
1443 using (SqlDataReader reader = cmdB.ExecuteReader ()) {
1445 cmdA.Transaction = transA;
1446 Assert.AreSame (transA, cmdA.Transaction, "#A1");
1449 cmdA.Transaction = transA;
1450 Assert.Fail ("#A1");
1451 } catch (InvalidOperationException ex) {
1452 // The SqlCommand is currently busy
1454 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#A2");
1455 Assert.IsNull (ex.InnerException, "#A3");
1456 Assert.IsNotNull (ex.Message, "#A4");
1458 Assert.AreSame (transA, cmdA.Transaction, "#A5");
1463 cmdA.Transaction = transB;
1464 Assert.AreSame (transB, cmdA.Transaction, "#B1");
1467 cmdA.Transaction = transB;
1468 Assert.Fail ("#B1");
1469 } catch (InvalidOperationException ex) {
1470 // The SqlCommand is currently busy
1472 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#B2");
1473 Assert.IsNull (ex.InnerException, "#B3");
1474 Assert.IsNotNull (ex.Message, "#B4");
1476 Assert.AreSame (transA, cmdA.Transaction, "#B5");
1481 cmdA.Transaction = null;
1482 Assert.IsNull (cmdA.Transaction, "#C1");
1485 cmdA.Transaction = null;
1486 Assert.Fail ("#C1");
1487 } catch (InvalidOperationException ex) {
1488 // The SqlCommand is currently busy
1490 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#C2");
1491 Assert.IsNull (ex.InnerException, "#C3");
1492 Assert.IsNotNull (ex.Message, "#C4");
1494 Assert.AreSame (transA, cmdA.Transaction, "#C5");
1499 cmdA.Transaction = transA;
1500 Assert.AreSame (transA, cmdA.Transaction, "#D1");
1501 cmdA.Transaction = transB;
1502 Assert.AreSame (transB, cmdA.Transaction, "#D2");
1516 public void ExecuteNonQuery_StoredProcedure ()
1519 SqlCommand cmd = null;
1520 SqlDataReader dr = null;
1521 SqlParameter idParam;
1522 SqlParameter dojParam;
1524 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
1527 // parameters with leading '@'
1529 // create temp sp here, should normally be created in Setup of test
1530 // case, but cannot be done right now because of bug #68978
1531 DBHelper.ExecuteNonQuery (conn, CREATE_TMP_SP_TEMP_INSERT_PERSON);
1533 cmd = conn.CreateCommand ();
1534 cmd.CommandText = "#sp_temp_insert_employee";
1535 cmd.CommandType = CommandType.StoredProcedure;
1536 param = cmd.Parameters.Add ("@fname", SqlDbType.VarChar);
1537 param.Value = "testA";
1538 dojParam = cmd.Parameters.Add ("@doj", SqlDbType.DateTime);
1539 dojParam.Direction = ParameterDirection.Output;
1540 param = cmd.Parameters.Add ("@dob", SqlDbType.DateTime);
1541 param.Value = new DateTime (2004, 8, 20);
1542 idParam = cmd.Parameters.Add ("@id", SqlDbType.Int);
1543 idParam.Direction = ParameterDirection.ReturnValue;
1545 Assert.AreEqual (1, cmd.ExecuteNonQuery (), "#A1");
1548 cmd = conn.CreateCommand ();
1549 cmd.CommandText = "select fname, dob, doj from employee where id = @id";
1550 param = cmd.Parameters.Add ("@id", SqlDbType.Int);
1551 param.Value = idParam.Value;
1553 dr = cmd.ExecuteReader ();
1554 Assert.IsTrue (dr.Read (), "#A2");
1555 Assert.AreEqual (typeof (string), dr.GetFieldType (0), "#A3");
1556 Assert.AreEqual ("testA", dr.GetValue (0), "#A4");
1557 Assert.AreEqual (typeof (DateTime), dr.GetFieldType (1), "#A5");
1558 Assert.AreEqual (new DateTime (2004, 8, 20), dr.GetValue (1), "#A6");
1559 Assert.AreEqual (typeof (DateTime), dr.GetFieldType (2), "#A7");
1560 Assert.AreEqual (dojParam.Value, dr.GetValue (2), "#A8");
1561 Assert.IsFalse (dr.Read (), "#A9");
1569 DBHelper.ExecuteNonQuery (conn, DROP_TMP_SP_TEMP_INSERT_PERSON);
1570 DBHelper.ExecuteSimpleSP (conn, "sp_clean_employee_table");
1576 // parameters without leading '@'
1578 // create temp sp here, should normally be created in Setup of test
1579 // case, but cannot be done right now because of bug #68978
1580 DBHelper.ExecuteNonQuery (conn, CREATE_TMP_SP_TEMP_INSERT_PERSON);
1582 cmd = conn.CreateCommand ();
1583 cmd.CommandText = "#sp_temp_insert_employee";
1584 cmd.CommandType = CommandType.StoredProcedure;
1585 param = cmd.Parameters.Add ("fname", SqlDbType.VarChar);
1586 param.Value = "testB";
1587 dojParam = cmd.Parameters.Add ("doj", SqlDbType.DateTime);
1588 dojParam.Direction = ParameterDirection.Output;
1589 param = cmd.Parameters.Add ("dob", SqlDbType.DateTime);
1590 param.Value = new DateTime (2004, 8, 20);
1591 idParam = cmd.Parameters.Add ("id", SqlDbType.Int);
1592 idParam.Direction = ParameterDirection.ReturnValue;
1595 Assert.AreEqual (1, cmd.ExecuteNonQuery (), "#B1");
1598 cmd = conn.CreateCommand ();
1599 cmd.CommandText = "select fname, dob, doj from employee where id = @id";
1600 param = cmd.Parameters.Add ("id", SqlDbType.Int);
1601 param.Value = idParam.Value;
1603 dr = cmd.ExecuteReader ();
1604 Assert.IsTrue (dr.Read (), "#B2");
1605 Assert.AreEqual (typeof (string), dr.GetFieldType (0), "#B3");
1606 Assert.AreEqual ("testB", dr.GetValue (0), "#B4");
1607 Assert.AreEqual (typeof (DateTime), dr.GetFieldType (1), "#B5");
1608 Assert.AreEqual (new DateTime (2004, 8, 20), dr.GetValue (1), "#B6");
1609 Assert.AreEqual (typeof (DateTime), dr.GetFieldType (2), "#B7");
1610 Assert.AreEqual (dojParam.Value, dr.GetValue (2), "#B8");
1611 Assert.IsFalse (dr.Read (), "#B9");
1616 cmd.ExecuteNonQuery ();
1617 Assert.Fail ("#B1");
1618 } catch (SqlException ex) {
1619 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#B2");
1620 Assert.AreEqual ((byte) 16, ex.Class, "#B3");
1621 Assert.IsNull (ex.InnerException, "#B4");
1622 Assert.IsNotNull (ex.Message, "#B5");
1623 Assert.IsTrue (ex.Message.IndexOf ("#sp_temp_insert_employee") != -1, "#B6:"+ ex.Message);
1624 if (ClientVersion == 7) {
1625 // fname is not a parameter for procedure #sp_temp_insert_employee
1626 Assert.IsTrue (ex.Message.IndexOf ("fname") != -1, "#B7: " + ex.Message);
1627 Assert.AreEqual (8145, ex.Number, "#B8");
1628 Assert.AreEqual ((byte) 2, ex.State, "#B9");
1630 // Procedure or Function '#sp_temp_insert_employee' expects
1631 // parameter '@fname', which was not supplied
1632 Assert.IsTrue (ex.Message.IndexOf ("'@fname'") != -1, "#B7: " + ex.Message);
1633 Assert.AreEqual (201, ex.Number, "#B8");
1634 Assert.AreEqual ((byte) 4, ex.State, "#B9");
1643 DBHelper.ExecuteNonQuery (conn, DROP_TMP_SP_TEMP_INSERT_PERSON);
1644 DBHelper.ExecuteSimpleSP (conn, "sp_clean_employee_table");
1649 [Test] // bug #319598
1650 public void LongQueryTest ()
1652 if (ClientVersion == 7)
1653 Assert.Ignore ("Hangs on SQL Server 7.0");
1655 SqlConnection conn = new SqlConnection (
1656 connectionString + ";Pooling=false");
1659 SqlCommand cmd = conn.CreateCommand ();
1660 String value = new String ('a', 10000);
1661 cmd.CommandText = String.Format ("Select '{0}'", value);
1662 cmd.ExecuteNonQuery ();
1666 [Test] // bug #319598
1667 public void LongStoredProcTest ()
1669 if (ClientVersion == 7)
1670 Assert.Ignore ("Hangs on SQL Server 7.0");
1672 SqlConnection conn = new SqlConnection (
1673 connectionString + ";Pooling=false");
1676 /*int size = conn.PacketSize;*/
1677 SqlCommand cmd = conn.CreateCommand ();
1678 // create a temp stored proc
1679 cmd.CommandText = "Create Procedure #sp_tmp_long_params ";
1680 cmd.CommandText += "@p1 nvarchar (4000), ";
1681 cmd.CommandText += "@p2 nvarchar (4000), ";
1682 cmd.CommandText += "@p3 nvarchar (4000), ";
1683 cmd.CommandText += "@p4 nvarchar (4000) out ";
1684 cmd.CommandText += "As ";
1685 cmd.CommandText += "Begin ";
1686 cmd.CommandText += "Set @p4 = N'Hello' ";
1687 cmd.CommandText += "Return 2 ";
1688 cmd.CommandText += "End";
1689 cmd.ExecuteNonQuery ();
1692 cmd.CommandType = CommandType.StoredProcedure;
1693 cmd.CommandText = "#sp_tmp_long_params";
1695 String value = new String ('a', 4000);
1696 SqlParameter p1 = new SqlParameter ("@p1",
1697 SqlDbType.NVarChar, 4000);
1700 SqlParameter p2 = new SqlParameter ("@p2",
1701 SqlDbType.NVarChar, 4000);
1704 SqlParameter p3 = new SqlParameter ("@p3",
1705 SqlDbType.NVarChar, 4000);
1708 SqlParameter p4 = new SqlParameter ("@p4",
1709 SqlDbType.NVarChar, 4000);
1710 p4.Direction = ParameterDirection.Output;
1712 // for now, name shud be @RETURN_VALUE
1713 // can be changed once RPC is implemented
1714 SqlParameter p5 = new SqlParameter ("@RETURN_VALUE", SqlDbType.Int);
1715 p5.Direction = ParameterDirection.ReturnValue;
1717 cmd.Parameters.Add (p1);
1718 cmd.Parameters.Add (p2);
1719 cmd.Parameters.Add (p3);
1720 cmd.Parameters.Add (p4);
1721 cmd.Parameters.Add (p5);
1723 cmd.ExecuteNonQuery ();
1724 Assert.AreEqual ("Hello", p4.Value, "#1");
1725 Assert.AreEqual (2, p5.Value, "#2");
1729 [Test] // bug #319694
1730 public void DateTimeParameterTest ()
1732 SqlConnection conn = new SqlConnection (connectionString);
1735 SqlCommand cmd = conn.CreateCommand ();
1736 cmd.CommandText = "select * from datetime_family where type_datetime=@p1";
1737 cmd.Parameters.Add ("@p1", SqlDbType.DateTime).Value = "10-10-2005";
1738 // shudnt cause and exception
1739 SqlDataReader rdr = cmd.ExecuteReader ();
1745 * Verifies whether an enum value is converted to a numeric value when
1746 * used as value for a numeric parameter (bug #66630)
1749 public void EnumParameterTest ()
1751 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
1753 ConnectionManager.Singleton.OpenConnection ();
1754 // create temp sp here, should normally be created in Setup of test
1755 // case, but cannot be done right now because of ug #68978
1756 DBHelper.ExecuteNonQuery (conn, "CREATE PROCEDURE #Bug66630 ("
1757 + "@Status smallint = 7"
1759 + "AS" + Environment.NewLine
1760 + "BEGIN" + Environment.NewLine
1761 + "SELECT CAST(5 AS int), @Status" + Environment.NewLine
1764 SqlCommand cmd = new SqlCommand ("#Bug66630", conn);
1765 cmd.CommandType = CommandType.StoredProcedure;
1766 cmd.Parameters.Add ("@Status", SqlDbType.Int).Value = Status.Error;
1768 using (SqlDataReader dr = cmd.ExecuteReader ()) {
1769 // one record should be returned
1770 Assert.IsTrue (dr.Read (), "EnumParameterTest#1");
1771 // we should get two field in the result
1772 Assert.AreEqual (2, dr.FieldCount, "EnumParameterTest#2");
1774 Assert.AreEqual ("int", dr.GetDataTypeName (0), "EnumParameterTest#3");
1775 Assert.AreEqual (5, dr.GetInt32 (0), "EnumParameterTest#4");
1777 Assert.AreEqual ("smallint", dr.GetDataTypeName (1), "EnumParameterTest#5");
1778 Assert.AreEqual ((short) Status.Error, dr.GetInt16 (1), "EnumParameterTest#6");
1779 // only one record should be returned
1780 Assert.IsFalse (dr.Read (), "EnumParameterTest#7");
1783 DBHelper.ExecuteNonQuery (conn, "if exists (select name from sysobjects " +
1784 " where name like '#temp_Bug66630' and type like 'P') " +
1785 " drop procedure #temp_Bug66630; ");
1786 ConnectionManager.Singleton.CloseConnection ();
1791 public void CloneTest ()
1793 conn = new SqlConnection (connectionString);
1796 SqlTransaction trans = conn.BeginTransaction ();
1798 cmd = new SqlCommand ();
1799 cmd.Connection = conn;
1800 cmd.Transaction = trans;
1802 SqlCommand clone = (((ICloneable) (cmd)).Clone ()) as SqlCommand;
1803 Assert.AreSame (conn, clone.Connection);
1804 Assert.AreSame (trans, clone.Transaction);
1808 public void StoredProc_NoParameterTest ()
1810 string query = "create procedure #tmp_sp_proc as begin";
1811 query += " select 'data' end";
1812 SqlConnection conn = new SqlConnection (connectionString);
1813 SqlCommand cmd = conn.CreateCommand ();
1814 cmd.CommandText = query;
1816 cmd.ExecuteNonQuery ();
1818 cmd.CommandType = CommandType.StoredProcedure;
1819 cmd.CommandText = "#tmp_sp_proc";
1820 using (SqlDataReader reader = cmd.ExecuteReader ()) {
1822 Assert.AreEqual ("data", reader.GetString (0), "#1");
1824 Assert.Fail ("#2 Select shud return data");
1830 public void StoredProc_ParameterTest ()
1832 string create_query = CREATE_TMP_SP_PARAM_TEST;
1834 SqlConnection conn = new SqlConnection (connectionString);
1837 SqlCommand cmd = conn.CreateCommand ();
1839 string error = string.Empty;
1840 while (label != -1) {
1844 // Test BigInt Param
1845 DBHelper.ExecuteNonQuery (conn,
1846 String.Format (create_query, "bigint"));
1847 rpc_helper_function (cmd, SqlDbType.BigInt, 0,
1848 Int64.MaxValue, Int64.MaxValue,
1849 Int64.MaxValue, Int64.MaxValue);
1850 rpc_helper_function (cmd, SqlDbType.BigInt, 0,
1851 Int64.MinValue, Int64.MinValue,
1852 Int64.MinValue, Int64.MinValue);
1853 rpc_helper_function (cmd, SqlDbType.BigInt, 0,
1854 DBNull.Value, DBNull.Value,
1855 DBNull.Value, DBNull.Value);
1858 // Test Binary Param
1859 DBHelper.ExecuteNonQuery (conn,
1860 String.Format (create_query, "binary(5)"));
1861 rpc_helper_function (cmd, SqlDbType.Binary, 5,
1862 new byte [] { 1, 2, 3, 4, 5 },
1863 new byte [] { 1, 2, 3, 4, 5 },
1864 new byte [] { 1, 2, 3, 4, 5 },
1865 new byte [] { 1, 2, 3, 4, 5 });
1867 rpc_helper_function (cmd, SqlDbType.Binary, 5,
1868 DBNull.Value, DBNull.Value,
1871 rpc_helper_function (cmd, SqlDbType.Binary, 2,
1873 new byte [] { 0, 0, 0, 0, 0 },
1874 new byte [] { 0, 0 },
1875 new byte [] { 0, 0 });
1879 DBHelper.ExecuteNonQuery (conn,
1880 String.Format (create_query, "bit"));
1881 rpc_helper_function (cmd, SqlDbType.Bit, 0,
1882 true, true, true, true);
1883 rpc_helper_function (cmd, SqlDbType.Bit, 0,
1884 false, false, false, false);
1885 rpc_helper_function (cmd, SqlDbType.Bit, 0,
1886 DBNull.Value, DBNull.Value,
1887 DBNull.Value, DBNull.Value);
1891 DBHelper.ExecuteNonQuery (conn,
1892 String.Format (create_query, "char(10)"));
1893 rpc_helper_function (cmd, SqlDbType.Char, 10,
1894 "characters", "characters",
1895 "characters", "characters");
1897 rpc_helper_function (cmd, SqlDbType.Char, 3,
1898 "characters", "cha ",
1900 rpc_helper_function (cmd, SqlDbType.Char, 3,
1904 rpc_helper_function (cmd, SqlDbType.Char, 5,
1905 DBNull.Value, DBNull.Value,
1906 DBNull.Value, DBNull.Value);
1910 DBHelper.ExecuteNonQuery (conn,
1911 String.Format (create_query, "datetime"));
1912 rpc_helper_function (cmd, SqlDbType.DateTime, 0, "2079-06-06 23:59:00",
1913 new DateTime (2079, 6, 6, 23, 59, 0),
1914 new DateTime (2079, 6, 6, 23, 59, 0),
1915 new DateTime (2079, 6, 6, 23, 59, 0));
1916 rpc_helper_function (cmd, SqlDbType.DateTime, 0, "2009-04-12 10:39:45",
1917 new DateTime (2009, 4, 12, 10, 39, 45),
1918 new DateTime (2009, 4, 12, 10, 39, 45),
1919 new DateTime (2009, 4, 12, 10, 39, 45));
1920 rpc_helper_function (cmd, SqlDbType.DateTime, 0,
1921 DBNull.Value, DBNull.Value,
1922 DBNull.Value, DBNull.Value);
1925 // Test Decimal Param
1926 DBHelper.ExecuteNonQuery (conn,
1927 String.Format (create_query, "decimal(10,2)"));
1928 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1929 10.665m, 10.67m, 11m, 10.67m);
1930 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1932 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1933 -5.657m, -5.66m, -6m, -5.66m);
1934 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1935 DBNull.Value, DBNull.Value,
1936 DBNull.Value, DBNull.Value);
1939 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1940 AttributeTargets.Constructor,
1942 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1943 4.325f, 4.33m, 4m, 4.33m);
1944 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1945 10.0d, 10.00m, 10m, 10m);
1946 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1947 10.665d, 10.67m, 11m, 10.67m);
1948 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1949 -5.657d, -5.66m, -6m, -5.66m);
1950 rpc_helper_function (cmd, SqlDbType.Decimal, 0,
1955 DBHelper.ExecuteNonQuery (conn,
1956 String.Format (create_query, "float"));
1957 rpc_helper_function (cmd, SqlDbType.Float, 0,
1958 10.0, 10.0, 10.0, 10.0);
1959 rpc_helper_function (cmd, SqlDbType.Float, 0,
1960 10.54, 10.54, 10.54, 10.54);
1961 rpc_helper_function (cmd, SqlDbType.Float, 0,
1963 rpc_helper_function (cmd, SqlDbType.Float, 0,
1964 -5.34, -5.34, -5.34, -5.34);
1965 rpc_helper_function (cmd, SqlDbType.Float, 0,
1966 DBNull.Value, DBNull.Value,
1967 DBNull.Value, DBNull.Value);
1972 DBHelper.ExecuteNonQuery (conn,
1973 String.Format(create_query, "image"));
1974 rpc_helper_function (cmd, SqlDbType.Image, 0, );
1975 rpc_helper_function (cmd, SqlDbType.Image, 0, );
1976 rpc_helper_function (cmd, SqlDbType.Image, 0, );
1980 // Test Integer Param
1981 DBHelper.ExecuteNonQuery (conn,
1982 String.Format (create_query, "int"));
1983 rpc_helper_function (cmd, SqlDbType.Int, 0,
1985 rpc_helper_function (cmd, SqlDbType.Int, 0,
1987 rpc_helper_function (cmd, SqlDbType.Int, 0,
1989 rpc_helper_function (cmd, SqlDbType.Int, 0,
1990 int.MaxValue, int.MaxValue,
1991 int.MaxValue, int.MaxValue);
1992 rpc_helper_function (cmd, SqlDbType.Int, 0,
1993 int.MinValue, int.MinValue,
1994 int.MinValue, int.MinValue);
1995 rpc_helper_function (cmd, SqlDbType.Int, 0,
1996 DBNull.Value, DBNull.Value,
1997 DBNull.Value, DBNull.Value);
2001 DBHelper.ExecuteNonQuery (conn,
2002 String.Format (create_query, "money"));
2003 rpc_helper_function (cmd, SqlDbType.Money, 0,
2004 10m, 10m, 10m, 10m);
2005 rpc_helper_function (cmd, SqlDbType.Money, 0,
2006 10.54, 10.54m, 10.54m, 10.54m);
2007 rpc_helper_function (cmd, SqlDbType.Money, 0,
2009 rpc_helper_function (cmd, SqlDbType.Money, 0,
2010 -5.34, -5.34m, -5.34m, -5.34m);
2011 rpc_helper_function (cmd, SqlDbType.Money, 0,
2012 5.34, 5.34m, 5.34m, 5.34m);
2013 rpc_helper_function (cmd, SqlDbType.Money, 0,
2014 -10.1234m, -10.1234m, -10.1234m,
2016 rpc_helper_function (cmd, SqlDbType.Money, 0,
2017 10.1234m, 10.1234m, 10.1234m,
2019 rpc_helper_function (cmd, SqlDbType.Money, 0,
2020 -2000000000m, -2000000000m,
2021 -2000000000m, -2000000000m);
2022 rpc_helper_function (cmd, SqlDbType.Money, 0,
2023 2000000000m, 2000000000m,
2024 2000000000m, 2000000000m);
2025 rpc_helper_function (cmd, SqlDbType.Money, 0,
2026 -200000000.2345m, -200000000.2345m,
2027 -200000000.2345m, -200000000.2345m);
2028 rpc_helper_function (cmd, SqlDbType.Money, 0,
2029 200000000.2345m, 200000000.2345m,
2030 200000000.2345m, 200000000.2345m);
2031 rpc_helper_function (cmd, SqlDbType.Money, 0,
2032 DBNull.Value, DBNull.Value,
2033 DBNull.Value, DBNull.Value);
2036 rpc_helper_function (cmd, SqlDbType.Money, 0,
2037 -200000000.234561m, -200000000.2346m,
2038 -200000000.2346m, -200000000.2346m);
2039 rpc_helper_function (cmd, SqlDbType.Money, 0,
2040 -200000000.234551m, -200000000.2346m,
2041 -200000000.2346m, -200000000.2346m);
2042 rpc_helper_function (cmd, SqlDbType.Money, 0,
2043 -200000000.234541m, -200000000.2345m,
2044 -200000000.2345m, -200000000.2345m);
2045 rpc_helper_function (cmd, SqlDbType.Money, 0,
2046 200000000.234561m, 200000000.2346m,
2047 200000000.2346m, 200000000.2346m);
2048 rpc_helper_function (cmd, SqlDbType.Money, 0,
2049 200000000.234551m, 200000000.2346m,
2050 200000000.2346m, 200000000.2346m);
2051 rpc_helper_function (cmd, SqlDbType.Money, 0,
2052 200000000.234541m, 200000000.2345m,
2053 200000000.2345m, 200000000.2345m);
2054 rpc_helper_function (cmd, SqlDbType.Money, 0,
2055 -200000000.234461m, -200000000.2345m,
2056 -200000000.2345m, -200000000.2345m);
2057 rpc_helper_function (cmd, SqlDbType.Money, 0,
2058 -200000000.234451m, -200000000.2345m,
2059 -200000000.2345m, -200000000.2345m);
2060 rpc_helper_function (cmd, SqlDbType.Money, 0,
2061 -200000000.234441m, -200000000.2344m,
2062 -200000000.2344m, -200000000.2344m);
2063 rpc_helper_function (cmd, SqlDbType.Money, 0,
2064 200000000.234461m, 200000000.2345m,
2065 200000000.2345m, 200000000.2345m);
2066 rpc_helper_function (cmd, SqlDbType.Money, 0,
2067 200000000.234451m, 200000000.2345m,
2068 200000000.2345m, 200000000.2345m);
2069 rpc_helper_function (cmd, SqlDbType.Money, 0,
2070 200000000.234441m, 200000000.2344m,
2071 200000000.2344m, 200000000.2344m);
2072 // FIXME: we round toward even in SqlParameter.ConvertToFrameworkType
2074 rpc_helper_function (cmd, SqlDbType.Money, 0,
2075 -200000000.234550m, -200000000.2346m, -200000000.2346m);
2076 rpc_helper_function (cmd, SqlDbType.Money, 0,
2077 200000000.234550m, 200000000.2346m, 200000000.2346m);
2078 rpc_helper_function (cmd, SqlDbType.Money, 0,
2079 -200000000.234450m, -200000000.2345m, -200000000.2345m);
2080 rpc_helper_function (cmd, SqlDbType.Money, 0,
2081 200000000.234450m, 200000000.2345m, 200000000.2345m);
2086 DBHelper.ExecuteNonQuery (conn,
2087 String.Format (create_query, "nchar(10)"));
2088 rpc_helper_function (cmd, SqlDbType.NChar, 10,
2089 "characters", "characters",
2090 "characters", "characters");
2091 rpc_helper_function (cmd, SqlDbType.NChar, 3,
2092 "characters", "cha ",
2094 rpc_helper_function (cmd, SqlDbType.NChar, 3,
2098 rpc_helper_function (cmd, SqlDbType.NChar, 5,
2099 DBNull.Value, DBNull.Value,
2105 DBHelper.ExecuteNonQuery (conn,
2106 String.Format (create_query, "ntext"));
2108 rpc_helper_function (cmd, SqlDbType.NText, 0, "ntext");
2109 rpc_helper_function (cmd, SqlDbType.NText, 0, "");
2110 rpc_helper_function (cmd, SqlDbType.NText, 0, null);
2114 // Test NVarChar Param
2115 DBHelper.ExecuteNonQuery (conn,
2116 String.Format (create_query, "nvarchar(10)"));
2117 rpc_helper_function (cmd, SqlDbType.NVarChar, 10,
2118 "nvarchar", "nvarchar", "nvarchar",
2120 rpc_helper_function (cmd, SqlDbType.NVarChar, 3,
2121 "nvarchar", "nva", "nva", "nva");
2123 rpc_helper_function (cmd, SqlDbType.NVarChar, 10,
2124 string.Empty, string.Empty, string.Empty);
2125 rpc_helper_function (cmd, SqlDbType.NVarChar, 10,
2126 DBNull.Value, DBNull.Value, DBNull.Value);
2131 DBHelper.ExecuteNonQuery (conn,
2132 String.Format (create_query, "real"));
2133 rpc_helper_function (cmd, SqlDbType.Real, 0,
2134 10m, 10f, 10f, 10f);
2135 rpc_helper_function (cmd, SqlDbType.Real, 0,
2136 10d, 10f, 10f, 10f);
2137 rpc_helper_function (cmd, SqlDbType.Real, 0,
2139 rpc_helper_function (cmd, SqlDbType.Real, 0,
2140 3.54d, 3.54f, 3.54f, 3.54f);
2141 rpc_helper_function (cmd, SqlDbType.Real, 0,
2143 rpc_helper_function (cmd, SqlDbType.Real, 0,
2144 10.5f, 10.5f, 10.5f, 10.5f);
2145 rpc_helper_function (cmd, SqlDbType.Real, 0,
2146 3.5d, 3.5f, 3.5f, 3.5f);
2147 rpc_helper_function (cmd, SqlDbType.Real, 0,
2148 4.54m, 4.54f, 4.54f, 4.54f);
2149 rpc_helper_function (cmd, SqlDbType.Real, 0,
2150 -4.54m, -4.54f, -4.54f, -4.54f);
2151 rpc_helper_function (cmd, SqlDbType.Real, 0,
2152 DBNull.Value, DBNull.Value,
2153 DBNull.Value, DBNull.Value);
2156 // Test SmallDateTime Param
2157 DBHelper.ExecuteNonQuery (conn,
2158 String.Format (create_query, "smalldatetime"));
2159 rpc_helper_function (cmd, SqlDbType.SmallDateTime, 0,
2160 "6/6/2079 11:59:00 PM",
2161 new DateTime (2079, 6, 6, 23, 59, 0),
2162 new DateTime (2079, 6, 6, 23, 59, 0),
2163 new DateTime (2079, 6, 6, 23, 59, 0));
2164 rpc_helper_function (cmd, SqlDbType.SmallDateTime, 0,
2165 DBNull.Value, DBNull.Value,
2166 DBNull.Value, DBNull.Value);
2169 // Test SmallInt Param
2170 DBHelper.ExecuteNonQuery (conn,
2171 String.Format (create_query, "smallint"));
2172 rpc_helper_function (cmd, SqlDbType.SmallInt, 0,
2173 10, (short) 10, (short) 10, (short) 10);
2174 rpc_helper_function (cmd, SqlDbType.SmallInt, 0,
2175 -10, (short) -10, (short) -10,
2177 rpc_helper_function (cmd, SqlDbType.SmallInt, 0,
2178 short.MaxValue, short.MaxValue,
2179 short.MaxValue, short.MaxValue);
2180 rpc_helper_function (cmd, SqlDbType.SmallInt, 0,
2181 short.MinValue, short.MinValue,
2182 short.MinValue, short.MinValue);
2183 rpc_helper_function (cmd, SqlDbType.SmallInt, 0,
2184 DBNull.Value, DBNull.Value,
2185 DBNull.Value, DBNull.Value);
2188 // Test SmallMoney Param
2189 DBHelper.ExecuteNonQuery (conn,
2190 String.Format (create_query, "smallmoney"));
2191 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2192 10.0d, 10m, 10m, 10m);
2193 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2195 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2196 3.54d, 3.54m, 3.54m, 3.54m);
2197 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2199 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2200 10.5f, 10.5m, 10.5m, 10.5m);
2201 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2202 3.5d, 3.5m, 3.5m, 3.5m);
2203 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2204 4.54m, 4.54m, 4.54m, 4.54m);
2205 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2206 -4.54m, -4.54m, -4.54m, -4.54m);
2207 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2208 -214748.3648m, -214748.3648m,
2209 -214748.3648m, -214748.3648m);
2210 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2211 214748.3647m, 214748.3647m, 214748.3647m,
2213 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2214 DBNull.Value, DBNull.Value, DBNull.Value,
2218 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2219 -4.543361m, -4.5434m, -4.5434m, -4.5434m);
2220 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2221 -4.543351m, -4.5434m, -4.5434m, -4.5434m);
2222 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2223 -4.543341m, -4.5433m, -4.5433m, -4.5433m);
2224 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2225 4.543361m, 4.5434m, 4.5434m, 4.5434m);
2226 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2227 4.543351m, 4.5434m, 4.5434m, 4.5434m);
2228 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2229 4.543341m, 4.5433m, 4.5433m, 4.5433m);
2230 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2231 -4.543261m, -4.5433m, -4.5433m, -4.5433m);
2232 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2233 -4.543251m, -4.5433m, -4.5433m, -4.5433m);
2234 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2235 -4.543241m, -4.5432m, -4.5432m, -4.5432m);
2236 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2237 4.543261m, 4.5433m, 4.5433m, 4.5433m);
2238 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2239 4.543251m, 4.5433m, 4.5433m, 4.5433m);
2240 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2241 4.543241m, 4.5432m, 4.5432m, 4.5432m);
2242 // FIXME: we round toward even in SqlParameter.ConvertToFrameworkType
2244 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2245 -4.543350m, -4.5434m, -4.5434m);
2246 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2247 4.543350m, 4.5434m, 4.5434m);
2248 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2249 -4.543250m, -4.5433m, -4.5433m);
2250 rpc_helper_function (cmd, SqlDbType.SmallMoney, 0,
2251 4.543250m, 4.5433m, 4.5433m);
2256 DBHelper.ExecuteNonQuery (conn,
2257 String.Format (create_query, "text"));
2259 rpc_helper_function (cmd, SqlDbType.Text, 0, "text");
2260 rpc_helper_function (cmd, SqlDbType.Text, 0, "");
2261 rpc_helper_function (cmd, SqlDbType.Text, 0, null);
2265 // Test TimeStamp Param
2267 DBHelper.ExecuteNonQuery (conn,
2268 String.Format(create_query,"timestamp"));
2269 rpc_helper_function (cmd, SqlDbType.TimeStamp, 0, "");
2270 rpc_helper_function (cmd, SqlDbType.TimeStamp, 0, "");
2271 rpc_helper_function (cmd, SqlDbType.TimeStamp, 0, null);
2275 // Test TinyInt Param
2276 DBHelper.ExecuteNonQuery (conn,
2277 String.Format (create_query, "tinyint"));
2278 rpc_helper_function (cmd, SqlDbType.TinyInt, 0,
2279 10.0d, (byte) 10, (byte) 10,
2281 rpc_helper_function (cmd, SqlDbType.TinyInt, 0,
2282 0, (byte) 0, (byte) 0, (byte) 0);
2283 rpc_helper_function (cmd, SqlDbType.TinyInt, 0,
2284 byte.MaxValue, byte.MaxValue,
2285 byte.MaxValue, byte.MaxValue);
2286 rpc_helper_function (cmd, SqlDbType.TinyInt, 0,
2287 byte.MinValue, byte.MinValue,
2288 byte.MinValue, byte.MinValue);
2291 // Test UniqueIdentifier Param
2293 DBHelper.ExecuteNonQuery (conn,
2294 String.Format(create_query,"uniqueidentifier"));
2295 rpc_helper_function (cmd, SqlDbType.UniqueIdentifier, 0, "0f159bf395b1d04f8c2ef5c02c3add96");
2296 rpc_helper_function (cmd, SqlDbType.UniqueIdentifier, 0, null);
2300 // Test VarBinary Param
2302 DBHelper.ExecuteNonQuery (conn,
2303 String.Format(create_query,"varbinary (10)"));
2304 rpc_helper_function (cmd, SqlDbType.VarBinary, 0,);
2305 rpc_helper_function (cmd, SqlDbType.VarBinary, 0,);
2306 rpc_helper_function (cmd, SqlDbType.VarBinary, 0, null);
2310 // Test Varchar Param
2311 DBHelper.ExecuteNonQuery (conn,
2312 String.Format (create_query, "varchar(10)"));
2313 rpc_helper_function (cmd, SqlDbType.VarChar, 7,
2314 "VarChar", "VarChar", "VarChar",
2316 rpc_helper_function (cmd, SqlDbType.VarChar, 5,
2317 "Var", "Var", "Var", "Var");
2319 rpc_helper_function (cmd, SqlDbType.VarChar, 3,
2320 "Varchar", "Var", "Var");
2321 rpc_helper_function (cmd, SqlDbType.VarChar, 10,
2322 string.Empty, string.Empty, string.Empty);
2323 rpc_helper_function (cmd, SqlDbType.VarChar, 10,
2324 DBNull.Value, DBNull.Value,
2329 // Test Variant Param
2331 DBHelper.ExecuteNonQuery (conn,
2332 String.Format(create_query,"variant"));
2333 rpc_helper_function (cmd, SqlDbType.Variant, 0, );
2334 rpc_helper_function (cmd, SqlDbType.Variant, 0, );
2335 rpc_helper_function (cmd, SqlDbType.Variant, 0, null);
2342 } catch (AssertionException ex) {
2343 error += String.Format (" Case {0} INCORRECT VALUE : {1}\n", label, ex.ToString ());
2344 } catch (Exception ex) {
2345 error += String.Format (" Case {0} NOT WORKING : {1}\n", label, ex.ToString ());
2350 DBHelper.ExecuteNonQuery (conn, string.Format (
2351 CultureInfo.InvariantCulture,
2352 DROP_STORED_PROCEDURE, "#tmp_sp_param_test"));
2355 if (error.Length != 0)
2356 Assert.Fail (error);
2359 private void rpc_helper_function (SqlCommand cmd, SqlDbType type, int size, object input, object expectedRead, object expectedOut, object expectedInOut)
2361 cmd.Parameters.Clear ();
2362 SqlParameter param1, param2, param3;
2364 param1 = new SqlParameter ("@param1", type, size);
2365 param2 = new SqlParameter ("@param2", type, size);
2366 param3 = new SqlParameter ("@param3", type, size);
2368 param1 = new SqlParameter ("@param1", type);
2369 param2 = new SqlParameter ("@param2", type);
2370 param3 = new SqlParameter ("@param3", type);
2373 SqlParameter retval = new SqlParameter ("retval", SqlDbType.Int);
2374 param1.Value = input;
2375 param1.Direction = ParameterDirection.Input;
2376 param2.Direction = ParameterDirection.Output;
2377 param3.Direction = ParameterDirection.InputOutput;
2378 param3.Value = input;
2379 retval.Direction = ParameterDirection.ReturnValue;
2380 cmd.Parameters.Add (param1);
2381 cmd.Parameters.Add (param2);
2382 cmd.Parameters.Add (param3);
2383 cmd.Parameters.Add (retval);
2384 cmd.CommandText = "#tmp_sp_param_test";
2385 cmd.CommandType = CommandType.StoredProcedure;
2386 using (SqlDataReader reader = cmd.ExecuteReader ()) {
2387 Assert.IsTrue (reader.Read (), "#1");
2388 AreEqual (expectedRead, reader.GetValue (0), "#2");
2389 Assert.IsFalse (reader.Read (), "#3");
2392 AreEqual (expectedOut, param2.Value, "#4");
2393 AreEqual (expectedInOut, param3.Value, "#5");
2394 Assert.AreEqual (5, retval.Value, "#6");
2398 public void OutputParamSizeTest1 ()
2400 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2401 ConnectionManager.Singleton.OpenConnection ();
2402 cmd = new SqlCommand ();
2403 cmd.Connection = conn;
2405 cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
2406 cmd.CommandType = CommandType.Text;
2407 cmd.ExecuteNonQuery ();
2409 cmd.CommandText = "#testsize";
2410 cmd.CommandType = CommandType.StoredProcedure;
2412 SqlParameter p1 = new SqlParameter ();
2413 p1.ParameterName = "@p1";
2414 p1.Direction = ParameterDirection.InputOutput;
2415 p1.DbType = DbType.String;
2416 p1.IsNullable = false;
2417 cmd.Parameters.Add (p1);
2420 cmd.ExecuteNonQuery ();
2422 } catch (InvalidOperationException ex) {
2423 // String[0]: the Size property has an invalid
2425 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
2426 Assert.IsNull (ex.InnerException, "#3");
2427 Assert.IsNotNull (ex.Message, "#4");
2432 public void OutputParamSizeTest2 ()
2434 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2435 ConnectionManager.Singleton.OpenConnection ();
2436 cmd = new SqlCommand ();
2437 cmd.Connection = conn;
2439 cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
2440 cmd.CommandType = CommandType.Text;
2441 cmd.ExecuteNonQuery ();
2443 cmd.CommandText = "#testsize";
2444 cmd.CommandType = CommandType.StoredProcedure;
2446 SqlParameter p1 = new SqlParameter ();
2447 p1.ParameterName = "@p1";
2448 p1.Direction = ParameterDirection.Output;
2449 p1.DbType = DbType.String;
2450 p1.IsNullable = false;
2451 cmd.Parameters.Add (p1);
2454 cmd.ExecuteNonQuery ();
2456 } catch (InvalidOperationException ex) {
2457 // String[0]: the Size property has an invalid
2459 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
2460 Assert.IsNull (ex.InnerException, "#3");
2461 Assert.IsNotNull (ex.Message, "#4");
2466 public void OutputParamSizeTest3 ()
2468 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2469 ConnectionManager.Singleton.OpenConnection ();
2470 cmd = new SqlCommand ();
2471 cmd.Connection = conn;
2473 cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
2474 cmd.CommandType = CommandType.Text;
2475 cmd.ExecuteNonQuery ();
2477 cmd.CommandText = "#testsize";
2478 cmd.CommandType = CommandType.StoredProcedure;
2480 SqlParameter p1 = new SqlParameter ();
2481 p1.ParameterName = "@p1";
2482 p1.Direction = ParameterDirection.InputOutput;
2483 p1.DbType = DbType.String;
2484 p1.IsNullable = true;
2485 cmd.Parameters.Add (p1);
2488 cmd.ExecuteNonQuery ();
2490 } catch (InvalidOperationException ex) {
2491 // String[0]: the Size property has an invalid
2493 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
2494 Assert.IsNull (ex.InnerException, "#3");
2495 Assert.IsNotNull (ex.Message, "#4");
2500 public void OutputParamSizeTest4 ()
2502 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2503 ConnectionManager.Singleton.OpenConnection ();
2504 cmd = new SqlCommand ();
2505 cmd.Connection = conn;
2507 cmd.CommandText = "create procedure #testsize (@p1 as varchar(10) output) as return";
2508 cmd.CommandType = CommandType.Text;
2509 cmd.ExecuteNonQuery ();
2511 cmd.CommandText = "#testsize";
2512 cmd.CommandType = CommandType.StoredProcedure;
2514 SqlParameter p1 = new SqlParameter ();
2515 p1.ParameterName = "@p1";
2516 p1.Direction = ParameterDirection.Output;
2517 p1.DbType = DbType.String;
2518 p1.IsNullable = true;
2519 cmd.Parameters.Add (p1);
2522 cmd.ExecuteNonQuery ();
2524 } catch (InvalidOperationException ex) {
2525 // String[0]: the Size property has an invalid
2527 Assert.AreEqual (typeof (InvalidOperationException), ex.GetType (), "#2");
2528 Assert.IsNull (ex.InnerException, "#3");
2529 Assert.IsNotNull (ex.Message, "#4");
2533 [Test] // bug #470579
2534 public void OutputParamTest ()
2536 SqlParameter newId, id;
2538 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2539 ConnectionManager.Singleton.OpenConnection ();
2541 cmd = conn.CreateCommand ();
2542 cmd.CommandText = "set @NewId=@Id + 2";
2543 cmd.CommandType = CommandType.Text;
2544 newId = cmd.Parameters.Add ("@NewId", SqlDbType.Int);
2545 newId.Direction = ParameterDirection.Output;
2546 id = cmd.Parameters.Add ("@Id", SqlDbType.Int);
2548 cmd.ExecuteNonQuery ();
2550 Assert.AreEqual (5, newId.Value, "#A1");
2551 Assert.AreEqual (3, id.Value, "#A2");
2553 cmd = conn.CreateCommand ();
2554 cmd.CommandText = "set @NewId=@Id + 2";
2555 cmd.CommandType = CommandType.Text;
2556 newId = cmd.Parameters.Add ("NewId", SqlDbType.Int);
2557 newId.Direction = ParameterDirection.Output;
2558 id = cmd.Parameters.Add ("Id", SqlDbType.Int);
2561 cmd.ExecuteNonQuery ();
2563 Assert.AreEqual (8, newId.Value, "#B1");
2564 Assert.AreEqual (6, id.Value, "#B2");
2567 cmd.ExecuteNonQuery ();
2568 Assert.Fail ("#B1");
2569 } catch (SqlException ex) {
2570 // Incorrect syntax near 'NewId'.
2571 // Must declare the scalar variable "@Id"
2572 Assert.AreEqual (typeof (SqlException), ex.GetType (), "#B2");
2573 Assert.AreEqual ((byte) 15, ex.Class, "#B3");
2574 Assert.IsNull (ex.InnerException, "#B4");
2575 Assert.IsNotNull (ex.Message, "#B5");
2576 Assert.IsTrue (ex.Message.IndexOf ("'NewId'") != -1, "#B6: " + ex.Message);
2577 if (ClientVersion == 7) {
2578 Assert.IsTrue (ex.Message.IndexOf ("'@Id'") != -1, "#B7: " + ex.Message);
2579 Assert.AreEqual (170, ex.Number, "#B8");
2581 Assert.IsTrue (ex.Message.IndexOf ("\"@Id\"") != -1, "#B7: " + ex.Message);
2582 Assert.AreEqual (102, ex.Number, "#B8");
2584 Assert.AreEqual ((byte) 1, ex.State, "#B9");
2590 public void SmallMoney_Overflow_Max ()
2592 conn = new SqlConnection (connectionString);
2595 DBHelper.ExecuteNonQuery (conn, string.Format (
2596 CultureInfo.InvariantCulture, CREATE_TMP_SP_TYPE_TEST,
2598 //decimal overflow = 214748.36471m;
2599 decimal overflow = 214748.3648m;
2601 cmd = conn.CreateCommand ();
2602 cmd.CommandText = "#tmp_sp_type_test";
2603 cmd.CommandType = CommandType.StoredProcedure;
2605 SqlParameter param = cmd.Parameters.Add ("@param",
2606 SqlDbType.SmallMoney);
2607 param.Value = overflow;
2610 cmd.ExecuteScalar ();
2612 } catch (OverflowException ex) {
2613 // SqlDbType.SmallMoney overflow. Value '214748.36471'
2614 // is out of range. Must be between -214,748.3648 and 214,748.3647
2615 Assert.AreEqual (typeof (OverflowException), ex.GetType (), "#2");
2616 Assert.IsNull (ex.InnerException, "#3");
2617 Assert.IsNotNull (ex.Message, "#4");
2619 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2620 CultureInfo.InvariantCulture, "'{0}'",
2621 overflow)) != -1, "#5:" + ex.Message);
2623 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2624 CultureInfo.CurrentCulture, "'{0}'",
2625 overflow)) != -1, "#5:" + ex.Message);
2627 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2628 CultureInfo.InvariantCulture, "{0:N4}",
2629 SMALLMONEY_MIN)) != -1, "#6:" + ex.Message);
2630 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2631 CultureInfo.InvariantCulture, "{0:N4}",
2632 SMALLMONEY_MAX)) != -1, "#7:" + ex.Message);
2634 DBHelper.ExecuteNonQuery (conn, string.Format (
2635 CultureInfo.InvariantCulture,
2636 DROP_STORED_PROCEDURE, "#tmp_sp_type_test"));
2641 public void SmallMoney_Overflow_Min ()
2643 conn = new SqlConnection (connectionString);
2646 DBHelper.ExecuteNonQuery (conn, string.Format (
2647 CultureInfo.InvariantCulture, CREATE_TMP_SP_TYPE_TEST,
2649 //decimal overflow = -214748.36481m;
2650 decimal overflow = -214748.3649m;
2652 cmd = conn.CreateCommand ();
2653 cmd.CommandText = "#tmp_sp_type_test";
2654 cmd.CommandType = CommandType.StoredProcedure;
2656 SqlParameter param = cmd.Parameters.Add ("@param",
2657 SqlDbType.SmallMoney);
2658 param.Value = overflow;
2661 cmd.ExecuteScalar ();
2663 } catch (OverflowException ex) {
2664 // SqlDbType.SmallMoney overflow. Value '-214748,36481'
2665 // is out of range. Must be between -214,748.3648 and 214,748.3647
2666 Assert.AreEqual (typeof (OverflowException), ex.GetType (), "#2");
2667 Assert.IsNull (ex.InnerException, "#3");
2668 Assert.IsNotNull (ex.Message, "#4");
2670 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2671 CultureInfo.InvariantCulture, "'{0}'",
2672 overflow)) != -1, "#5:" + ex.Message);
2674 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2675 CultureInfo.CurrentCulture, "'{0}'",
2676 overflow)) != -1, "#5:" + ex.Message);
2678 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2679 CultureInfo.InvariantCulture, "{0:N4}",
2680 SMALLMONEY_MIN)) != -1, "#6:" + ex.Message);
2681 Assert.IsTrue (ex.Message.IndexOf (string.Format (
2682 CultureInfo.InvariantCulture, "{0:N4}",
2683 SMALLMONEY_MAX)) != -1, "#7:" + ex.Message);
2685 DBHelper.ExecuteNonQuery (conn, string.Format (
2686 CultureInfo.InvariantCulture,
2687 DROP_STORED_PROCEDURE, "#tmp_sp_type_test"));
2693 public void NotificationTest ()
2695 cmd = new SqlCommand ();
2696 SqlNotificationRequest notification = new SqlNotificationRequest("MyNotification","MyService",15);
2697 Assert.AreEqual (null, cmd.Notification, "#1 The default value for this property should be null");
2698 cmd.Notification = notification;
2699 Assert.AreEqual ("MyService", cmd.Notification.Options, "#2 The value should be MyService as the constructor is initiated with this value");
2700 Assert.AreEqual (15, cmd.Notification.Timeout, "#2 The value should be 15 as the constructor is initiated with this value");
2704 public void NotificationAutoEnlistTest ()
2706 cmd = new SqlCommand ();
2707 Assert.AreEqual (true, cmd.NotificationAutoEnlist, "#1 Default value of the property should be true");
2708 cmd.NotificationAutoEnlist = false;
2709 Assert.AreEqual (false, cmd.NotificationAutoEnlist, "#2 The value of the property should be false after setting it to false");
2713 public void BeginExecuteXmlReaderTest ()
2715 cmd = new SqlCommand ();
2716 string connectionString1 = null;
2717 connectionString1 = ConnectionManager.Singleton.ConnectionString + "Asynchronous Processing=true";
2719 SqlConnection conn1 = new SqlConnection (connectionString1);
2721 cmd.CommandText = "Select lname from employee where id<2 FOR XML AUTO, XMLDATA";
2722 cmd.Connection = conn1;
2724 IAsyncResult result = cmd.BeginExecuteXmlReader ();
2725 XmlReader reader = cmd.EndExecuteXmlReader (result);
2726 while (reader.Read ()) {
2727 if (reader.LocalName.ToString () == "employee")
2728 Assert.AreEqual ("kumar", reader["lname"], "#1 ");
2731 ConnectionManager.Singleton.CloseConnection ();
2736 public void BeginExecuteXmlReaderExceptionTest ()
2738 cmd = new SqlCommand ();
2740 SqlConnection conn = new SqlConnection (connectionString);
2742 cmd.CommandText = "Select lname from employee where id<2 FOR XML AUTO, XMLDATA";
2743 cmd.Connection = conn;
2746 /*IAsyncResult result = */cmd.BeginExecuteXmlReader ();
2747 } catch (InvalidOperationException) {
2748 Assert.AreEqual (ConnectionManager.Singleton.ConnectionString, connectionString, "#1 Connection string has changed");
2751 Assert.Fail ("Expected Exception InvalidOperationException not thrown");
2753 ConnectionManager.Singleton.CloseConnection ();
2759 public void SqlCommandDisposeTest ()
2761 IDataReader reader = null;
2763 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2764 ConnectionManager.Singleton.OpenConnection ();
2766 IDbCommand command = conn.CreateCommand ();
2768 string sql = "SELECT * FROM employee";
2769 command.CommandText = sql;
2770 reader = command.ExecuteReader ();
2774 while (reader.Read ()) ;
2777 ConnectionManager.Singleton.CloseConnection ();
2781 private void bug326182_OutputParamMixupTestCommon (int paramOrder,
2789 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2790 ConnectionManager.Singleton.OpenConnection ();
2793 SqlParameter param0 = new SqlParameter ("@param0", SqlDbType.Int);
2794 param0.Direction = ParameterDirection.Output;
2795 SqlParameter param1 = new SqlParameter ("@param1", SqlDbType.Int);
2796 param1.Direction = ParameterDirection.Output;
2797 SqlParameter param2 = new SqlParameter ("@param2", SqlDbType.Int);
2798 param2.Direction = ParameterDirection.Output;
2799 SqlParameter param3 = new SqlParameter ("@param3", SqlDbType.Int);
2800 param3.Direction = ParameterDirection.Output;
2801 SqlParameter rval = new SqlParameter ("@RETURN_VALUE", SqlDbType.Int);
2802 rval.Direction = ParameterDirection.ReturnValue;
2804 cmd = conn.CreateCommand ();
2805 cmd.CommandText = "dbo.[sp_326182a]";
2806 cmd.CommandType = CommandType.StoredProcedure;
2808 switch (paramOrder) {
2809 case 1: cmd.Parameters.Add (param0);
2810 cmd.Parameters.Add (param1);
2811 cmd.Parameters.Add (rval);
2812 cmd.Parameters.Add (param2);
2813 cmd.Parameters.Add (param3);
2815 case 2: cmd.Parameters.Add (rval);
2816 cmd.Parameters.Add (param1);
2817 cmd.Parameters.Add (param0);
2818 cmd.Parameters.Add (param2);
2819 cmd.Parameters.Add (param3);
2821 default: cmd.Parameters.Add (param0);
2822 cmd.Parameters.Add (param1);
2823 cmd.Parameters.Add (param2);
2824 cmd.Parameters.Add (param3);
2825 cmd.Parameters.Add (rval);
2829 cmd.ExecuteNonQuery ();
2831 /* Copy the param values to variables, just in case if
2832 * tests fail, we don't want the created sp to exist */
2833 param3Val = (int) cmd.Parameters ["@param3"].Value;
2834 param1Val = (int) cmd.Parameters ["@param1"].Value;
2835 rvalVal = (int) cmd.Parameters ["@RETURN_VALUE"].Value;
2836 param2Val = (int) cmd.Parameters ["@param2"].Value;
2837 param0Val = (int) cmd.Parameters ["@param0"].Value;
2843 ConnectionManager.Singleton.CloseConnection ();
2849 public void bug326182_OutputParamMixupTest_Normal ()
2851 int param0Val, param1Val, param2Val, param3Val, rvalVal;
2853 //param0Val = param1Val = param2Val = param3Val = rvalVal = 0;
2855 bug326182_OutputParamMixupTestCommon (0, out param0Val, out param1Val,
2856 out param2Val, out param3Val, out rvalVal);
2857 Assert.AreEqual (103, param3Val);
2858 Assert.AreEqual (101, param1Val);
2859 Assert.AreEqual (2, rvalVal);
2860 Assert.AreEqual (102, param2Val);
2861 Assert.AreEqual (100, param0Val);
2865 public void bug326182_OutputParamMixupTest_RValInBetween ()
2867 int param0Val, param1Val, param2Val, param3Val, rvalVal;
2869 bug326182_OutputParamMixupTestCommon (1, out param0Val, out param1Val,
2870 out param2Val, out param3Val, out rvalVal);
2871 Assert.AreEqual (103, param3Val);
2872 Assert.AreEqual (101, param1Val);
2873 Assert.AreEqual (2, rvalVal);
2874 Assert.AreEqual (102, param2Val);
2875 Assert.AreEqual (100, param0Val);
2879 public void bug326182_OutputParamMixupTest_RValFirst ()
2881 int param0Val, param1Val, param2Val, param3Val, rvalVal;
2883 bug326182_OutputParamMixupTestCommon (2, out param0Val, out param1Val,
2884 out param2Val, out param3Val, out rvalVal);
2885 Assert.AreEqual (103, param3Val);
2886 Assert.AreEqual (101, param1Val);
2887 Assert.AreEqual (2, rvalVal);
2888 Assert.AreEqual (102, param2Val);
2889 Assert.AreEqual (100, param0Val);
2893 public void DeriveParameterTest_FullSchema ()
2895 string create_tbl = "CREATE TABLE decimalCheck (deccheck DECIMAL (19, 5) null)";
2896 string create_sp = "CREATE PROCEDURE sp_bug584833(@deccheck decimal(19,5) OUT)"
2897 + "AS " + Environment.NewLine
2898 + "BEGIN" + Environment.NewLine
2899 + "INSERT INTO decimalCheck values (@deccheck)" + Environment.NewLine
2900 + "SELECT @deccheck=deccheck from decimalCheck" + Environment.NewLine
2904 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2905 ConnectionManager.Singleton.OpenConnection ();
2907 cmd = conn.CreateCommand ();
2908 cmd.ExecuteNonQuery ();
2910 cmd.CommandText = create_sp;
2911 cmd.ExecuteNonQuery ();
2913 cmd.CommandText = "monotest.dbo.sp_bug584833";
2914 cmd.CommandType = CommandType.StoredProcedure;
2916 SqlCommandBuilder.DeriveParameters (cmd);
2917 Assert.AreEqual (2, cmd.Parameters.Count, "#DPT - FullSchema - Parameter count mismatch");
2918 Assert.AreEqual ("@deccheck", cmd.Parameters[1].ParameterName, "#DPT - FullSchema - Parameter name mismatch");
2919 Assert.AreEqual (SqlDbType.Decimal, cmd.Parameters[1].DbType, "#DPT - FullSchema - Parameter type mismatch");
2923 ConnectionManager.Singleton.CloseConnection ();
2930 public void DeriveParameterTest_SPName ()
2932 string create_tbl = "CREATE TABLE decimalCheck (deccheck DECIMAL (19, 5) null)";
2933 string create_sp = "CREATE PROCEDURE sp_bug584833(@deccheck decimal(19,5) OUT)"
2934 + "AS " + Environment.NewLine
2935 + "BEGIN" + Environment.NewLine
2936 + "INSERT INTO decimalCheck values (@deccheck)" + Environment.NewLine
2937 + "SELECT @deccheck=deccheck from decimalCheck" + Environment.NewLine
2941 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2942 ConnectionManager.Singleton.OpenConnection ();
2944 cmd = conn.CreateCommand ();
2945 cmd.ExecuteNonQuery ();
2947 cmd.CommandText = create_sp;
2948 cmd.ExecuteNonQuery ();
2950 cmd.CommandText = "sp_bug584833";
2951 cmd.CommandType = CommandType.StoredProcedure;
2953 SqlCommandBuilder.DeriveParameters (cmd);
2954 Assert.AreEqual (2, cmd.Parameters.Count, "#DPT - SPName - Parameter count mismatch");
2955 Assert.AreEqual ("@deccheck", cmd.Parameters[1].ParameterName, "#DPT - SPName - Parameter name mismatch");
2956 Assert.AreEqual (SqlDbType.Decimal, cmd.Parameters[1].DbType, "#DPT - SPName - Parameter type mismatch");
2960 ConnectionManager.Singleton.CloseConnection ();
2966 public void DeriveParameterTest_UserSchema ()
2968 string create_tbl = "CREATE TABLE decimalCheck (deccheck DECIMAL (19, 5) null)";
2969 string create_sp = "CREATE PROCEDURE sp_bug584833(@deccheck decimal(19,5) OUT)"
2970 + "AS " + Environment.NewLine
2971 + "BEGIN" + Environment.NewLine
2972 + "INSERT INTO decimalCheck values (@deccheck)" + Environment.NewLine
2973 + "SELECT @deccheck=deccheck from decimalCheck" + Environment.NewLine
2977 conn = (SqlConnection) ConnectionManager.Singleton.Connection;
2978 ConnectionManager.Singleton.OpenConnection ();
2980 cmd = conn.CreateCommand ();
2981 cmd.ExecuteNonQuery ();
2983 cmd.CommandText = create_sp;
2984 cmd.ExecuteNonQuery ();
2986 cmd.CommandText = "dbo.sp_bug584833";
2987 cmd.CommandType = CommandType.StoredProcedure;
2989 SqlCommandBuilder.DeriveParameters (cmd);
2990 Assert.AreEqual (2, cmd.Parameters.Count, "#DPT - user schema - Parameter count mismatch");
2991 Assert.AreEqual ("@deccheck", cmd.Parameters[1].ParameterName, "#DPT - user schema - Parameter name mismatch");
2992 Assert.AreEqual (SqlDbType.Decimal, cmd.Parameters[1].DbType, "#DPT - user schema - Parameter type mismatch");
2996 ConnectionManager.Singleton.CloseConnection ();
3001 // used as workaround for bugs in NUnit 2.2.0
3002 static void AreEqual (object x, object y, string msg)
3004 if (x == null && y == null)
3006 if ((x == null || y == null))
3007 throw new AssertionException (string.Format (CultureInfo.InvariantCulture,
3008 "Expected: {0}, but was: {1}. {2}",
3009 x == null ? "<null>" : x, y == null ? "<null>" : y, msg));
3011 bool isArrayX = x.GetType ().IsArray;
3012 bool isArrayY = y.GetType ().IsArray;
3014 if (isArrayX && isArrayY) {
3015 Array arrayX = (Array) x;
3016 Array arrayY = (Array) y;
3018 if (arrayX.Length != arrayY.Length)
3019 throw new AssertionException (string.Format (CultureInfo.InvariantCulture,
3020 "Length of arrays differs. Expected: {0}, but was: {1}. {2}",
3021 arrayX.Length, arrayY.Length, msg));
3023 for (int i = 0; i < arrayX.Length; i++) {
3024 object itemX = arrayX.GetValue (i);
3025 object itemY = arrayY.GetValue (i);
3026 if (!itemX.Equals (itemY))
3027 throw new AssertionException (string.Format (CultureInfo.InvariantCulture,
3028 "Arrays differ at position {0}. Expected: {1}, but was: {2}. {3}",
3029 i, itemX, itemY, msg));
3031 } else if (!x.Equals (y)) {
3032 throw new AssertionException (string.Format (CultureInfo.InvariantCulture,
3033 "Expected: {0} ({1}), but was: {2} ({3}). {4}",
3034 x, x.GetType (), y, y.GetType (), msg));
3040 return (engine.ClientVersion);
3050 private readonly string CREATE_TMP_SP_PARAM_TEST =
3051 "CREATE PROCEDURE #tmp_sp_param_test (" + Environment.NewLine +
3052 " @param1 {0}," + Environment.NewLine +
3053 " @param2 {0} output," + Environment.NewLine +
3054 " @param3 {0} output)" + Environment.NewLine +
3055 "AS" + Environment.NewLine +
3056 "BEGIN" + Environment.NewLine +
3057 " SELECT @param1" + Environment.NewLine +
3058 " SET @param2=@param1" + Environment.NewLine +
3059 " RETURN 5" + Environment.NewLine +
3062 private readonly string CREATE_TMP_SP_TEMP_INSERT_PERSON = ("create procedure #sp_temp_insert_employee ( " + Environment.NewLine +
3063 "@fname varchar (20), " + Environment.NewLine +
3064 "@dob datetime, " + Environment.NewLine +
3065 "@doj datetime output " + Environment.NewLine +
3066 ") " + Environment.NewLine +
3067 "as " + Environment.NewLine +
3068 "begin" + Environment.NewLine +
3069 "declare @id int;" + Environment.NewLine +
3070 "select @id = max (id) from employee;" + Environment.NewLine +
3071 "set @id = @id + 6000 + 1;" + Environment.NewLine +
3072 "set @doj = getdate();" + Environment.NewLine +
3073 "insert into employee (id, fname, dob, doj) values (@id, @fname, @dob, @doj);" + Environment.NewLine +
3074 "return @id;" + Environment.NewLine +
3077 private readonly string DROP_TMP_SP_TEMP_INSERT_PERSON = ("if exists (select name from sysobjects where " + Environment.NewLine +
3078 "name = '#sp_temp_insert_employee' and type = 'P') " + Environment.NewLine +
3079 "drop procedure #sp_temp_insert_employee; ");
3081 private static readonly string CREATE_TMP_SP_TYPE_TEST =
3082 "CREATE PROCEDURE #tmp_sp_type_test " +
3085 ") AS SELECT @param";
3086 private static readonly string DROP_STORED_PROCEDURE =
3087 "DROP PROCEDURE {0}";