OracleParameterTest.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. //
  2. // OracleParameterTest.cs -
  3. // NUnit Test Cases for OracleParameter
  4. //
  5. // Author:
  6. // Leszek Ciesielski <[email protected]>
  7. //
  8. // Copyright (C) 2006 Forcom (http://www.forcom.com.pl/)
  9. //
  10. // Permission is hereby granted, free of charge, to any person obtaining
  11. // a copy of this software and associated documentation files (the
  12. // "Software"), to deal in the Software without restriction, including
  13. // without limitation the rights to use, copy, modify, merge, publish,
  14. // distribute, sublicense, and/or sell copies of the Software, and to
  15. // permit persons to whom the Software is furnished to do so, subject to
  16. // the following conditions:
  17. //
  18. // The above copyright notice and this permission notice shall be
  19. // included in all copies or substantial portions of the Software.
  20. //
  21. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  22. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  23. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  24. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  25. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  26. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  27. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  28. //
  29. using System;
  30. using System.Configuration;
  31. using System.Data;
  32. using System.Data.OracleClient;
  33. using System.Globalization;
  34. using System.Threading;
  35. using NUnit.Framework;
  36. namespace MonoTests.System.Data.OracleClient
  37. {
  38. [TestFixture]
  39. public class OracleParameterTest
  40. {
  41. String connection_string;
  42. OracleConnection connection;
  43. OracleCommand command;
  44. // test string
  45. string test_value = " simply trim test ";
  46. string test_value2 = " simply trim test in query ";
  47. [TestFixtureSetUp]
  48. public void FixtureSetUp ()
  49. {
  50. connection_string = ConfigurationSettings.AppSettings.Get ("ConnectionString");
  51. }
  52. [SetUp]
  53. public void SetUp ()
  54. {
  55. if (connection_string == null)
  56. return;
  57. connection = new OracleConnection (connection_string);
  58. connection.Open ();
  59. using (command = connection.CreateCommand ()) {
  60. // create the tables
  61. command.CommandText =
  62. "create table oratest (id number(10), text varchar2(64),"
  63. + " text2 varchar2(64) )";
  64. command.ExecuteNonQuery ();
  65. command.CommandText =
  66. "create table culture_test (id number(10), value1 float,"
  67. + " value2 number(20,10), value3 number (20,10))";
  68. command.ExecuteNonQuery ();
  69. command.CommandText =
  70. "create table oratypes_test (id NUMBER(10), value1 VARCHAR2(100),"
  71. + " value2 DATE)";
  72. command.ExecuteNonQuery ();
  73. command.CommandText =
  74. "create or replace procedure params_pos_test (param1 in number,"
  75. + "param2 in number,param3 in number,result out number) as"
  76. + " begin result:=param3; end;";
  77. command.ExecuteNonQuery ();
  78. }
  79. }
  80. [TearDown]
  81. public void TearDown ()
  82. {
  83. if (connection_string == null)
  84. return;
  85. using (command = connection.CreateCommand ()) {
  86. command.CommandText = "drop table oratest";
  87. command.ExecuteNonQuery ();
  88. command.CommandText = "drop table culture_test";
  89. command.ExecuteNonQuery ();
  90. command.CommandText = "drop table oratypes_test";
  91. command.ExecuteNonQuery ();
  92. }
  93. connection.Close ();
  94. connection.Dispose ();
  95. }
  96. [Test] // ctor ()
  97. public void Constructor1 ()
  98. {
  99. OracleParameter param = new OracleParameter ();
  100. Assert.AreEqual (DbType.AnsiString, param.DbType, "#1");
  101. Assert.AreEqual (ParameterDirection.Input, param.Direction, "#2");
  102. Assert.IsFalse (param.IsNullable, "#3");
  103. Assert.AreEqual (OracleType.VarChar, param.OracleType, "#4");
  104. Assert.AreEqual (string.Empty, param.ParameterName, "#5");
  105. Assert.AreEqual ((byte) 0, param.Precision, "#6");
  106. Assert.AreEqual ((byte) 0, param.Scale, "#7");
  107. Assert.AreEqual (0, param.Size, "#8");
  108. Assert.AreEqual (string.Empty, param.SourceColumn, "#9");
  109. #if NET_2_0
  110. Assert.IsFalse (param.SourceColumnNullMapping, "#10");
  111. #endif
  112. Assert.AreEqual (DataRowVersion.Current, param.SourceVersion, "#11");
  113. Assert.IsNull (param.Value, "#12");
  114. }
  115. [Test] // ctor ()
  116. #if NET_2_0
  117. [Category ("NotWorking")] // #A8 fails
  118. #endif
  119. public void Constructor2 ()
  120. {
  121. OracleParameter param;
  122. param = new OracleParameter ("firstName", "Miguel");
  123. Assert.AreEqual (DbType.AnsiString, param.DbType, "#A1");
  124. Assert.AreEqual (ParameterDirection.Input, param.Direction, "#A2");
  125. Assert.IsFalse (param.IsNullable, "#A3");
  126. Assert.AreEqual (OracleType.VarChar, param.OracleType, "#A4");
  127. Assert.AreEqual ("firstName", param.ParameterName, "#A5");
  128. Assert.AreEqual ((byte) 0, param.Precision, "#A6");
  129. Assert.AreEqual ((byte) 0, param.Scale, "#A7");
  130. #if NET_2_0
  131. Assert.AreEqual (6, param.Size, "#A8");
  132. #else
  133. Assert.AreEqual (0, param.Size, "#A8");
  134. #endif
  135. Assert.AreEqual (string.Empty, param.SourceColumn, "#A9");
  136. #if NET_2_0
  137. Assert.IsFalse (param.SourceColumnNullMapping, "#A10");
  138. #endif
  139. Assert.AreEqual (DataRowVersion.Current, param.SourceVersion, "#A11");
  140. Assert.AreEqual ("Miguel", param.Value, "#A12");
  141. param = new OracleParameter ((string) null, new DateTime (2006, 1, 5));
  142. Assert.AreEqual (DbType.DateTime, param.DbType, "#B1");
  143. Assert.AreEqual (ParameterDirection.Input, param.Direction, "#B2");
  144. Assert.IsFalse (param.IsNullable, "#B3");
  145. Assert.AreEqual (OracleType.DateTime, param.OracleType, "#B4");
  146. Assert.AreEqual (string.Empty, param.ParameterName, "#B5");
  147. Assert.AreEqual ((byte) 0, param.Precision, "#B6");
  148. Assert.AreEqual ((byte) 0, param.Scale, "#B7");
  149. Assert.AreEqual (0, param.Size, "#B8");
  150. Assert.AreEqual (string.Empty, param.SourceColumn, "#B9");
  151. #if NET_2_0
  152. Assert.IsFalse (param.SourceColumnNullMapping, "#B10");
  153. #endif
  154. Assert.AreEqual (DataRowVersion.Current, param.SourceVersion, "#B11");
  155. Assert.AreEqual (new DateTime (2006, 1, 5), param.Value, "#B12");
  156. }
  157. [Test]
  158. public void ParameterName ()
  159. {
  160. OracleParameter param = new OracleParameter ("A", "B");
  161. param.ParameterName = null;
  162. Assert.AreEqual (string.Empty, param.ParameterName, "#1");
  163. param.ParameterName = "B";
  164. Assert.AreEqual ("B", param.ParameterName, "#2");
  165. param.ParameterName = string.Empty;
  166. Assert.AreEqual (string.Empty, param.ParameterName, "#3");
  167. }
  168. [Test] // bug #78509
  169. public void TrimsTrailingSpacesTest ()
  170. {
  171. if (connection_string == null)
  172. Assert.Ignore ("Please consult README.tests.");
  173. using (command = connection.CreateCommand ()) { // reusing command from SetUp causes parameter names mismatch
  174. // insert test values
  175. command.CommandText =
  176. "insert into oratest (id,text,text2) values (:id,:txt,'"
  177. + test_value2 + "')";
  178. command.Parameters.Add (new OracleParameter ("ID", OracleType.Int32));
  179. command.Parameters.Add( new OracleParameter ("TXT", OracleType.VarChar));
  180. command.Parameters ["ID"].Value = 100;
  181. command.Parameters ["TXT"].Value = test_value;
  182. command.ExecuteNonQuery ();
  183. // read test values
  184. command.CommandText =
  185. "select text,text2 from oratest where id = 100";
  186. command.Parameters.Clear ();
  187. using (OracleDataReader reader = command.ExecuteReader ()) {
  188. if (reader.Read ()) {
  189. Assert.AreEqual (test_value2, reader.GetString (1), "Directly passed value mismatched");
  190. Assert.AreEqual (test_value, reader.GetString (0), "Passed through bind value mismatched");
  191. } else {
  192. Assert.Fail ("Expected records not found.");
  193. }
  194. }
  195. }
  196. }
  197. [Test] // bug #79284
  198. public void CultureSensitiveNumbersTest ()
  199. {
  200. if (connection_string == null)
  201. Assert.Ignore ("Please consult README.tests.");
  202. CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
  203. Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-GB", false);
  204. CultureSensitiveNumbersInsertTest (1);
  205. CultureSensitiveNumbersSelectTest (1);
  206. Thread.CurrentThread.CurrentCulture = new CultureInfo ("pl-PL", false);
  207. CultureSensitiveNumbersInsertTest (2);
  208. CultureSensitiveNumbersSelectTest (2);
  209. Thread.CurrentThread.CurrentCulture = new CultureInfo ("ja-JP", false);
  210. CultureSensitiveNumbersInsertTest (3);
  211. CultureSensitiveNumbersSelectTest (3);
  212. Thread.CurrentThread.CurrentCulture = currentCulture;
  213. }
  214. // regression for bug #79284
  215. protected void CultureSensitiveNumbersInsertTest (int id)
  216. {
  217. using (command = connection.CreateCommand ()) { // reusing command from SetUp causes parameter names mismatch
  218. // insert test values
  219. command.CommandText =
  220. "insert into culture_test (id,value1,value2,value3) values (:id,:value1,:value2,:value3)";
  221. command.Parameters.Add (new OracleParameter ("ID", OracleType.Int32));
  222. command.Parameters.Add( new OracleParameter ("VALUE1", OracleType.Float));
  223. command.Parameters.Add( new OracleParameter ("VALUE2", OracleType.Double));
  224. command.Parameters.Add( new OracleParameter ("VALUE3", OracleType.Number));
  225. command.Parameters ["ID"].Value = id;
  226. command.Parameters ["VALUE1"].Value = 2346.2342f;
  227. command.Parameters ["VALUE2"].Value = 4567456.23412m;
  228. command.Parameters ["VALUE3"].Value = new OracleNumber(4567456.23412m);
  229. try {
  230. command.ExecuteNonQuery ();
  231. } catch (OracleException e) {
  232. if (e.Code == 1722)
  233. Assert.Fail("Culture incompatibility error while inserting [" + id + ']');
  234. else throw;
  235. }
  236. }
  237. }
  238. // regression for bug #79284
  239. protected void CultureSensitiveNumbersSelectTest (int id)
  240. {
  241. using (command = connection.CreateCommand ()) { // reusing command from SetUp causes parameter names mismatch
  242. // read test values
  243. command.CommandText =
  244. "select value1,value2,value3 from culture_test where id = " + id;
  245. command.Parameters.Clear ();
  246. try {
  247. using (OracleDataReader reader = command.ExecuteReader ()) {
  248. if (reader.Read ()) {
  249. Assert.AreEqual (2346.2342f,reader.GetFloat(0),
  250. "Float value improperly stored [" + id + ']');
  251. Assert.AreEqual (4567456.23412m, reader.GetDecimal (1),
  252. "Decimal value improperly stored [" + id + ']');
  253. Assert.AreEqual (4567456.23412m, reader.GetOracleNumber(2).Value,
  254. "OracleNumber value improperly stored [" + id + ']');
  255. } else {
  256. Assert.Fail ("Expected records not found [" + id + ']');
  257. }
  258. }
  259. } catch (FormatException) {
  260. Assert.Fail("Culture incompatibility error while reading [" + id + ']');
  261. }
  262. }
  263. }
  264. // added support for OracleString, OracleNumber and OracleDateTime in OracleParameter
  265. [Test]
  266. public void OracleTypesInValueTest ()
  267. {
  268. if (connection_string == null)
  269. Assert.Ignore ("Please consult README.tests.");
  270. try {
  271. int test_int = 10;
  272. string test_string = "koza";
  273. DateTime test_dateTime = DateTime.MinValue;
  274. using (command = connection.CreateCommand ()) { // reusing command from SetUp causes parameter names mismatch
  275. // insert test values
  276. command.CommandText =
  277. "insert into oratypes_test (id,value1,value2)"
  278. +" values (:idx,:txtx,:datex)";
  279. command.Parameters.Add(
  280. new OracleParameter("IDX", OracleType.Number))
  281. .Direction = ParameterDirection.Input;
  282. command.Parameters.Add(
  283. new OracleParameter("TXTX", OracleType.VarChar))
  284. .Direction = ParameterDirection.Input;
  285. command.Parameters.Add(
  286. new OracleParameter("DATEX", OracleType.DateTime))
  287. .Direction = ParameterDirection.Input;
  288. command.Parameters ["IDX"].Value = new OracleNumber(test_int);
  289. command.Parameters ["TXTX"].Value = new OracleString(test_string);
  290. command.Parameters ["DATEX"].Value = new OracleDateTime(test_dateTime);
  291. command.ExecuteNonQuery ();
  292. // read test values
  293. command.CommandText =
  294. "select value1,value2 from oratypes_test where id = "
  295. + test_int;
  296. command.Parameters.Clear ();
  297. using (OracleDataReader reader = command.ExecuteReader ()) {
  298. if (reader.Read ()) {
  299. Assert.AreEqual (test_string, reader.GetString (0), "OracleString mismatched");
  300. Assert.AreEqual (test_dateTime, reader.GetDateTime(1), "OracleDateTime mismatched");
  301. } else {
  302. Assert.Fail ("Expected records not found.");
  303. }
  304. }
  305. }
  306. } catch (ArgumentException e) {
  307. Assert.Fail("OracleType not handled: " + e.Message);
  308. }
  309. }
  310. [Test] // verify that parameters are bound by name
  311. public void ProcedureParametersByNameTest ()
  312. {
  313. if (connection_string == null)
  314. Assert.Ignore ("Please consult README.tests.");
  315. using (command = connection.CreateCommand ()) { // reusing command from SetUp causes parameter names mismatch
  316. command.CommandText = "params_pos_test";
  317. command.CommandType = CommandType.StoredProcedure;
  318. command.Parameters.Add (new OracleParameter ("PARAM3", OracleType.Int32));
  319. command.Parameters.Add (new OracleParameter ("PARAM1", OracleType.Int32));
  320. command.Parameters.Add (new OracleParameter ("PARAM2", OracleType.Int32));
  321. command.Parameters.Add (new OracleParameter ("RESULT", OracleType.Int32))
  322. .Direction = ParameterDirection.Output;
  323. command.Parameters ["PARAM1"].Value = 1;
  324. command.Parameters ["PARAM2"].Value = 2;
  325. command.Parameters ["PARAM3"].Value = 3;
  326. command.ExecuteNonQuery ();
  327. Assert.AreEqual (3, command.Parameters ["RESULT"].Value,
  328. "Unexpected result value.");
  329. }
  330. }
  331. private void ParamSize_SPCreation_ValueInsertion (OracleConnection conn)
  332. {
  333. string createSP =
  334. "CREATE OR REPLACE PROCEDURE GetTextValue \n" +
  335. "( \n" +
  336. "id IN Number(10),\n" +
  337. "text OUT varchar2(64) \n" +
  338. ")\n" +
  339. "AS\n" +
  340. "BEGIN\n" +
  341. "SELECT oratest.text INTO text \n" +
  342. " FROM oratest\n" +
  343. " WHERE oratest.id = id; \n" +
  344. "END;\n";
  345. string insertValue = "INSERT INTO oratest VALUES " +
  346. "(424608, \"This is a test for 424908 parameter size bug\", NULL);";
  347. using (command = conn.CreateCommand ()) {
  348. command.CommandText = createSP;
  349. command.CommandType = CommandType.Text;
  350. command.ExecuteNonQuery ();
  351. command.CommandText = insertValue;
  352. command.ExecuteNonQuery ();
  353. command.CommandText = "commit";
  354. command.ExecuteNonQuery ();
  355. }
  356. }
  357. [Test]
  358. public void ParamSize_424908_ValueError ()
  359. {
  360. //OracleConnection conn = new OracleConnection (connection_string);
  361. //conn.Open ();
  362. ParamSize_SPCreation_ValueInsertion (connection);
  363. using (command = connection.CreateCommand ()) {
  364. OracleParameter id = new OracleParameter ();
  365. id.ParameterName = "id";
  366. id.OracleType = OracleType.Number;
  367. id.Direction = ParameterDirection.Input;
  368. id.Value = 424908;
  369. command.Parameters.Add (id);
  370. OracleParameter text = new OracleParameter ();
  371. text.ParameterName = "text";
  372. text.OracleType = OracleType.NVarChar;
  373. text.Direction = ParameterDirection.Output;
  374. text.Value = string.Empty;
  375. text.Size = 64;
  376. command.Parameters.Add (text);
  377. try {
  378. command.CommandType = CommandType.StoredProcedure;
  379. command.CommandText = "GetTextValue";
  380. command.ExecuteNonQuery ();
  381. Assert.Fail ("Expected OracleException not occurred!");
  382. } catch (OracleException ex) {
  383. Assert.AreEqual ("6502", ex.Code, "Error code mismatch");
  384. connection.Close ();
  385. }
  386. }
  387. }
  388. [Test]
  389. public void ParamSize_424908_ConstructorSizeSetTest ()
  390. {
  391. //OracleConnection conn = new OracleConnection (connection_string);
  392. //conn.Open ();
  393. ParamSize_SPCreation_ValueInsertion (connection);
  394. using (command = connection.CreateCommand ()) {
  395. OracleParameter id = new OracleParameter ();
  396. id.ParameterName = "id";
  397. id.OracleType = OracleType.Number;
  398. id.Direction = ParameterDirection.Input;
  399. id.Value = 424908;
  400. command.Parameters.Add (id);
  401. OracleParameter text = new OracleParameter ("text", OracleType.NVarChar, 64);
  402. text.Direction = ParameterDirection.Output;
  403. text.Value = string.Empty;
  404. text.Size = 64;
  405. command.Parameters.Add (text);
  406. command.CommandType = CommandType.StoredProcedure;
  407. command.CommandText = "GetTextValue";
  408. command.ExecuteNonQuery ();
  409. Assert.AreEqual ("This is a test for 424908 parameter size bug", text.Value, "OracleParameter value mismatch");
  410. }
  411. }
  412. [Test]
  413. public void ParamSize_424908_SizeNotSetError ()
  414. {
  415. ParamSize_SPCreation_ValueInsertion (connection);
  416. using (command = connection.CreateCommand ()) {
  417. OracleParameter id = new OracleParameter ();
  418. id.ParameterName = "id";
  419. id.OracleType = OracleType.Number;
  420. id.Direction = ParameterDirection.Input;
  421. id.Value = 424908;
  422. command.Parameters.Add (id);
  423. OracleParameter text = new OracleParameter ();
  424. text.ParameterName = "text";
  425. text.OracleType = OracleType.NVarChar;
  426. text.Direction = ParameterDirection.Output;
  427. text.Value = DBNull.Value;
  428. command.Parameters.Add (text);
  429. try {
  430. command.CommandType = CommandType.StoredProcedure;
  431. command.CommandText = "GetTextValue";
  432. command.ExecuteNonQuery ();
  433. Assert.Fail ("Expected System.Exception not occurred!");
  434. } catch (Exception ex) {
  435. Assert.AreEqual ("Size must be set.", ex.Message, "Exception mismatch");
  436. }
  437. }
  438. }
  439. }
  440. }