TestOracleClient.cs 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135
  1. //
  2. // TestOracleClient.cs - Tests Sytem.Data.OracleClient
  3. // data provider in Mono.
  4. //
  5. // Part of managed C#/.NET library System.Data.OracleClient.dll
  6. //
  7. // Part of the Mono class libraries at
  8. // mcs/class/System.Data.OracleClient/System.Data.OracleClient.OCI
  9. //
  10. // Tests:
  11. // Assembly: System.Data.OracleClient.dll
  12. // Namespace: System.Data.OracleClient
  13. //
  14. // To Compile:
  15. // mcs TestOracleClient.cs /r:System.Data.dll /r:System.Data.OracleClient.dll /nowarn:0168
  16. //
  17. // Author:
  18. // Daniel Morgan <[email protected]>
  19. //
  20. // Copyright (C) Daniel Morgan, 2002, 2004-2005
  21. //
  22. using System;
  23. using System.IO;
  24. using System.Runtime.InteropServices;
  25. using System.Data;
  26. using System.Data.OracleClient;
  27. using System.Text;
  28. using System.Threading;
  29. namespace Test.OracleClient
  30. {
  31. public class OracleTest
  32. {
  33. private static Thread t = null;
  34. private static string conStr;
  35. public static readonly int MAX_CONNECTIONS = 30; // max connections default to 100, but I will set to 30.
  36. public OracleTest()
  37. {
  38. }
  39. static void MonoTest(OracleConnection con)
  40. {
  41. Console.WriteLine (" Drop table MONO_ORACLE_TEST ...");
  42. try {
  43. OracleCommand cmd2 = con.CreateCommand ();
  44. cmd2.CommandText = "DROP TABLE MONO_ORACLE_TEST";
  45. cmd2.ExecuteNonQuery ();
  46. }
  47. catch (OracleException oe1) {
  48. // ignore if table already exists
  49. }
  50. OracleCommand cmd = null;
  51. Console.WriteLine(" Creating table MONO_ORACLE_TEST...");
  52. cmd = new OracleCommand();
  53. cmd.Connection = con;
  54. cmd.CommandText = "CREATE TABLE MONO_ORACLE_TEST ( " +
  55. " varchar2_value VarChar2(32), " +
  56. " long_value long, " +
  57. " number_whole_value Number(18), " +
  58. " number_scaled_value Number(18,2), " +
  59. " number_integer_value Integer, " +
  60. " float_value Float, " +
  61. " date_value Date, " +
  62. " char_value Char(32), " +
  63. " clob_value Clob, " +
  64. " blob_value Blob, " +
  65. " clob_empty_value Clob, " +
  66. " blob_empty_value Blob, " +
  67. " varchar2_null_value VarChar2(32), " +
  68. " number_whole_null_value Number(18), " +
  69. " number_scaled_null_value Number(18,2), " +
  70. " number_integer_null_value Integer, " +
  71. " float_null_value Float, " +
  72. " date_null_value Date, " +
  73. " char_null_value Char(32), " +
  74. " clob_null_value Clob, " +
  75. " blob_null_value Blob " +
  76. ")";
  77. cmd.ExecuteNonQuery();
  78. Console.WriteLine(" Begin Trans for table MONO_ORACLE_TEST...");
  79. OracleTransaction trans = con.BeginTransaction ();
  80. Console.WriteLine(" Inserting value into MONO_ORACLE_TEST...");
  81. cmd = new OracleCommand();
  82. cmd.Connection = con;
  83. cmd.Transaction = trans;
  84. cmd.CommandText = "INSERT INTO mono_oracle_test " +
  85. " ( varchar2_value, " +
  86. " long_value, " +
  87. " number_whole_value, " +
  88. " number_scaled_value, " +
  89. " number_integer_value, " +
  90. " float_value, " +
  91. " date_value, " +
  92. " char_value, " +
  93. " clob_value, " +
  94. " blob_value, " +
  95. " clob_empty_value, " +
  96. " blob_empty_value " +
  97. ") " +
  98. " VALUES( " +
  99. " 'Mono', " +
  100. " 'This is a LONG column', " +
  101. " 123, " +
  102. " 456.78, " +
  103. " 8765, " +
  104. " 235.2, " +
  105. " TO_DATE( '2004-12-31', 'YYYY-MM-DD' ), " +
  106. " 'US', " +
  107. " EMPTY_CLOB(), " +
  108. " EMPTY_BLOB()," +
  109. " EMPTY_CLOB(), " +
  110. " EMPTY_BLOB()" +
  111. ")";
  112. cmd.ExecuteNonQuery();
  113. Console.WriteLine(" Select/Update CLOB columns on table MONO_ORACLE_TEST...");
  114. // update BLOB and CLOB columns
  115. OracleCommand select = con.CreateCommand ();
  116. select.Transaction = trans;
  117. select.CommandText = "SELECT CLOB_VALUE, BLOB_VALUE FROM MONO_ORACLE_TEST FOR UPDATE";
  118. OracleDataReader reader = select.ExecuteReader ();
  119. if (!reader.Read ())
  120. Console.WriteLine ("ERROR: RECORD NOT FOUND");
  121. // update clob_value
  122. Console.WriteLine(" Update CLOB column on table MONO_ORACLE_TEST...");
  123. OracleLob clob = reader.GetOracleLob (0);
  124. byte[] bytes = null;
  125. UnicodeEncoding encoding = new UnicodeEncoding ();
  126. bytes = encoding.GetBytes ("Mono is fun!");
  127. clob.Write (bytes, 0, bytes.Length);
  128. clob.Close ();
  129. // update blob_value
  130. Console.WriteLine(" Update BLOB column on table MONO_ORACLE_TEST...");
  131. OracleLob blob = reader.GetOracleLob (1);
  132. bytes = new byte[6] { 0x31, 0x32, 0x33, 0x34, 0x35, 0x036 };
  133. blob.Write (bytes, 0, bytes.Length);
  134. blob.Close ();
  135. Console.WriteLine(" Commit trans for table MONO_ORACLE_TEST...");
  136. trans.Commit ();
  137. // OracleCommand.ExecuteReader of MONO_ORACLE_TEST table
  138. Console.WriteLine(" Read simple test for table MONO_ORACLE_TEST...");
  139. ReadSimpleTest(con, "SELECT * FROM MONO_ORACLE_TEST");
  140. // OracleCommand.ExecuteScalar
  141. Console.WriteLine(" -ExecuteScalar tests...");
  142. string varchar2_value = (string) ReadScalar (con,"SELECT MAX(varchar2_value) FROM MONO_ORACLE_TEST");
  143. Console.WriteLine(" String Value: " + varchar2_value);
  144. Console.WriteLine(" Read Scalar: number_whole_value");
  145. decimal number_whole_value = (decimal)
  146. ReadScalar (con,"SELECT MAX(number_whole_value) FROM MONO_ORACLE_TEST");
  147. Console.WriteLine(" Int32 Value: " + number_whole_value.ToString());
  148. Console.WriteLine(" Read Scalar: number_scaled_value");
  149. decimal number_scaled_value = (decimal)
  150. ReadScalar (con,"SELECT number_scaled_value FROM MONO_ORACLE_TEST");
  151. Console.WriteLine(" Decimal Value: " + number_scaled_value.ToString());
  152. Console.WriteLine(" Read Scalar: date_value");
  153. DateTime date_value = (DateTime)
  154. ReadScalar (con,"SELECT date_value FROM MONO_ORACLE_TEST");
  155. Console.WriteLine(" DateTime Value: " + date_value.ToString());
  156. Console.WriteLine(" Read Scalar: clob_value");
  157. string clob_value = (string)
  158. ReadScalar (con,"SELECT clob_value FROM MONO_ORACLE_TEST");
  159. Console.WriteLine(" CLOB Value: " + clob_value);
  160. Console.WriteLine(" Read Scalar: blob_value");
  161. byte[] blob_value = (byte[])
  162. ReadScalar (con,"SELECT blob_value FROM MONO_ORACLE_TEST");
  163. string sblob_value = GetHexString (blob_value);
  164. Console.WriteLine(" BLOB Value: " + sblob_value);
  165. // OracleCommand.ExecuteOracleScalar
  166. Console.WriteLine(" -ExecuteOracleScalar tests...");
  167. Console.WriteLine(" Read Oracle Scalar: varchar2_value");
  168. ReadOracleScalar (con,"SELECT MAX(varchar2_value) FROM MONO_ORACLE_TEST");
  169. Console.WriteLine(" Read Oracle Scalar: number_whole_value");
  170. ReadOracleScalar (con,"SELECT MAX(number_whole_value) FROM MONO_ORACLE_TEST");
  171. Console.WriteLine(" Read Oracle Scalar: number_scaled_value");
  172. ReadOracleScalar (con,"SELECT number_scaled_value FROM MONO_ORACLE_TEST");
  173. Console.WriteLine(" Read Oracle Scalar: date_value");
  174. ReadOracleScalar (con,"SELECT date_value FROM MONO_ORACLE_TEST");
  175. Console.WriteLine(" Read Oracle Scalar: clob_value");
  176. ReadOracleScalar (con,"SELECT clob_value FROM MONO_ORACLE_TEST");
  177. Console.WriteLine(" Read Oracle Scalar: blob_value");
  178. ReadOracleScalar (con,"SELECT blob_value FROM MONO_ORACLE_TEST");
  179. }
  180. static object ReadScalar (OracleConnection con, string selectSql)
  181. {
  182. OracleCommand cmd = null;
  183. cmd = con.CreateCommand();
  184. cmd.CommandText = selectSql;
  185. object o = cmd.ExecuteScalar ();
  186. string dataType = o.GetType ().ToString ();
  187. Console.WriteLine (" DataType: " + dataType);
  188. return o;
  189. }
  190. static void ReadOracleScalar (OracleConnection con, string selectSql)
  191. {
  192. OracleCommand cmd = null;
  193. cmd = con.CreateCommand();
  194. cmd.CommandText = selectSql;
  195. object o = cmd.ExecuteOracleScalar ();
  196. string dataType = o.GetType ().ToString ();
  197. Console.WriteLine (" DataType: " + dataType);
  198. if (dataType.Equals("System.Data.OracleClient.OracleLob"))
  199. o = ((OracleLob) o).Value;
  200. if (o.GetType ().ToString ().Equals ("System.Byte[]"))
  201. o = GetHexString ((byte[])o);
  202. Console.WriteLine (" Value: " + o.ToString ());
  203. }
  204. static void ReadSimpleTest(OracleConnection con, string selectSql)
  205. {
  206. OracleCommand cmd = null;
  207. OracleDataReader reader = null;
  208. cmd = con.CreateCommand();
  209. cmd.CommandText = selectSql;
  210. reader = cmd.ExecuteReader();
  211. Console.WriteLine(" Results...");
  212. Console.WriteLine(" Schema");
  213. DataTable table;
  214. table = reader.GetSchemaTable();
  215. for(int c = 0; c < reader.FieldCount; c++) {
  216. Console.WriteLine(" Column " + c.ToString());
  217. DataRow row = table.Rows[c];
  218. string strColumnName = row["ColumnName"].ToString();
  219. string strBaseColumnName = row["BaseColumnName"].ToString();
  220. string strColumnSize = row["ColumnSize"].ToString();
  221. string strNumericScale = row["NumericScale"].ToString();
  222. string strNumericPrecision = row["NumericPrecision"].ToString();
  223. string strDataType = row["DataType"].ToString();
  224. Console.WriteLine(" ColumnName: " + strColumnName);
  225. Console.WriteLine(" BaseColumnName: " + strBaseColumnName);
  226. Console.WriteLine(" ColumnSize: " + strColumnSize);
  227. Console.WriteLine(" NumericScale: " + strNumericScale);
  228. Console.WriteLine(" NumericPrecision: " + strNumericPrecision);
  229. Console.WriteLine(" DataType: " + strDataType);
  230. }
  231. int r = 0;
  232. Console.WriteLine (" Data");
  233. while (reader.Read ()) {
  234. r++;
  235. Console.WriteLine (" Row: " + r.ToString ());
  236. for (int f = 0; f < reader.FieldCount; f++) {
  237. string sname = "";
  238. object ovalue = "";
  239. string svalue = "";
  240. string sDataType = "";
  241. string sFieldType = "";
  242. string sDataTypeName = "";
  243. string sOraDataType = "";
  244. sname = reader.GetName (f);
  245. if (reader.IsDBNull (f)) {
  246. ovalue = DBNull.Value;
  247. svalue = "";
  248. sDataType = "DBNull.Value";
  249. sOraDataType = "DBNull.Value";
  250. }
  251. else {
  252. ovalue = reader.GetValue (f);
  253. //ovalue = reader.GetOracleValue (f);
  254. object oravalue = null;
  255. sDataType = ovalue.GetType ().ToString ();
  256. switch (sDataType) {
  257. case "System.Data.OracleClient.OracleString":
  258. oravalue = ((OracleString) ovalue).Value;
  259. break;
  260. case "System.Data.OracleClient.OracleNumber":
  261. oravalue = ((OracleNumber) ovalue).Value;
  262. break;
  263. case "System.Data.OracleClient.OracleLob":
  264. OracleLob lob = (OracleLob) ovalue;
  265. oravalue = lob.Value;
  266. lob.Close ();
  267. break;
  268. case "System.Data.OracleClient.OracleDateTime":
  269. oravalue = ((OracleDateTime) ovalue).Value;
  270. break;
  271. case "System.Byte[]":
  272. oravalue = GetHexString((byte[])ovalue);
  273. break;
  274. case "System.Decimal":
  275. Console.WriteLine(" *** Get Decimal, Int16, Int32, Int64, Float, Double, ...");
  276. decimal dec = reader.GetDecimal (f);
  277. Console.WriteLine(" GetDecimal: " + dec.ToString ());
  278. oravalue = (object) dec;
  279. try {
  280. reader.GetInt16 (f);
  281. } catch (NotSupportedException e) {
  282. Console.WriteLine (" ** Expected exception caught for GetInt16: NotSupportedException: " + e.Message);
  283. }
  284. try {
  285. long lng = reader.GetInt64 (f);
  286. Console.WriteLine(" GetInt64: " + lng.ToString ());
  287. int n = reader.GetInt32 (f);
  288. Console.WriteLine(" GetInt32: " + n.ToString ());
  289. float flt = reader.GetFloat (f);
  290. Console.WriteLine(" GetFloat: " + flt.ToString ());
  291. double dbl = reader.GetDouble (f);
  292. Console.WriteLine(" GetDouble: " + dbl.ToString ());
  293. } catch (OverflowException oe1) {
  294. Console.WriteLine (" ** Overflow exception for numbers to big or too small: " + oe1.Message);
  295. }
  296. break;
  297. default:
  298. oravalue = ovalue.ToString ();
  299. break;
  300. }
  301. sOraDataType = oravalue.GetType ().ToString ();
  302. if (sOraDataType.Equals ("System.Byte[]"))
  303. svalue = GetHexString ((byte[]) oravalue);
  304. else
  305. svalue = oravalue.ToString();
  306. }
  307. sFieldType = reader.GetFieldType(f).ToString();
  308. sDataTypeName = reader.GetDataTypeName(f);
  309. Console.WriteLine(" Field: " + f.ToString());
  310. Console.WriteLine(" Name: " + sname);
  311. Console.WriteLine(" Value: " + svalue);
  312. Console.WriteLine(" Oracle Data Type: " + sOraDataType);
  313. Console.WriteLine(" Data Type: " + sDataType);
  314. Console.WriteLine(" Field Type: " + sFieldType);
  315. Console.WriteLine(" Data Type Name: " + sDataTypeName);
  316. }
  317. }
  318. if(r == 0)
  319. Console.WriteLine(" No data returned.");
  320. }
  321. static void DataAdapterTest (OracleConnection connection)
  322. {
  323. Console.WriteLine(" Create select command...");
  324. OracleCommand command = connection.CreateCommand ();
  325. command.CommandText = "SELECT * FROM EMP";
  326. Console.WriteLine(" Create data adapter...");
  327. OracleDataAdapter adapter = new OracleDataAdapter (command);
  328. Console.WriteLine(" Create DataSet...");
  329. DataSet dataSet = new DataSet ("EMP");
  330. Console.WriteLine(" Fill DataSet via data adapter...");
  331. adapter.Fill (dataSet);
  332. Console.WriteLine(" Get DataTable...");
  333. DataTable table = dataSet.Tables [0];
  334. Console.WriteLine(" Display each row...");
  335. int rowCount = 0;
  336. foreach (DataRow row in table.Rows) {
  337. Console.WriteLine (" row {0}", rowCount + 1);
  338. for (int i = 0; i < table.Columns.Count; i += 1) {
  339. Console.WriteLine (" {0}: {1}", table.Columns [i].ColumnName, row [i]);
  340. }
  341. Console.WriteLine ();
  342. rowCount += 1;
  343. }
  344. }
  345. static void RollbackTest (OracleConnection connection)
  346. {
  347. OracleTransaction transaction = connection.BeginTransaction ();
  348. OracleCommand insert = connection.CreateCommand ();
  349. insert.Transaction = transaction;
  350. insert.CommandText = "INSERT INTO EMP (EMPNO, ENAME, JOB) VALUES (8787, 'T Coleman', 'Monoist')";
  351. Console.WriteLine (" Inserting record ...");
  352. insert.ExecuteNonQuery ();
  353. OracleCommand select = connection.CreateCommand ();
  354. select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
  355. select.Transaction = transaction;
  356. OracleDataReader reader = select.ExecuteReader ();
  357. reader.Read ();
  358. Console.WriteLine (" Row count SHOULD BE 1, VALUE IS {0}", reader.GetValue (0));
  359. reader.Close ();
  360. Console.WriteLine (" Rolling back transaction ...");
  361. transaction.Rollback ();
  362. select = connection.CreateCommand ();
  363. select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
  364. reader = select.ExecuteReader ();
  365. reader.Read ();
  366. Console.WriteLine (" Row count SHOULD BE 0, VALUE IS {0}", reader.GetValue (0));
  367. reader.Close ();
  368. }
  369. static void CommitTest (OracleConnection connection)
  370. {
  371. OracleTransaction transaction = connection.BeginTransaction ();
  372. OracleCommand insert = connection.CreateCommand ();
  373. insert.Transaction = transaction;
  374. insert.CommandText = "INSERT INTO EMP (EMPNO, ENAME, JOB) VALUES (8787, 'T Coleman', 'Monoist')";
  375. Console.WriteLine (" Inserting record ...");
  376. insert.ExecuteNonQuery ();
  377. OracleCommand select = connection.CreateCommand ();
  378. select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
  379. select.Transaction = transaction;
  380. Console.WriteLine (" Row count SHOULD BE 1, VALUE IS {0}", select.ExecuteScalar ());
  381. Console.WriteLine (" Committing transaction ...");
  382. transaction.Commit ();
  383. select = connection.CreateCommand ();
  384. select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
  385. Console.WriteLine ("Row count SHOULD BE 1, VALUE IS {0}", select.ExecuteScalar ());
  386. transaction = connection.BeginTransaction ();
  387. OracleCommand delete = connection.CreateCommand ();
  388. delete.Transaction = transaction;
  389. delete.CommandText = "DELETE FROM EMP WHERE EMPNO = 8787";
  390. delete.ExecuteNonQuery ();
  391. transaction.Commit ();
  392. }
  393. public static void ParameterTest (OracleConnection connection)
  394. {
  395. Console.WriteLine(" Setting NLS_DATE_FORMAT...");
  396. OracleCommand cmd2 = connection.CreateCommand();
  397. cmd2.CommandText = "ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'";
  398. cmd2.ExecuteNonQuery ();
  399. Console.WriteLine(" Drop table MONO_TEST_TABLE2...");
  400. try {
  401. cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE7";
  402. cmd2.ExecuteNonQuery ();
  403. }
  404. catch(OracleException oe1) {
  405. // ignore if table already exists
  406. }
  407. Console.WriteLine(" Create table MONO_TEST_TABLE7...");
  408. cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE7(" +
  409. " COL1 VARCHAR2(8) NOT NULL, " +
  410. " COL2 VARCHAR2(32), " +
  411. " COL3 NUMBER(18,2) NOT NULL, " +
  412. " COL4 NUMBER(18,2), " +
  413. " COL5 DATE NOT NULL, " +
  414. " COL6 DATE, " +
  415. " COL7 BLOB NOT NULL, " +
  416. " COL8 BLOB, " +
  417. " COL9 CLOB NOT NULL, " +
  418. " COL10 CLOB " +
  419. ")";
  420. cmd2.ExecuteNonQuery ();
  421. Console.WriteLine(" COMMIT...");
  422. cmd2.CommandText = "COMMIT";
  423. cmd2.ExecuteNonQuery ();
  424. Console.WriteLine(" create insert command...");
  425. OracleTransaction trans = connection.BeginTransaction ();
  426. OracleCommand cmd = connection.CreateCommand ();
  427. cmd.Transaction = trans;
  428. cmd.CommandText = "INSERT INTO MONO_TEST_TABLE7 " +
  429. "(COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10) " +
  430. "VALUES(:P1,:P2,:P3,:P4,:P5,:P6,:P7,:P8,:P9,:P10)";
  431. Console.WriteLine(" Add parameters...");
  432. OracleParameter parm1 = cmd.Parameters.Add (":P1", OracleType.VarChar, 8);
  433. OracleParameter parm2 = cmd.Parameters.Add (":P2", OracleType.VarChar, 32);
  434. OracleParameter parm3 = cmd.Parameters.Add (":P3", OracleType.Number);
  435. OracleParameter parm4 = cmd.Parameters.Add (":P4", OracleType.Number);
  436. OracleParameter parm5 = cmd.Parameters.Add (":P5", OracleType.DateTime);
  437. OracleParameter parm6 = cmd.Parameters.Add (":P6", OracleType.DateTime);
  438. // FIXME: fix BLOBs and CLOBs in OracleParameter
  439. OracleParameter parm7 = cmd.Parameters.Add (":P7", OracleType.Blob);
  440. OracleParameter parm8 = cmd.Parameters.Add (":P8", OracleType.Blob);
  441. OracleParameter parm9 = cmd.Parameters.Add (":P9", OracleType.Clob);
  442. OracleParameter parm10 = cmd.Parameters.Add (":P10", OracleType.Clob);
  443. // TODO: implement out, return, and ref parameters
  444. string s = "Mono";
  445. decimal d = 123456789012345.678M;
  446. DateTime dt = DateTime.Now;
  447. string clob = "Clob";
  448. byte[] blob = new byte[] { 0x31, 0x32, 0x33, 0x34, 0x35 };
  449. Console.WriteLine(" Set Values...");
  450. parm1.Value = s;
  451. parm2.Value = DBNull.Value;
  452. parm3.Value = d;
  453. parm4.Value = DBNull.Value;
  454. parm5.Value = dt;
  455. parm6.Value = DBNull.Value;
  456. parm7.Value = blob;
  457. parm8.Value = DBNull.Value;
  458. parm9.Value = clob;
  459. parm10.Value = DBNull.Value;
  460. Console.WriteLine(" ExecuteNonQuery...");
  461. cmd.ExecuteNonQuery ();
  462. trans.Commit();
  463. }
  464. public static void CLOBTest (OracleConnection connection)
  465. {
  466. Console.WriteLine (" BEGIN TRANSACTION ...");
  467. OracleTransaction transaction = connection.BeginTransaction ();
  468. Console.WriteLine (" Drop table CLOBTEST ...");
  469. try {
  470. OracleCommand cmd2 = connection.CreateCommand ();
  471. cmd2.Transaction = transaction;
  472. cmd2.CommandText = "DROP TABLE CLOBTEST";
  473. cmd2.ExecuteNonQuery ();
  474. }
  475. catch (OracleException oe1) {
  476. // ignore if table already exists
  477. }
  478. Console.WriteLine (" CREATE TABLE ...");
  479. OracleCommand create = connection.CreateCommand ();
  480. create.Transaction = transaction;
  481. create.CommandText = "CREATE TABLE CLOBTEST (CLOB_COLUMN CLOB)";
  482. create.ExecuteNonQuery ();
  483. Console.WriteLine (" INSERT RECORD ...");
  484. OracleCommand insert = connection.CreateCommand ();
  485. insert.Transaction = transaction;
  486. insert.CommandText = "INSERT INTO CLOBTEST VALUES (EMPTY_CLOB())";
  487. insert.ExecuteNonQuery ();
  488. OracleCommand select = connection.CreateCommand ();
  489. select.Transaction = transaction;
  490. select.CommandText = "SELECT CLOB_COLUMN FROM CLOBTEST FOR UPDATE";
  491. Console.WriteLine (" SELECTING A CLOB (CHARACTER) VALUE FROM CLOBTEST");
  492. OracleDataReader reader = select.ExecuteReader ();
  493. if (!reader.Read ())
  494. Console.WriteLine ("ERROR: RECORD NOT FOUND");
  495. Console.WriteLine (" TESTING OracleLob OBJECT ...");
  496. OracleLob lob = reader.GetOracleLob (0);
  497. Console.WriteLine (" LENGTH: {0}", lob.Length);
  498. Console.WriteLine (" CHUNK SIZE: {0}", lob.ChunkSize);
  499. UnicodeEncoding encoding = new UnicodeEncoding ();
  500. byte[] value = new byte [lob.Length * 2];
  501. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  502. Console.WriteLine (" UPDATING VALUE TO 'TEST ME!'");
  503. value = encoding.GetBytes ("TEST ME!");
  504. lob.Write (value, 0, value.Length);
  505. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  506. Console.WriteLine (" RE-READ VALUE...");
  507. lob.Seek (1, SeekOrigin.Begin);
  508. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  509. value = new byte [lob.Length * 2];
  510. lob.Read (value, 0, value.Length);
  511. Console.WriteLine (" VALUE: {0}", encoding.GetString (value));
  512. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  513. Console.WriteLine (" CLOSE OracleLob...");
  514. lob.Close ();
  515. Console.WriteLine (" CLOSING READER...");
  516. reader.Close ();
  517. transaction.Commit ();
  518. }
  519. public static void BLOBTest (OracleConnection connection)
  520. {
  521. Console.WriteLine (" BEGIN TRANSACTION ...");
  522. OracleTransaction transaction = connection.BeginTransaction ();
  523. Console.WriteLine (" Drop table BLOBTEST ...");
  524. try {
  525. OracleCommand cmd2 = connection.CreateCommand ();
  526. cmd2.Transaction = transaction;
  527. cmd2.CommandText = "DROP TABLE BLOBTEST";
  528. cmd2.ExecuteNonQuery ();
  529. }
  530. catch (OracleException oe1) {
  531. // ignore if table already exists
  532. }
  533. Console.WriteLine (" CREATE TABLE ...");
  534. OracleCommand create = connection.CreateCommand ();
  535. create.Transaction = transaction;
  536. create.CommandText = "CREATE TABLE BLOBTEST (BLOB_COLUMN BLOB)";
  537. create.ExecuteNonQuery ();
  538. Console.WriteLine (" INSERT RECORD ...");
  539. OracleCommand insert = connection.CreateCommand ();
  540. insert.Transaction = transaction;
  541. insert.CommandText = "INSERT INTO BLOBTEST VALUES (EMPTY_BLOB())";
  542. insert.ExecuteNonQuery ();
  543. OracleCommand select = connection.CreateCommand ();
  544. select.Transaction = transaction;
  545. select.CommandText = "SELECT BLOB_COLUMN FROM BLOBTEST FOR UPDATE";
  546. Console.WriteLine (" SELECTING A BLOB (Binary) VALUE FROM BLOBTEST");
  547. OracleDataReader reader = select.ExecuteReader ();
  548. if (!reader.Read ())
  549. Console.WriteLine ("ERROR: RECORD NOT FOUND");
  550. Console.WriteLine (" TESTING OracleLob OBJECT ...");
  551. OracleLob lob = reader.GetOracleLob (0);
  552. byte[] value = null;
  553. string bvalue = "";
  554. Console.WriteLine (" UPDATING VALUE");
  555. byte[] bytes = new byte[6];
  556. bytes[0] = 0x31;
  557. bytes[1] = 0x32;
  558. bytes[2] = 0x33;
  559. bytes[3] = 0x34;
  560. bytes[4] = 0x35;
  561. bytes[5] = 0x36;
  562. lob.Write (bytes, 0, bytes.Length);
  563. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  564. Console.WriteLine (" RE-READ VALUE...");
  565. lob.Seek (1, SeekOrigin.Begin);
  566. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  567. value = new byte [lob.Length];
  568. lob.Read (value, 0, value.Length);
  569. bvalue = "";
  570. if (value.GetType ().ToString ().Equals ("System.Byte[]"))
  571. bvalue = GetHexString (value);
  572. Console.WriteLine (" Bytes: " + bvalue);
  573. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  574. Console.WriteLine (" CLOSE OracleLob...");
  575. lob.Close ();
  576. Console.WriteLine (" CLOSING READER...");
  577. reader.Close ();
  578. transaction.Commit ();
  579. }
  580. static void Wait(string msg)
  581. {
  582. Console.WriteLine(msg);
  583. if (msg.Equals(""))
  584. Console.WriteLine("Waiting... Press Enter to continue...");
  585. Console.ReadLine();
  586. }
  587. // use this function to read a byte array into a string
  588. // for easy display of binary data, such as, a BLOB value
  589. public static string GetHexString (byte[] bytes)
  590. {
  591. string bvalue = "";
  592. StringBuilder sb2 = new StringBuilder();
  593. for (int z = 0; z < bytes.Length; z++) {
  594. byte byt = bytes[z];
  595. sb2.Append (byt.ToString("x"));
  596. }
  597. if (sb2.Length > 0)
  598. bvalue = "0x" + sb2.ToString ();
  599. return bvalue;
  600. }
  601. static void StoredProcedureTest1 (OracleConnection con)
  602. {
  603. // test stored procedure with no parameters
  604. OracleCommand cmd2 = con.CreateCommand ();
  605. Console.WriteLine(" Drop table MONO_TEST_TABLE1...");
  606. try {
  607. cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE1";
  608. cmd2.ExecuteNonQuery ();
  609. }
  610. catch(OracleException oe1) {
  611. // ignore if table did not exist
  612. }
  613. Console.WriteLine(" Drop procedure SP_TEST1...");
  614. try {
  615. cmd2.CommandText = "DROP PROCEDURE SP_TEST1";
  616. cmd2.ExecuteNonQuery ();
  617. }
  618. catch(OracleException oe1) {
  619. // ignore if procedure did not exist
  620. }
  621. Console.WriteLine(" Create table MONO_TEST_TABLE1...");
  622. cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE1 (" +
  623. " COL1 VARCHAR2(8), "+
  624. " COL2 VARCHAR2(32))";
  625. cmd2.ExecuteNonQuery ();
  626. Console.WriteLine(" Create stored procedure SP_TEST1...");
  627. cmd2.CommandText = "CREATE PROCEDURE SP_TEST1 " +
  628. " IS " +
  629. " BEGIN " +
  630. " INSERT INTO MONO_TEST_TABLE1 (COL1,COL2) VALUES ('aaa','bbbb');" +
  631. " COMMIT;" +
  632. " END;";
  633. cmd2.ExecuteNonQuery ();
  634. Console.WriteLine("COMMIT...");
  635. cmd2.CommandText = "COMMIT";
  636. cmd2.ExecuteNonQuery ();
  637. Console.WriteLine(" Call stored procedure sp_test1...");
  638. OracleCommand cmd3 = con.CreateCommand ();
  639. cmd3.CommandType = CommandType.StoredProcedure;
  640. cmd3.CommandText = "sp_test1";
  641. cmd3.ExecuteNonQuery ();
  642. }
  643. static void StoredProcedureTest2 (OracleConnection con)
  644. {
  645. // test stored procedure with 2 parameters
  646. Console.WriteLine(" Drop table MONO_TEST_TABLE2...");
  647. OracleCommand cmd2 = con.CreateCommand ();
  648. try {
  649. cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE2";
  650. cmd2.ExecuteNonQuery ();
  651. }
  652. catch(OracleException oe1) {
  653. // ignore if table already exists
  654. }
  655. Console.WriteLine(" Drop procedure SP_TEST2...");
  656. try {
  657. cmd2.CommandText = "DROP PROCEDURE SP_TEST2";
  658. cmd2.ExecuteNonQuery ();
  659. }
  660. catch(OracleException oe1) {
  661. // ignore if table already exists
  662. }
  663. Console.WriteLine(" Create table MONO_TEST_TABLE2...");
  664. cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE2 (" +
  665. " COL1 VARCHAR2(8), "+
  666. " COL2 VARCHAR2(32))";
  667. cmd2.ExecuteNonQuery ();
  668. Console.WriteLine(" Create stored procedure SP_TEST2...");
  669. cmd2.CommandText = "CREATE PROCEDURE SP_TEST2(parm1 VARCHAR2,parm2 VARCHAR2) " +
  670. " IS " +
  671. " BEGIN " +
  672. " INSERT INTO MONO_TEST_TABLE2 (COL1,COL2) VALUES (parm1,parm2);" +
  673. " COMMIT;" +
  674. " END;";
  675. cmd2.ExecuteNonQuery ();
  676. Console.WriteLine(" COMMIT...");
  677. cmd2.CommandText = "COMMIT";
  678. cmd2.ExecuteNonQuery ();
  679. Console.WriteLine(" Call stored procedure SP_TEST2 with two parameters...");
  680. OracleCommand cmd3 = con.CreateCommand ();
  681. cmd3.CommandType = CommandType.StoredProcedure;
  682. cmd3.CommandText = "sp_test2";
  683. OracleParameter myParameter1 = new OracleParameter("parm1", OracleType.VarChar);
  684. myParameter1.Value = "yyy13";
  685. myParameter1.Size = 8;
  686. myParameter1.Direction = ParameterDirection.Input;
  687. OracleParameter myParameter2 = new OracleParameter("parm2", OracleType.VarChar);
  688. myParameter2.Value = "iii13";
  689. myParameter2.Size = 32;
  690. myParameter2.Direction = ParameterDirection.Input;
  691. cmd3.Parameters.Add (myParameter1);
  692. cmd3.Parameters.Add (myParameter2);
  693. cmd3.ExecuteNonQuery ();
  694. }
  695. static void ShowConnectionProperties (OracleConnection con)
  696. {
  697. try {
  698. Console.WriteLine ("ServerVersion: " + con.ServerVersion);
  699. } catch (System.InvalidOperationException ioe) {
  700. Console.WriteLine ("InvalidOperationException caught.");
  701. Console.WriteLine ("Message: " + ioe.Message);
  702. }
  703. Console.WriteLine ("DataSource: " + con.DataSource);
  704. }
  705. static void NullAggregateTest (OracleConnection con)
  706. {
  707. Console.WriteLine(" Drop table MONO_TEST_TABLE3...");
  708. OracleCommand cmd2 = con.CreateCommand ();
  709. try {
  710. cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE3";
  711. cmd2.ExecuteNonQuery ();
  712. }
  713. catch(OracleException oe1) {
  714. // ignore if table already exists
  715. }
  716. Console.WriteLine(" Create table MONO_TEST_TABLE3...");
  717. cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE3 (" +
  718. " COL1 VARCHAR2(8), "+
  719. " COL2 VARCHAR2(32))";
  720. cmd2.ExecuteNonQuery ();
  721. Console.WriteLine(" Insert some rows into table MONO_TEST_TABLE3...");
  722. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('1','one')";
  723. cmd2.ExecuteNonQuery ();
  724. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('1','uno')";
  725. cmd2.ExecuteNonQuery ();
  726. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3','three')";
  727. cmd2.ExecuteNonQuery ();
  728. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3', null)";
  729. cmd2.ExecuteNonQuery ();
  730. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3','few')";
  731. cmd2.ExecuteNonQuery ();
  732. Console.WriteLine(" ExecuteScalar...");
  733. cmd2.CommandText = "SELECT COL1, COUNT(COL2) AS MAX_COL1 FROM MONO_TEST_TABLE3 GROUP BY COL1";
  734. OracleDataReader reader = cmd2.ExecuteReader ();
  735. Console.WriteLine (" Read...");
  736. while (reader.Read ()) {
  737. object obj0 = reader.GetValue (0);
  738. Console.WriteLine("Value 0: " + obj0.ToString ());
  739. object obj1 = reader.GetValue (1);
  740. Console.WriteLine("Value 1: " + obj1.ToString ());
  741. Console.WriteLine (" Read...");
  742. }
  743. Console.WriteLine (" No more records.");
  744. }
  745. static void OnInfoMessage (object sender, OracleInfoMessageEventArgs e)
  746. {
  747. Console.WriteLine("InfoMessage Message: " + e.Message.ToString());
  748. Console.WriteLine("InfoMessage Code: " + e.Code.ToString());
  749. Console.WriteLine("InfoMessage Source: " + e.Source.ToString());
  750. }
  751. static void OnStateChange (object sender, StateChangeEventArgs e)
  752. {
  753. Console.WriteLine("StateChange CurrentSate:" + e.CurrentState.ToString ());
  754. Console.WriteLine("StateChange OriginalState:" + e.OriginalState.ToString ());
  755. }
  756. public static void ConnectionPoolingTest1 () {
  757. Console.WriteLine("Start Connection Pooling Test 1...");
  758. OracleConnection[] connections = null;
  759. int maxCon = MAX_CONNECTIONS + 1; // add 1 more over the max connections to cause it to wait for the next available connection
  760. int i = 0;
  761. try {
  762. connections = new OracleConnection[maxCon];
  763. for (i = 0; i < maxCon; i++) {
  764. Console.WriteLine(" Open connection: {0}", i);
  765. connections[i] = new OracleConnection(conStr);
  766. connections[i].Open ();
  767. }
  768. } catch (InvalidOperationException e) {
  769. Console.WriteLine("Expected exception InvalidOperationException caught.");
  770. Console.WriteLine(e);
  771. }
  772. for (i = 0; i < maxCon; i++) {
  773. if (connections[i] != null) {
  774. Console.WriteLine(" Close connection: {0}", i);
  775. if (connections[i].State == ConnectionState.Open)
  776. connections[i].Close ();
  777. connections[i].Dispose ();
  778. connections[i] = null;
  779. }
  780. }
  781. connections = null;
  782. Console.WriteLine("Done Connection Pooling Test 1.");
  783. }
  784. public static void ConnectionPoolingTest2 () {
  785. Console.WriteLine("Start Connection Pooling Test 2...");
  786. OracleConnection[] connections = null;
  787. int maxCon = MAX_CONNECTIONS;
  788. int i = 0;
  789. connections = new OracleConnection[maxCon];
  790. for (i = 0; i < maxCon; i++) {
  791. Console.WriteLine(" Open connection: {0}", i);
  792. connections[i] = new OracleConnection(conStr);
  793. connections[i].Open ();
  794. }
  795. Console.WriteLine("Start another thread...");
  796. t = new Thread(new ThreadStart(AnotherThreadProc));
  797. t.Start ();
  798. Console.WriteLine("Sleep...");
  799. Thread.Sleep(100);
  800. Console.WriteLine("Closing...");
  801. for (i = 0; i < maxCon; i++) {
  802. if (connections[i] != null) {
  803. Console.WriteLine(" Close connection: {0}", i);
  804. if (connections[i].State == ConnectionState.Open)
  805. connections[i].Close ();
  806. connections[i].Dispose ();
  807. connections[i] = null;
  808. }
  809. }
  810. connections = null;
  811. }
  812. private static void AnotherThreadProc () {
  813. Console.WriteLine("Open connection via another thread...");
  814. OracleConnection[] connections = null;
  815. int maxCon = MAX_CONNECTIONS;
  816. int i = 0;
  817. connections = new OracleConnection[maxCon];
  818. for (i = 0; i < maxCon; i++) {
  819. Console.WriteLine(" Open connection: {0}", i);
  820. connections[i] = new OracleConnection(conStr);
  821. connections[i].Open ();
  822. }
  823. Console.WriteLine("Done Connection Pooling Test 2.");
  824. System.Environment.Exit (0);
  825. }
  826. [STAThread]
  827. static void Main(string[] args)
  828. {
  829. if(args.Length != 3) {
  830. Console.WriteLine("Usage: mono TestOracleClient database userid password");
  831. return;
  832. }
  833. string connectionString = String.Format(
  834. "Data Source={0};" +
  835. "User ID={1};" +
  836. "Password={2}",
  837. args[0], args[1], args[2]);
  838. conStr = connectionString;
  839. OracleConnection con1 = new OracleConnection();
  840. ShowConnectionProperties (con1);
  841. con1.ConnectionString = connectionString;
  842. con1.InfoMessage += new OracleInfoMessageEventHandler (OnInfoMessage);
  843. con1.StateChange += new StateChangeEventHandler (OnStateChange);
  844. Console.WriteLine("Opening...");
  845. con1.Open ();
  846. Console.WriteLine("Opened.");
  847. ShowConnectionProperties (con1);
  848. Console.WriteLine ("Mono Oracle Test BEGIN ...");
  849. MonoTest (con1);
  850. Console.WriteLine ("Mono Oracle Test END ...");
  851. Wait ("");
  852. Console.WriteLine ("LOB Test BEGIN...");
  853. CLOBTest (con1);
  854. BLOBTest (con1);
  855. Console.WriteLine ("LOB Test END.");
  856. Wait ("");
  857. Console.WriteLine ("Read Simple Test BEGIN - scott.emp...");
  858. ReadSimpleTest(con1, "SELECT e.*, e.rowid FROM scott.emp e");
  859. Console.WriteLine ("Read Simple Test END - scott.emp");
  860. Wait ("");
  861. Console.WriteLine ("DataAdapter Test BEGIN...");
  862. DataAdapterTest(con1);
  863. Console.WriteLine ("DataAdapter Test END.");
  864. Wait ("");
  865. Console.WriteLine ("Rollback Test BEGIN...");
  866. RollbackTest(con1);
  867. Console.WriteLine ("Rollback Test END.");
  868. Wait ("");
  869. Console.WriteLine ("Commit Test BEGIN...");
  870. CommitTest(con1);
  871. Console.WriteLine ("Commit Test END.");
  872. Wait ("");
  873. Console.WriteLine ("Parameter Test BEGIN...");
  874. ParameterTest(con1);
  875. ReadSimpleTest(con1, "SELECT * FROM MONO_TEST_TABLE7");
  876. Console.WriteLine ("Parameter Test END.");
  877. Wait ("");
  878. Console.WriteLine ("Stored Proc Test 1 BEGIN...");
  879. StoredProcedureTest1 (con1);
  880. ReadSimpleTest(con1, "SELECT * FROM MONO_TEST_TABLE1");
  881. Console.WriteLine ("Stored Proc Test 1 END...");
  882. Wait ("");
  883. Console.WriteLine ("Stored Proc Test 2 BEGIN...");
  884. StoredProcedureTest2 (con1);
  885. ReadSimpleTest(con1, "SELECT * FROM MONO_TEST_TABLE2");
  886. Console.WriteLine ("Stored Proc Test 2 END...");
  887. Wait ("");
  888. Console.WriteLine ("Null Aggregate Warning BEGIN test...");
  889. NullAggregateTest (con1);
  890. Console.WriteLine ("Null Aggregate Warning END test...");
  891. Console.WriteLine("Closing...");
  892. con1.Close ();
  893. Console.WriteLine("Closed.");
  894. conStr = conStr + ";pooling=true;min pool size=4;max pool size=" + MAX_CONNECTIONS.ToString ();
  895. ConnectionPoolingTest1 ();
  896. ConnectionPoolingTest2 ();
  897. Console.WriteLine("Done.");
  898. }
  899. }
  900. }