* SqlCommandBuilderTest.cs: Improved tests to also check
authorGert Driesen <drieseng@users.sourceforge.net>
Sun, 4 Jan 2009 21:45:09 +0000 (21:45 -0000)
committerGert Driesen <drieseng@users.sourceforge.net>
Sun, 4 Jan 2009 21:45:09 +0000 (21:45 -0000)
behavior of RefreshSchema.
* SqlDataReaderTest.cs: Added tests for GetBytes.

svn path=/trunk/mcs/; revision=122398

mcs/class/System.Data/Test/ProviderTests/System.Data.SqlClient/ChangeLog
mcs/class/System.Data/Test/ProviderTests/System.Data.SqlClient/SqlCommandBuilderTest.cs
mcs/class/System.Data/Test/ProviderTests/System.Data.SqlClient/SqlDataReaderTest.cs

index 5b4a66dc9b44379c5f1b9c0304f3f9682aa760be..507346e9c3392d536cb179ca02b8819cddb0adb0 100644 (file)
@@ -1,3 +1,9 @@
+2009-01-04  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * SqlCommandBuilderTest.cs: Improved tests to also check
+       behavior of RefreshSchema.
+       * SqlDataReaderTest.cs: Added tests for GetBytes.
+
 2009-01-03  Gert Driesen  <drieseng@users.sourceforge.net>
 
        * SqlCommandBuilderTest.cs: Improve Get*Command tests.
index d8a1ffa51d680f43a6edd583b1ffa9c2815d6997..b9a55a0bf3849a1d6c16d04ffa609b22e1a4617d 100644 (file)
@@ -76,11 +76,11 @@ namespace MonoTests.System.Data
 #endif
                                Assert.AreSame (conn, cmd.Connection, "#A2");
                                AssertInsertParameters (cmd, false, "#A3:");
+                               Assert.AreSame (cmd, cb.GetInsertCommand (), "#A4");
 
-                               cb = new SqlCommandBuilder (da);
+                               cb.RefreshSchema ();
                                cb.QuotePrefix = "\"";
                                cmd = cb.GetInsertCommand ();
-
 #if NET_2_0
                                Assert.AreEqual ("INSERT INTO \"employee] (\"id], " +
                                        "\"fname], \"lname]) VALUES (@p1, @p2, @p3)",
@@ -92,8 +92,9 @@ namespace MonoTests.System.Data
 #endif
                                Assert.AreSame (conn, cmd.Connection, "#B2");
                                AssertInsertParameters (cmd, false, "#B3:");
+                               Assert.AreSame (cmd, cb.GetInsertCommand (), "#B4");
 
-                               cb = new SqlCommandBuilder (da);
+                               cb.RefreshSchema ();
 #if NET_2_0
                                cb.QuoteSuffix = "\"";
 #else
@@ -101,36 +102,17 @@ namespace MonoTests.System.Data
 #endif
                                cmd = cb.GetInsertCommand ();
 #if NET_2_0
-                               Assert.AreEqual ("INSERT INTO [employee\" ([id\", "
-                                       + "[fname\", [lname\") VALUES (@p1, @p2, @p3)",
+                               Assert.AreEqual ("INSERT INTO \"employee\" (\"id\", "
+                                       + "\"fname\", \"lname\") VALUES (@p1, @p2, @p3)",
                                        cmd.CommandText, "#C1");
 #else
-                               Assert.AreEqual ("INSERT INTO employee´( id´ , " +
-                                       "fname´ , lname´ ) VALUES ( @p1 , @p2 , @p3 )",
+                               Assert.AreEqual ("INSERT INTO \"employee´( \"id´ , " +
+                                       "\"fname´ , \"lname´ ) VALUES ( @p1 , @p2 , @p3 )",
                                        cmd.CommandText, "#C1");
 #endif
                                Assert.AreSame (conn, cmd.Connection, "#C2");
                                AssertInsertParameters (cmd, false, "#C3");
-
-                               cb = new SqlCommandBuilder (da);
-                               cb.QuotePrefix = "\"";
-#if NET_2_0
-                               cb.QuoteSuffix = "\"";
-#else
-                               cb.QuoteSuffix = "´";
-#endif
-                               cmd = cb.GetInsertCommand ();
-#if NET_2_0
-                               Assert.AreEqual ("INSERT INTO \"employee\" (\"id\", " +
-                                       "\"fname\", \"lname\") VALUES (@p1, @p2, @p3)",
-                                       cmd.CommandText, "#D1");
-#else
-                               Assert.AreEqual ("INSERT INTO \"employee´( \"id´ , " +
-                                       "\"fname´ , \"lname´ ) VALUES ( @p1 , @p2 , @p3 )",
-                                       cmd.CommandText, "#D1");
-#endif
-                               Assert.AreSame (conn, cmd.Connection, "#D2");
-                               AssertInsertParameters (cmd, false, "#D3:");
+                               Assert.AreSame (cmd, cb.GetInsertCommand (), "#C4");
                        } finally {
                                if (cmd != null)
                                        cmd.Dispose ();
@@ -254,17 +236,64 @@ namespace MonoTests.System.Data
                                        "[fname] = @p2, [lname] = @p3 WHERE (([id] = @p4) " +
                                        "AND ([fname] = @p5) AND ((@p6 = 1 " +
                                        "AND [lname] IS NULL) OR ([lname] = @p7)))",
-                                       cmd.CommandText, "#1");
+                                       cmd.CommandText, "#A1");
 #else
                                Assert.AreEqual ("UPDATE employee SET id = @p1 , " +
                                        "fname = @p2 , lname = @p3 WHERE ( (id = @p4) " +
                                        "AND ((@p5 = 1 AND fname IS NULL) OR " +
                                        "(fname = @p6)) AND ((@p7 = 1 AND " +
                                        "lname IS NULL) OR (lname = @p8)) )",
-                                       cmd.CommandText, "#1");
+                                       cmd.CommandText, "#A1");
 #endif
-                               Assert.AreSame (conn, cmd.Connection, "#2");
-                               AssertUpdateParameters (cmd, false, "#3:");
+                               Assert.AreSame (conn, cmd.Connection, "#A2");
+                               AssertUpdateParameters (cmd, false, "#A3:");
+                               Assert.AreSame (cmd, cb.GetUpdateCommand (), "#A4");
+
+                               cb.RefreshSchema ();
+                               cb.QuotePrefix = "\"";
+                               cmd = cb.GetUpdateCommand ();
+#if NET_2_0
+                               Assert.AreEqual ("UPDATE \"employee] SET \"id] = @p1, " +
+                                       "\"fname] = @p2, \"lname] = @p3 WHERE ((\"id] = @p4) " +
+                                       "AND (\"fname] = @p5) AND ((@p6 = 1 " +
+                                       "AND \"lname] IS NULL) OR (\"lname] = @p7)))",
+                                       cmd.CommandText, "#B1");
+#else
+                               Assert.AreEqual ("UPDATE \"employee SET \"id = @p1 , " +
+                                       "\"fname = @p2 , \"lname = @p3 WHERE ( (\"id = @p4) " +
+                                       "AND ((@p5 = 1 AND \"fname IS NULL) OR " +
+                                       "(\"fname = @p6)) AND ((@p7 = 1 AND " +
+                                       "\"lname IS NULL) OR (\"lname = @p8)) )",
+                                       cmd.CommandText, "#B1");
+#endif
+                               Assert.AreSame (conn, cmd.Connection, "#B2");
+                               AssertUpdateParameters (cmd, false, "#B3:");
+                               Assert.AreSame (cmd, cb.GetUpdateCommand (), "#B4");
+
+                               cb.RefreshSchema ();
+#if NET_2_0
+                               cb.QuoteSuffix = "\"";
+#else
+                               cb.QuoteSuffix = "´";
+#endif
+                               cmd = cb.GetUpdateCommand ();
+#if NET_2_0
+                               Assert.AreEqual ("UPDATE \"employee\" SET \"id\" = @p1, " +
+                                       "\"fname\" = @p2, \"lname\" = @p3 WHERE ((\"id\" = @p4) " +
+                                       "AND (\"fname\" = @p5) AND ((@p6 = 1 " +
+                                       "AND \"lname\" IS NULL) OR (\"lname\" = @p7)))",
+                                       cmd.CommandText, "#C1");
+#else
+                               Assert.AreEqual ("UPDATE \"employee´ SET \"id´ = @p1 , " +
+                                       "\"fname´ = @p2 , \"lname´ = @p3 WHERE ( (\"id´ = @p4) " +
+                                       "AND ((@p5 = 1 AND \"fname´ IS NULL) OR " +
+                                       "(\"fname´ = @p6)) AND ((@p7 = 1 AND " +
+                                       "\"lname´ IS NULL) OR (\"lname´ = @p8)) )",
+                                       cmd.CommandText, "#C1");
+#endif
+                               Assert.AreSame (conn, cmd.Connection, "#C2");
+                               AssertUpdateParameters (cmd, false, "#C3:");
+                               Assert.AreSame (cmd, cb.GetUpdateCommand (), "#C4");
                        } finally {
                                if (cmd != null)
                                        cmd.Dispose ();
@@ -622,16 +651,61 @@ namespace MonoTests.System.Data
                                Assert.AreEqual ("DELETE FROM [employee] WHERE " +
                                        "(([id] = @p1) AND ([fname] = @p2) AND " +
                                        "((@p3 = 1 AND [lname] IS NULL) OR " +
-                                       "([lname] = @p4)))", cmd.CommandText, "#1");
+                                       "([lname] = @p4)))", cmd.CommandText, "#A1");
 #else
                                Assert.AreEqual ("DELETE FROM  employee WHERE ( " +
                                        "(id = @p1) AND ((@p2 = 1 AND fname IS NULL) " +
                                        "OR (fname = @p3)) AND ((@p4 = 1 AND " +
                                        "lname IS NULL) OR (lname = @p5)) )",
-                                       cmd.CommandText, "#1");
+                                       cmd.CommandText, "#A1");
 #endif
-                               Assert.AreSame (conn, cmd.Connection, "#2");
-                               AssertDeleteParameters (cmd, false, "#3:");
+                               Assert.AreSame (conn, cmd.Connection, "#A2");
+                               AssertDeleteParameters (cmd, false, "#A3:");
+                               Assert.AreSame (cmd, cb.GetDeleteCommand (), "#A4");
+
+                               cb.RefreshSchema ();
+                               cb.QuotePrefix = "\"";
+                               cmd = cb.GetDeleteCommand ();
+
+#if NET_2_0
+                               Assert.AreEqual ("DELETE FROM \"employee] WHERE " +
+                                       "((\"id] = @p1) AND (\"fname] = @p2) AND " +
+                                       "((@p3 = 1 AND \"lname] IS NULL) OR " +
+                                       "(\"lname] = @p4)))", cmd.CommandText, "#B1");
+#else
+                               Assert.AreEqual ("DELETE FROM  \"employee WHERE ( " +
+                                       "(\"id = @p1) AND ((@p2 = 1 AND \"fname IS NULL) " +
+                                       "OR (\"fname = @p3)) AND ((@p4 = 1 AND " +
+                                       "\"lname IS NULL) OR (\"lname = @p5)) )",
+                                       cmd.CommandText, "#B1");
+#endif
+                               Assert.AreSame (conn, cmd.Connection, "#B2");
+                               AssertDeleteParameters (cmd, false, "#B3:");
+                               Assert.AreSame (cmd, cb.GetDeleteCommand (), "#B4");
+
+                               cb.RefreshSchema ();
+#if NET_2_0
+                               cb.QuoteSuffix = "\"";
+#else
+                               cb.QuoteSuffix = "´";
+#endif
+                               cmd = cb.GetDeleteCommand ();
+
+#if NET_2_0
+                               Assert.AreEqual ("DELETE FROM \"employee\" WHERE " +
+                                       "((\"id\" = @p1) AND (\"fname\" = @p2) AND " +
+                                       "((@p3 = 1 AND \"lname\" IS NULL) OR " +
+                                       "(\"lname\" = @p4)))", cmd.CommandText, "#C1");
+#else
+                               Assert.AreEqual ("DELETE FROM  \"employee´ WHERE ( " +
+                                       "(\"id´ = @p1) AND ((@p2 = 1 AND \"fname´ IS NULL) " +
+                                       "OR (\"fname´ = @p3)) AND ((@p4 = 1 AND " +
+                                       "\"lname´ IS NULL) OR (\"lname´ = @p5)) )",
+                                       cmd.CommandText, "#C1");
+#endif
+                               Assert.AreSame (conn, cmd.Connection, "#C2");
+                               AssertDeleteParameters (cmd, false, "#C3:");
+                               Assert.AreSame (cmd, cb.GetDeleteCommand (), "#C4");
                        } finally {
                                if (cmd != null)
                                        cmd.Dispose ();
@@ -734,6 +808,7 @@ namespace MonoTests.System.Data
                                        "@Original_lname)))", cmd.CommandText, "#A1");
                                Assert.AreSame (conn, cmd.Connection, "#A2");
                                AssertDeleteParameters (cmd, true, "#A3:");
+                               Assert.AreSame (cmd, cb.GetDeleteCommand (true), "#A4");
 
                                cmd = cb.GetDeleteCommand (false);
                                Assert.AreEqual ("DELETE FROM [employee] WHERE " +
@@ -743,6 +818,7 @@ namespace MonoTests.System.Data
                                        "@Original_lname)))", cmd.CommandText, "#B1");
                                Assert.AreSame (conn, cmd.Connection, "#B2");
                                AssertDeleteParameters (cmd, true, "#B3:");
+                               Assert.AreSame (cmd, cb.GetDeleteCommand (false), "#B4");
 
                                cb = new SqlCommandBuilder (da);
                                cmd = cb.GetDeleteCommand (false);
@@ -752,6 +828,7 @@ namespace MonoTests.System.Data
                                        "([lname] = @p4)))", cmd.CommandText, "#C1");
                                Assert.AreSame (conn, cmd.Connection, "#C2");
                                AssertDeleteParameters (cmd, false, "#C3:");
+                               Assert.AreSame (cmd, cb.GetDeleteCommand (false), "#C4");
 
                                cmd = cb.GetDeleteCommand (true);
                                Assert.AreEqual ("DELETE FROM [employee] WHERE " +
@@ -761,7 +838,7 @@ namespace MonoTests.System.Data
                                        "@Original_lname)))", cmd.CommandText, "#D1");
                                Assert.AreSame (conn, cmd.Connection, "#D2");
                                AssertDeleteParameters (cmd, true, "#D3:");
-
+                               Assert.AreSame (cmd, cb.GetDeleteCommand (false), "#D4");
                        } finally {
                                if (cmd != null)
                                        cmd.Dispose ();
index c6eb98b7ac6126eb2f62b5edc24627c761cc7460..db6ea6aecf3b41eee2c80b764cafdf963434edb7 100644 (file)
@@ -464,9 +464,12 @@ namespace MonoTests.System.Data.SqlClient
                        }
 #else
                        try {
-                               reader.GetBytes (0,0,null,0,0);
+                               reader.GetBytes (0, 0, null, 0, 0);
                                Assert.Fail ("#1");
-                       }catch (InvalidCastException) {
+                       }catch (InvalidCastException ex) {
+                               Assert.AreEqual (typeof (InvalidCastException), ex.GetType (), "#2");
+                               Assert.IsNull (ex.InnerException, "#3");
+                               Assert.AreEqual ((new InvalidCastException ()).Message, ex.Message, "#4");
                        } finally {
                                reader.Close ();
                        }
@@ -807,6 +810,7 @@ namespace MonoTests.System.Data.SqlClient
                                int offset = 0;
                                long ret = 0;
                                long count = 0;
+
                                do {
                                        ret = reader.GetBytes (0, offset, val, offset, 50);
                                        offset += (int) ret;
@@ -819,10 +823,10 @@ namespace MonoTests.System.Data.SqlClient
                }
 
                [Test]
-               public void GetBytes_Binary ()
+               public void GetBytes_Type_Binary ()
                {
-                       cmd.CommandText = "Select type_binary,type_varbinary,type_blob ";
-                       cmd.CommandText += "from binary_family where id=1";
+                       cmd.CommandText = "Select type_binary, type_varbinary, " +
+                               "type_blob from binary_family where id = 1";
                        reader = cmd.ExecuteReader ();
                        reader.Read ();
                        byte[] binary = (byte[])reader.GetValue (0);
@@ -875,6 +879,282 @@ namespace MonoTests.System.Data.SqlClient
                        reader.Close ();
                }
 
+               [Test]
+               public void GetBytes_Type_DateTime ()
+               {
+                       cmd.CommandText = "SELECT type_datetime FROM datetime_family where id = 1";
+
+                       using (IDataReader reader = cmd.ExecuteReader (CommandBehavior.SequentialAccess)) {
+                               Assert.IsTrue (reader.Read ());
+
+                               try {
+                                       reader.GetBytes (0, 0, null, 0, 0);
+                                       Assert.Fail ("#A1");
+                               } catch (InvalidCastException ex) {
+                                       // Invalid attempt to GetBytes on column
+                                       // 'type_datetime'.
+                                       // The GetBytes function can only be used
+                                       // on columns of type Text, NText, or Image
+                                       Assert.AreEqual (typeof (InvalidCastException), ex.GetType (), "#A2");
+                                       Assert.IsNull (ex.InnerException, "#A3");
+                                       Assert.IsNotNull (ex.Message, "#A4");
+                                       Assert.IsTrue (ex.Message.IndexOf ("'type_datetime'") != -1, "#A5:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("GetBytes") != -1, "#A6:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("Text") != -1, "#A7:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("NText") != -1, "#A8:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("Image") != -1, "#A9:" + ex.Message);
+                               }
+                       }
+
+                       using (IDataReader reader = cmd.ExecuteReader ()) {
+                               Assert.IsTrue (reader.Read ());
+
+                               try {
+                                       reader.GetBytes (0, 0, null, 0, 0);
+                                       Assert.Fail ("#B1");
+                               } catch (InvalidCastException ex) {
+                                       // Invalid attempt to GetBytes on column
+                                       // 'type_datetime'.
+                                       // The GetBytes function can only be used
+                                       // on columns of type Text, NText, or Image
+                                       Assert.AreEqual (typeof (InvalidCastException), ex.GetType (), "#B2");
+                                       Assert.IsNull (ex.InnerException, "#B3");
+                                       Assert.IsNotNull (ex.Message, "#B4");
+                                       Assert.IsTrue (ex.Message.IndexOf ("'type_datetime'") != -1, "#B5:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("GetBytes") != -1, "#B6:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("Text") != -1, "#B7:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("NText") != -1, "#B8:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("Image") != -1, "#B9:" + ex.Message);
+                               }
+                       }
+
+                       cmd.CommandText = "SELECT type_datetime FROM datetime_family where id = 4";
+
+                       using (IDataReader reader = cmd.ExecuteReader (CommandBehavior.SequentialAccess)) {
+                               Assert.IsTrue (reader.Read ());
+
+                               try {
+                                       reader.GetBytes (0, 0, null, 0, 0);
+                                       Assert.Fail ("#C1");
+                               } catch (InvalidCastException ex) {
+                                       // Invalid attempt to GetBytes on column
+                                       // 'type_datetime'.
+                                       // The GetBytes function can only be used
+                                       // on columns of type Text, NText, or Image
+                                       Assert.AreEqual (typeof (InvalidCastException), ex.GetType (), "#C2");
+                                       Assert.IsNull (ex.InnerException, "#C3");
+                                       Assert.IsNotNull (ex.Message, "#C4");
+                                       Assert.IsTrue (ex.Message.IndexOf ("'type_datetime'") != -1, "#C5:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("GetBytes") != -1, "#C6:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("Text") != -1, "#C7:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("NText") != -1, "#C8:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("Image") != -1, "#C9:" + ex.Message);
+                               }
+                       }
+
+                       using (IDataReader reader = cmd.ExecuteReader ()) {
+                               Assert.IsTrue (reader.Read ());
+
+                               try {
+                                       reader.GetBytes (0, 0, null, 0, 0);
+                                       Assert.Fail ("#D1");
+                               } catch (InvalidCastException ex) {
+                                       // Invalid attempt to GetBytes on column
+                                       // 'type_datetime'.
+                                       // The GetBytes function can only be used
+                                       // on columns of type Text, NText, or Image
+                                       Assert.AreEqual (typeof (InvalidCastException), ex.GetType (), "#D2");
+                                       Assert.IsNull (ex.InnerException, "#D3");
+                                       Assert.IsNotNull (ex.Message, "#D4");
+                                       Assert.IsTrue (ex.Message.IndexOf ("'type_datetime'") != -1, "#D5:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("GetBytes") != -1, "#D6:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("Text") != -1, "#D7:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("NText") != -1, "#D8:" + ex.Message);
+                                       Assert.IsTrue (ex.Message.IndexOf ("Image") != -1, "#D9:" + ex.Message);
+                               }
+                       }
+               }
+
+               [Test]
+               public void GetBytes_Type_Text ()
+               {
+                       long len;
+                       byte [] buffer;
+                       byte [] expected;
+
+                       cmd.CommandText = "SELECT type_text FROM string_family order by id asc";
+
+                       using (IDataReader reader = cmd.ExecuteReader (CommandBehavior.SequentialAccess)) {
+                               expected = new byte [] { 0x74, 0x65, 0x78,
+                                       0x74 };
+
+                               Assert.IsTrue (reader.Read (), "#A1");
+                               len = reader.GetBytes (0, 0, null, 0, 0);
+                               Assert.AreEqual (4, len, "#A2");
+                               buffer = new byte [len];
+                               len = reader.GetBytes (0, 0, buffer, 0, (int) len);
+                               Assert.AreEqual (4, len, "#A3");
+                               Assert.AreEqual (expected, buffer, "#A4");
+
+                               expected = new byte [] { 0x00, 0x00, 0x6f, 0x6e,
+                                       0x67, 0x00 };
+
+                               Assert.IsTrue (reader.Read (), "#B1");
+                               len = reader.GetBytes (0, 0, null, 0, 0);
+                               Assert.AreEqual (270, len, "#B2");
+                               buffer = new byte [6];
+                               len = reader.GetBytes (0, 1, buffer, 2, 3);
+                               Assert.AreEqual (3, len, "#B3");
+                               Assert.AreEqual (expected, buffer, "#B4");
+
+                               expected = new byte [0];
+
+                               Assert.IsTrue (reader.Read (), "#C1");
+                               len = reader.GetBytes (0, 0, null, 0, 0);
+                               Assert.AreEqual (0, len, "#C2");
+                               buffer = new byte [len];
+                               len = reader.GetBytes (0, 0, buffer, 0, 0);
+                               Assert.AreEqual (0, len, "#C3");
+                               Assert.AreEqual (expected, buffer, "#C4");
+
+                               Assert.IsTrue (reader.Read (), "#D1");
+#if NET_2_0
+                               try {
+                                       reader.GetBytes (0, 0, null, 0, 0);
+                                       Assert.Fail ("#D2");
+                               } catch (SqlNullValueException) {
+                               }
+#else
+                               len = reader.GetBytes (0, 0, null, 0, 0);
+                               Assert.AreEqual (0, len, "#D2");
+#endif
+                       }
+
+                       using (IDataReader reader = cmd.ExecuteReader ()) {
+                               expected = new byte [] { 0x74, 0x65, 0x78,
+                                       0x74 };
+
+                               Assert.IsTrue (reader.Read (), "#E1");
+#if NET_2_0
+                               len = reader.GetBytes (0, 0, null, 0, 0);
+                               Assert.AreEqual (4, len, "#E2");
+                               buffer = new byte [len];
+                               len = reader.GetBytes (0, 0, buffer, 0, (int) len);
+                               Assert.AreEqual (4, len, "#E3");
+                               Assert.AreEqual (expected, buffer, "#E4");
+#else
+                               try {
+                                       reader.GetBytes (0, 0, null, 0, 0);
+                                       Assert.Fail ("#E2");
+                               } catch (InvalidCastException ex) {
+                                       Assert.AreEqual (typeof (InvalidCastException), ex.GetType (), "#E3");
+                                       Assert.IsNull (ex.InnerException, "#E4");
+                                       Assert.AreEqual ((new InvalidCastException ()).Message, ex.Message, "#E5");
+                               }
+#endif
+
+                               expected = new byte [] { 0x00, 0x00, 0x6f, 0x6e,
+                                       0x67, 0x00 };
+
+                               Assert.IsTrue (reader.Read (), "#F1");
+#if NET_2_0
+                               len = reader.GetBytes (0, 0, null, 0, 0);
+                               Assert.AreEqual (270, len, "#F2");
+                               buffer = new byte [6];
+                               len = reader.GetBytes (0, 1, buffer, 2, 3);
+                               Assert.AreEqual (3, len, "#F3");
+                               Assert.AreEqual (expected, buffer, "#F4");
+#else
+                               try {
+                                       reader.GetBytes (0, 0, null, 0, 0);
+                                       Assert.Fail ("#F2");
+                               } catch (InvalidCastException ex) {
+                                       Assert.AreEqual (typeof (InvalidCastException), ex.GetType (), "#F3");
+                                       Assert.IsNull (ex.InnerException, "#F4");
+                                       Assert.AreEqual ((new InvalidCastException ()).Message, ex.Message, "#F5");
+                               }
+#endif
+
+                               expected = new byte [0];
+
+                               Assert.IsTrue (reader.Read (), "#G1");
+#if NET_2_0
+                               len = reader.GetBytes (0, 0, null, 0, 0);
+                               Assert.AreEqual (0, len, "#G2");
+                               buffer = new byte [len];
+                               len = reader.GetBytes (0, 0, buffer, 0, 0);
+                               Assert.AreEqual (0, len, "#G3");
+                               Assert.AreEqual (expected, buffer, "#G4");
+#else
+                               try {
+                                       reader.GetBytes (0, 0, null, 0, 0);
+                                       Assert.Fail ("#G2");
+                               } catch (InvalidCastException ex) {
+                                       Assert.AreEqual (typeof (InvalidCastException), ex.GetType (), "#G3");
+                                       Assert.IsNull (ex.InnerException, "#G4");
+                                       Assert.AreEqual ((new InvalidCastException ()).Message, ex.Message, "#G5");
+                               }
+#endif
+
+                               Assert.IsTrue (reader.Read (), "#H1");
+#if NET_2_0
+                               try {
+                                       reader.GetBytes (0, 0, new byte [0], 0, 0);
+                                       Assert.Fail ("#H2");
+                               } catch (NullReferenceException) {
+                               }
+                               try {
+                                       reader.GetBytes (0, 0, null, 0, 0);
+                                       Assert.Fail ("#H3");
+                               } catch (NullReferenceException) {
+                               }
+#else
+                               try {
+                                       reader.GetBytes (0, 0, null, 0, 3);
+                                       Assert.Fail ("#H2");
+                               } catch (InvalidCastException ex) {
+                                       Assert.AreEqual (typeof (InvalidCastException), ex.GetType (), "#H3");
+                                       Assert.IsNull (ex.InnerException, "#H4");
+                                       Assert.AreEqual ((new InvalidCastException ()).Message, ex.Message, "#H5");
+                               }
+#endif
+                       }
+               }
+
+               [Test]
+               public void GetChar ()
+               {
+                       cmd.CommandText = "SELECT type_char FROM string_family where id = 1";
+
+                       using (IDataReader reader = cmd.ExecuteReader (CommandBehavior.SequentialAccess)) {
+                               Assert.IsTrue (reader.Read ());
+
+                               try {
+                                       reader.GetChar (0);
+                                       Assert.Fail ("#A1");
+                               } catch (NotSupportedException ex) {
+                                       Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#A2");
+                                       Assert.IsNull (ex.InnerException, "#A3");
+                                       Assert.IsNotNull (ex.Message, "#A4");
+                                       Assert.AreEqual ((new NotSupportedException ()).Message, ex.Message, "#A5");
+                               }
+                       }
+
+                       using (IDataReader reader = cmd.ExecuteReader ()) {
+                               Assert.IsTrue (reader.Read ());
+
+                               try {
+                                       reader.GetChar (0);
+                                       Assert.Fail ("#B1");
+                               } catch (NotSupportedException ex) {
+                                       Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#B2");
+                                       Assert.IsNull (ex.InnerException, "#B3");
+                                       Assert.IsNotNull (ex.Message, "#B4");
+                                       Assert.AreEqual ((new NotSupportedException ()).Message, ex.Message, "#B5");
+                               }
+                       }
+               }
+
                [Test]
                public void GetChars ()
                {