OdbcDataReaderTest.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. //
  2. // OdbcDataReaderTest.cs - NUnit Test Cases for testing the
  3. // OdbcDataReader class
  4. //
  5. // Author:
  6. // Sureshkumar T ([email protected])
  7. //
  8. // Copyright (c) 2004 Novell Inc., and the individuals listed
  9. // on the ChangeLog entries.
  10. //
  11. // Permission is hereby granted, free of charge, to any person obtaining
  12. // a copy of this software and associated documentation files (the
  13. // "Software"), to deal in the Software without restriction, including
  14. // without limitation the rights to use, copy, modify, merge, publish,
  15. // distribute, sublicense, and/or sell copies of the Software, and to
  16. // permit persons to whom the Software is furnished to do so, subject to
  17. // the following conditions:
  18. //
  19. // The above copyright notice and this permission notice shall be
  20. // included in all copies or substantial portions of the Software.
  21. //
  22. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  23. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  24. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  25. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  26. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  27. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29. //
  30. using System;
  31. using System.Text;
  32. using System.Data;
  33. using System.Data.Common;
  34. using System.Data.Odbc;
  35. using Mono.Data;
  36. using NUnit.Framework;
  37. namespace MonoTests.System.Data
  38. {
  39. [TestFixture]
  40. [Category ("odbc")]
  41. public class OdbcDataReaderTest
  42. {
  43. [Test]
  44. public void OutputParametersTest ()
  45. {
  46. IDbConnection conn = ConnectionManager.Singleton.Connection;
  47. try {
  48. ConnectionManager.Singleton.OpenConnection ();
  49. IDbCommand cmd = conn.CreateCommand ();
  50. cmd.CommandText = "call {? = sp_get_age (?,?)}";
  51. OdbcParameter ret = (OdbcParameter) new OdbcParameter ("ret", OdbcType.Int);
  52. cmd.Parameters.Add (ret);
  53. ret.Direction = ParameterDirection.ReturnValue;
  54. OdbcParameter name = (OdbcParameter) new OdbcParameter ("name", OdbcType.VarChar);
  55. cmd.Parameters.Add (name);
  56. name.Direction = ParameterDirection.Input;
  57. name.Value = "suresh";
  58. OdbcParameter age = (OdbcParameter) new OdbcParameter ("age", OdbcType.Int);
  59. cmd.Parameters.Add (age);
  60. name.Direction = ParameterDirection.Output;
  61. IDataReader reader = cmd.ExecuteReader ();
  62. reader.Close ();
  63. Assert.AreEqual (true, ((int) ret.Value) > 0, "#1");
  64. } finally {
  65. ConnectionManager.Singleton.CloseConnection ();
  66. }
  67. }
  68. [Test]
  69. public void LongTextTest ()
  70. {
  71. IDbConnection conn = new OdbcConnection (
  72. ConnectionManager.Singleton.ConnectionString);
  73. IDataReader rdr = null;
  74. try {
  75. conn.Open ();
  76. IDbCommand cmd = conn.CreateCommand ();
  77. cmd.CommandText = "Select type_text";
  78. cmd.CommandText += " from string_family where id=3";
  79. rdr = cmd.ExecuteReader ();
  80. rdr.Read ();
  81. rdr.GetValue (0);
  82. }finally {
  83. if (rdr != null)
  84. rdr.Close ();
  85. conn.Close ();
  86. }
  87. }
  88. [Test]
  89. public void Bug82135Test ()
  90. {
  91. IDbConnection conn = new OdbcConnection (
  92. ConnectionManager.Singleton.ConnectionString);
  93. try {
  94. conn.Open ();
  95. OdbcCommand cmd = new OdbcCommand ("create table odbcnodatatest (ID int not null, Val1 text)",
  96. (OdbcConnection) conn);
  97. cmd.ExecuteNonQuery ();
  98. cmd = new OdbcCommand ("delete from odbcnodatatest", (OdbcConnection) conn);
  99. Assert.AreEqual (0, cmd.ExecuteNonQuery ());
  100. cmd = new OdbcCommand ("drop table odbcnodatatest", (OdbcConnection) conn);
  101. cmd.ExecuteNonQuery ();
  102. }finally {
  103. conn.Close ();
  104. }
  105. }
  106. private static void DoExecuteNonQuery (OdbcConnection conn, string sql) {
  107. OdbcCommand cmd = new OdbcCommand (sql, conn);
  108. cmd.ExecuteNonQuery();
  109. }
  110. private static void DoExecuteScalar(OdbcConnection conn, string sql) {
  111. OdbcCommand cmd = new OdbcCommand (sql, conn);
  112. cmd.ExecuteScalar();
  113. }
  114. [Test]
  115. public void Bug82560Test ()
  116. {
  117. IDbConnection conn = new OdbcConnection (
  118. ConnectionManager.Singleton.ConnectionString);
  119. try {
  120. conn.Open ();
  121. DoExecuteNonQuery ((OdbcConnection) conn, "CREATE TABLE odbc_alias_test" +
  122. "(ifld INT NOT NULL PRIMARY KEY, sfld VARCHAR(20))");
  123. DoExecuteNonQuery ((OdbcConnection) conn, "INSERT INTO odbc_alias_test" +
  124. "(ifld, sfld) VALUES (1, '1111')");
  125. DoExecuteScalar ((OdbcConnection) conn, "SELECT A.ifld FROM odbc_alias_test " +
  126. "A WHERE A.ifld = 1");
  127. DoExecuteNonQuery ((OdbcConnection) conn, "DROP TABLE odbc_alias_test");
  128. }finally {
  129. conn.Close ();
  130. }
  131. }
  132. [Test]
  133. public void FindZeroInToStringTest ()
  134. {
  135. IDbConnection conn = ConnectionManager.Singleton.Connection;
  136. IDataReader reader = null;
  137. try {
  138. ConnectionManager.Singleton.OpenConnection ();
  139. IDbCommand OdbcCmd = conn.CreateCommand ();
  140. OdbcCmd.CommandType = CommandType.Text;
  141. OdbcCmd.CommandText = "Drop table foo";
  142. try {
  143. OdbcCmd.ExecuteNonQuery ();
  144. } catch (OdbcException e) {
  145. Assert.Fail ("Exception thrown: " + e.Message);
  146. }
  147. // Create table
  148. OdbcCmd.CommandText = "Create table foo ( bar long varchar )";
  149. OdbcCmd.ExecuteNonQuery();
  150. // Insert a record into foo
  151. OdbcCmd.CommandText = "Insert into foo (bar) values ( '"
  152. + "This string has more than 255 characters"
  153. + "This string has more than 255 characters"
  154. + "This string has more than 255 characters"
  155. + "This string has more than 255 characters"
  156. + "This string has more than 255 characters"
  157. + "This string has more than 255 characters"
  158. + "This string has more than 255 characters"
  159. + "This string has more than 255 characters"
  160. + "This string has more than 255 characters"
  161. + "This string has more than 255 characters"
  162. + "This string has more than 255 characters"
  163. + "This string has more than 255 characters"
  164. + "This string has more than 255 characters"
  165. + "This string has more than 255 characters"
  166. + "This string has more than 255 characters"
  167. + "This string has more than 255 characters"
  168. + "This string has more than 255 characters"
  169. + "This string has more than 255 characters"
  170. + "This string has more than 255 characters"
  171. + "This string has more than 255 characters"
  172. + "This string has more than 255 characters"
  173. + "This string has more than 255 characters"
  174. + "This string has more than 255 characters"
  175. + "This string has more than 255 characters"
  176. + "' )";
  177. OdbcCmd.ExecuteNonQuery();
  178. // Now, get the record back - try and read it two different ways.
  179. OdbcCmd.CommandText = "SELECT bar FROM foo" ;
  180. reader = OdbcCmd.ExecuteReader ();
  181. string readAsString = "";
  182. while (reader.Read ()) {
  183. readAsString = reader[0].ToString();
  184. }
  185. reader.Close();
  186. // Now, read it using GetBytes
  187. reader = OdbcCmd.ExecuteReader ();
  188. byte[] buffer = new byte [2048];
  189. long total = 0;
  190. while (reader.Read ()) {
  191. total = reader.GetBytes (0, 0, buffer, 0, 2048);
  192. }
  193. reader.Close();
  194. // Convert bytes read to string - look for binary zero - there is none (OK)
  195. string readAsBytes = Encoding.Default.GetString (buffer, 0, (int) total);
  196. Assert.AreEqual (readAsBytes, readAsString, "#1 ReadAsString is not same as ReadAsBytes");
  197. } finally {
  198. if (reader != null)
  199. reader.Close ();
  200. ConnectionManager.Singleton.CloseConnection ();
  201. }
  202. }
  203. #if NET_2_0
  204. [Test]
  205. public void GetDataTypeNameTest ()
  206. {
  207. IDbConnection conn = ConnectionManager.Singleton.Connection;
  208. IDataReader reader = null;
  209. try {
  210. ConnectionManager.Singleton.OpenConnection ();
  211. IDbCommand OdbcCmd = conn.CreateCommand ();
  212. OdbcCmd.CommandText = "SELECT * FROM employee WHERE lname='kumar'";
  213. reader = OdbcCmd.ExecuteReader ();
  214. Assert.AreEqual ("integer", reader.GetDataTypeName (0), "#1 GetDataTypeName should return integer not Int");
  215. Assert.AreEqual ("varchar", reader.GetDataTypeName (2), "#2 GetDataTypeName should return varchar not VarChar");
  216. Assert.AreEqual ("datetime", reader.GetDataTypeName (4), "#3 GetDataTypeName should return datetime not DateTime");
  217. } finally {
  218. if (reader != null)
  219. reader.Close ();
  220. ConnectionManager.Singleton.CloseConnection ();
  221. }
  222. }
  223. [Test]
  224. public void GetDataTypeNameIndexOutOfRangeExceptionTest ()
  225. {
  226. IDbConnection conn = ConnectionManager.Singleton.Connection;
  227. IDataReader reader = null;
  228. try {
  229. ConnectionManager.Singleton.OpenConnection ();
  230. IDbCommand OdbcCmd = conn.CreateCommand ();
  231. OdbcCmd.CommandText = "SELECT * FROM employee WHERE lname='kumar'";
  232. reader = OdbcCmd.ExecuteReader ();
  233. try {
  234. /*string tmp = */reader.GetDataTypeName (6);
  235. } catch (IndexOutOfRangeException) {
  236. return;
  237. } Assert.Fail ("Expected Exception IndexOutOfRangeException not thrown");
  238. } finally {
  239. if (reader != null)
  240. reader.Close ();
  241. ConnectionManager.Singleton.CloseConnection ();
  242. }
  243. }
  244. [Test]
  245. public void GetOrdinalTest ()
  246. {
  247. IDbConnection conn = ConnectionManager.Singleton.Connection;
  248. IDataReader reader = null;
  249. try {
  250. ConnectionManager.Singleton.OpenConnection ();
  251. IDbCommand OdbcCmd = conn.CreateCommand ();
  252. OdbcCmd.CommandText = "SELECT * FROM employee WHERE lname='kumar'";
  253. reader = OdbcCmd.ExecuteReader ();
  254. Assert.AreEqual (0, reader.GetOrdinal ("id"), "#1 First column should be id");
  255. Assert.AreEqual (1, reader.GetOrdinal ("fname"), "#2 Second column should fname");
  256. Assert.AreEqual (2, reader.GetOrdinal ("lname"), "#3 Third column should lname");
  257. Assert.AreEqual (3, reader.GetOrdinal ("dob"), "#4 Fourth column should dob");
  258. Assert.AreEqual (4, reader.GetOrdinal ("doj"), "#5 Fifth column should doj");
  259. Assert.AreEqual (5, reader.GetOrdinal ("email"), "#6 Sixth column should email");
  260. } finally {
  261. if (reader != null)
  262. reader.Close ();
  263. ConnectionManager.Singleton.CloseConnection ();
  264. }
  265. }
  266. [Test]
  267. public void GetOrdinalIndexOutOfRangeExceptionTest ()
  268. {
  269. IDbConnection conn = ConnectionManager.Singleton.Connection;
  270. IDataReader reader = null;
  271. try {
  272. ConnectionManager.Singleton.OpenConnection ();
  273. IDbCommand OdbcCmd = conn.CreateCommand ();
  274. OdbcCmd.CommandText = "SELECT * FROM employee WHERE lname='kumar'";
  275. reader = OdbcCmd.ExecuteReader ();
  276. try {
  277. /*int ord = */reader.GetOrdinal ("non_existing_column");
  278. } catch (IndexOutOfRangeException){
  279. return;
  280. } Assert.Fail("Expected Exception IndexOutOfRangeException not thrown");
  281. } finally {
  282. if (reader != null)
  283. reader.Close ();
  284. ConnectionManager.Singleton.CloseConnection ();
  285. }
  286. }
  287. [Test]
  288. public void GetFieldTypeTest ()
  289. {
  290. IDbConnection conn = ConnectionManager.Singleton.Connection;
  291. IDataReader reader = null;
  292. try {
  293. ConnectionManager.Singleton.OpenConnection ();
  294. IDbCommand OdbcCmd = conn.CreateCommand ();
  295. OdbcCmd.CommandText = "SELECT * FROM employee WHERE lname='kumar'";
  296. reader = OdbcCmd.ExecuteReader ();
  297. Assert.AreEqual (typeof(int), reader.GetFieldType (0), "#1 Field type is not Integer");
  298. Assert.AreEqual (typeof(string), reader.GetFieldType (2), "#2 Field type is not Varchar");
  299. Assert.AreEqual (typeof(DateTime), reader.GetFieldType (4), "#3 Field type is not DateTime");
  300. } finally {
  301. if (reader != null)
  302. reader.Close ();
  303. ConnectionManager.Singleton.CloseConnection ();
  304. }
  305. }
  306. [Test]
  307. public void GetFieldTypeIndexOutOfRangeExceptionTest ()
  308. {
  309. IDbConnection conn = ConnectionManager.Singleton.Connection;
  310. IDataReader reader = null;;
  311. try {
  312. ConnectionManager.Singleton.OpenConnection ();
  313. IDbCommand OdbcCmd = conn.CreateCommand ();
  314. OdbcCmd.CommandText = "SELECT * FROM employee WHERE lname='kumar'";
  315. reader = OdbcCmd.ExecuteReader ();
  316. try {
  317. /*String tmp = */reader.GetFieldType (6).ToString ();
  318. } catch (IndexOutOfRangeException){
  319. return;
  320. } Assert.Fail("Expected Exception IndexOutOfRangeException not thrown");
  321. } finally {
  322. if (reader != null)
  323. reader.Close ();
  324. ConnectionManager.Singleton.CloseConnection ();
  325. }
  326. }
  327. [Test]
  328. public void GetNameTest ()
  329. {
  330. IDbConnection conn = ConnectionManager.Singleton.Connection;
  331. IDataReader reader = null;
  332. try {
  333. ConnectionManager.Singleton.OpenConnection ();
  334. IDbCommand OdbcCmd = conn.CreateCommand ();
  335. OdbcCmd.CommandText = "SELECT * FROM employee WHERE lname='kumar'";
  336. reader = OdbcCmd.ExecuteReader ();
  337. Assert.AreEqual ("id", reader.GetName (0), "#1 First column is not id");
  338. Assert.AreEqual ("fname", reader.GetName (1), "#2 Second column is not fname");
  339. Assert.AreEqual ("lname", reader.GetName (2), "#3 Third column is not lname");
  340. Assert.AreEqual ("dob", reader.GetName (3), "#4 Fourth column is not dob");
  341. Assert.AreEqual ("doj", reader.GetName (4), "#5 Fifth column is not doj");
  342. Assert.AreEqual ("email", reader.GetName (5), "#6 Sixth column is not email");
  343. } finally {
  344. if (reader != null)
  345. reader.Close ();
  346. ConnectionManager.Singleton.CloseConnection ();
  347. }
  348. }
  349. [Test]
  350. public void GetNameIndexOutOfRangeExceptionTest ()
  351. {
  352. IDbConnection conn = ConnectionManager.Singleton.Connection;
  353. IDataReader reader = null;
  354. try {
  355. ConnectionManager.Singleton.OpenConnection ();
  356. IDbCommand OdbcCmd = conn.CreateCommand ();
  357. OdbcCmd.CommandText = "SELECT * FROM employee WHERE lname='kumar'";
  358. reader = OdbcCmd.ExecuteReader ();
  359. try {
  360. /*String tmp = */reader.GetName (6);
  361. } catch (IndexOutOfRangeException){
  362. return;
  363. } Assert.Fail("Expected Exception IndexOutOfRangeException not thrown");
  364. } finally {
  365. if (reader != null)
  366. reader.Close ();
  367. ConnectionManager.Singleton.CloseConnection ();
  368. }
  369. }
  370. #endif
  371. }
  372. }