TestOracleClient.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945
  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. namespace Test.OracleClient
  29. {
  30. public class OracleTest
  31. {
  32. public OracleTest()
  33. {
  34. }
  35. static void MonoTest(OracleConnection con)
  36. {
  37. Console.WriteLine (" Drop table MONO_ORACLE_TEST ...");
  38. try {
  39. OracleCommand cmd2 = con.CreateCommand ();
  40. cmd2.CommandText = "DROP TABLE MONO_ORACLE_TEST";
  41. cmd2.ExecuteNonQuery ();
  42. }
  43. catch (OracleException oe1) {
  44. // ignore if table already exists
  45. }
  46. OracleCommand cmd = null;
  47. int rowsAffected = 0;
  48. Console.WriteLine(" Creating table MONO_ORACLE_TEST...");
  49. cmd = new OracleCommand();
  50. cmd.Connection = con;
  51. cmd.CommandText = "CREATE TABLE MONO_ORACLE_TEST ( " +
  52. " varchar2_value VarChar2(32), " +
  53. " number_whole_value Number(18), " +
  54. " number_scaled_value Number(18,2), " +
  55. " number_integer_value Integer, " +
  56. " float_value Float, " +
  57. " date_value Date, " +
  58. " char_value Char(32), " +
  59. " clob_value Clob, " +
  60. " blob_value Blob, " +
  61. " clob_empty_value Clob, " +
  62. " blob_empty_value Blob, " +
  63. " varchar2_null_value VarChar2(32), " +
  64. " number_whole_null_value Number(18), " +
  65. " number_scaled_null_value Number(18,2), " +
  66. " number_integer_null_value Integer, " +
  67. " float_null_value Float, " +
  68. " date_null_value Date, " +
  69. " char_null_value Char(32), " +
  70. " clob_null_value Clob, " +
  71. " blob_null_value Blob " +
  72. ")";
  73. rowsAffected = cmd.ExecuteNonQuery();
  74. Console.WriteLine(" Begin Trans for table MONO_ORACLE_TEST...");
  75. OracleTransaction trans = con.BeginTransaction ();
  76. Console.WriteLine(" Inserting value into MONO_ORACLE_TEST...");
  77. cmd = new OracleCommand();
  78. cmd.Connection = con;
  79. cmd.Transaction = trans;
  80. cmd.CommandText = "INSERT INTO mono_oracle_test " +
  81. " ( varchar2_value, " +
  82. " number_whole_value, " +
  83. " number_scaled_value, " +
  84. " number_integer_value, " +
  85. " float_value, " +
  86. " date_value, " +
  87. " char_value, " +
  88. " clob_value, " +
  89. " blob_value, " +
  90. " clob_empty_value, " +
  91. " blob_empty_value " +
  92. ") " +
  93. " VALUES( " +
  94. " 'Mono', " +
  95. " 123, " +
  96. " 456.78, " +
  97. " 8765, " +
  98. " 235.2, " +
  99. " TO_DATE( '2004-12-31', 'YYYY-MM-DD' ), " +
  100. " 'US', " +
  101. " EMPTY_CLOB(), " +
  102. " EMPTY_BLOB()," +
  103. " EMPTY_CLOB(), " +
  104. " EMPTY_BLOB()" +
  105. ")";
  106. rowsAffected = cmd.ExecuteNonQuery();
  107. Console.WriteLine(" Select/Update CLOB columns on table MONO_ORACLE_TEST...");
  108. // update BLOB and CLOB columns
  109. OracleCommand select = con.CreateCommand ();
  110. select.Transaction = trans;
  111. select.CommandText = "SELECT CLOB_VALUE, BLOB_VALUE FROM MONO_ORACLE_TEST FOR UPDATE";
  112. OracleDataReader reader = select.ExecuteReader ();
  113. if (!reader.Read ())
  114. Console.WriteLine ("ERROR: RECORD NOT FOUND");
  115. // update clob_value
  116. Console.WriteLine(" Update CLOB column on table MONO_ORACLE_TEST...");
  117. OracleLob clob = reader.GetOracleLob (0);
  118. byte[] bytes = null;
  119. UnicodeEncoding encoding = new UnicodeEncoding ();
  120. bytes = encoding.GetBytes ("Mono is fun!");
  121. clob.Write (bytes, 0, bytes.Length);
  122. clob.Close ();
  123. // update blob_value
  124. Console.WriteLine(" Update BLOB column on table MONO_ORACLE_TEST...");
  125. OracleLob blob = reader.GetOracleLob (1);
  126. bytes = new byte[6] { 0x31, 0x32, 0x33, 0x34, 0x35, 0x036 };
  127. blob.Write (bytes, 0, bytes.Length);
  128. blob.Close ();
  129. Console.WriteLine(" Commit trans for table MONO_ORACLE_TEST...");
  130. trans.Commit ();
  131. // OracleCommand.ExecuteReader of MONO_ORACLE_TEST table
  132. Console.WriteLine(" Read simple test for table MONO_ORACLE_TEST...");
  133. ReadSimpleTest(con, "SELECT * FROM MONO_ORACLE_TEST");
  134. // OracleCommand.ExecuteScalar
  135. Console.WriteLine(" -ExecuteScalar tests...");
  136. string varchar2_value = (string) ReadScalar (con,"SELECT MAX(varchar2_value) FROM MONO_ORACLE_TEST");
  137. Console.WriteLine(" String Value: " + varchar2_value);
  138. Console.WriteLine(" Read Scalar: number_whole_value");
  139. decimal number_whole_value = (decimal)
  140. ReadScalar (con,"SELECT MAX(number_whole_value) FROM MONO_ORACLE_TEST");
  141. Console.WriteLine(" Int32 Value: " + number_whole_value.ToString());
  142. Console.WriteLine(" Read Scalar: number_scaled_value");
  143. decimal number_scaled_value = (decimal)
  144. ReadScalar (con,"SELECT number_scaled_value FROM MONO_ORACLE_TEST");
  145. Console.WriteLine(" Decimal Value: " + number_scaled_value.ToString());
  146. Console.WriteLine(" Read Scalar: date_value");
  147. DateTime date_value = (DateTime)
  148. ReadScalar (con,"SELECT date_value FROM MONO_ORACLE_TEST");
  149. Console.WriteLine(" DateTime Value: " + date_value.ToString());
  150. Console.WriteLine(" Read Scalar: clob_value");
  151. string clob_value = (string)
  152. ReadScalar (con,"SELECT clob_value FROM MONO_ORACLE_TEST");
  153. Console.WriteLine(" CLOB Value: " + clob_value);
  154. Console.WriteLine(" Read Scalar: blob_value");
  155. byte[] blob_value = (byte[])
  156. ReadScalar (con,"SELECT blob_value FROM MONO_ORACLE_TEST");
  157. string sblob_value = GetHexString (blob_value);
  158. Console.WriteLine(" BLOB Value: " + sblob_value);
  159. // OracleCommand.ExecuteOracleScalar
  160. Console.WriteLine(" -ExecuteOracleScalar tests...");
  161. Console.WriteLine(" Read Oracle Scalar: varchar2_value");
  162. ReadOracleScalar (con,"SELECT MAX(varchar2_value) FROM MONO_ORACLE_TEST");
  163. Console.WriteLine(" Read Oracle Scalar: number_whole_value");
  164. ReadOracleScalar (con,"SELECT MAX(number_whole_value) FROM MONO_ORACLE_TEST");
  165. Console.WriteLine(" Read Oracle Scalar: number_scaled_value");
  166. ReadOracleScalar (con,"SELECT number_scaled_value FROM MONO_ORACLE_TEST");
  167. Console.WriteLine(" Read Oracle Scalar: date_value");
  168. ReadOracleScalar (con,"SELECT date_value FROM MONO_ORACLE_TEST");
  169. Console.WriteLine(" Read Oracle Scalar: clob_value");
  170. ReadOracleScalar (con,"SELECT clob_value FROM MONO_ORACLE_TEST");
  171. Console.WriteLine(" Read Oracle Scalar: blob_value");
  172. ReadOracleScalar (con,"SELECT blob_value FROM MONO_ORACLE_TEST");
  173. }
  174. static object ReadScalar (OracleConnection con, string selectSql)
  175. {
  176. OracleCommand cmd = null;
  177. cmd = con.CreateCommand();
  178. cmd.CommandText = selectSql;
  179. object o = cmd.ExecuteScalar ();
  180. string dataType = o.GetType ().ToString ();
  181. Console.WriteLine (" DataType: " + dataType);
  182. return o;
  183. }
  184. static void ReadOracleScalar (OracleConnection con, string selectSql)
  185. {
  186. OracleCommand cmd = null;
  187. cmd = con.CreateCommand();
  188. cmd.CommandText = selectSql;
  189. object o = cmd.ExecuteOracleScalar ();
  190. string dataType = o.GetType ().ToString ();
  191. Console.WriteLine (" DataType: " + dataType);
  192. if (dataType.Equals("System.Data.OracleClient.OracleLob"))
  193. o = ((OracleLob) o).Value;
  194. if (o.GetType ().ToString ().Equals ("System.Byte[]"))
  195. o = GetHexString ((byte[])o);
  196. Console.WriteLine (" Value: " + o.ToString ());
  197. }
  198. static void ReadSimpleTest(OracleConnection con, string selectSql)
  199. {
  200. OracleCommand cmd = null;
  201. OracleDataReader reader = null;
  202. cmd = con.CreateCommand();
  203. cmd.CommandText = selectSql;
  204. reader = cmd.ExecuteReader();
  205. Console.WriteLine(" Results...");
  206. Console.WriteLine(" Schema");
  207. DataTable table;
  208. table = reader.GetSchemaTable();
  209. for(int c = 0; c < reader.FieldCount; c++) {
  210. Console.WriteLine(" Column " + c.ToString());
  211. DataRow row = table.Rows[c];
  212. string strColumnName = row["ColumnName"].ToString();
  213. string strBaseColumnName = row["BaseColumnName"].ToString();
  214. string strColumnSize = row["ColumnSize"].ToString();
  215. string strNumericScale = row["NumericScale"].ToString();
  216. string strNumericPrecision = row["NumericPrecision"].ToString();
  217. string strDataType = row["DataType"].ToString();
  218. Console.WriteLine(" ColumnName: " + strColumnName);
  219. Console.WriteLine(" BaseColumnName: " + strBaseColumnName);
  220. Console.WriteLine(" ColumnSize: " + strColumnSize);
  221. Console.WriteLine(" NumericScale: " + strNumericScale);
  222. Console.WriteLine(" NumericPrecision: " + strNumericPrecision);
  223. Console.WriteLine(" DataType: " + strDataType);
  224. }
  225. int r = 0;
  226. Console.WriteLine (" Data");
  227. while (reader.Read ()) {
  228. r++;
  229. Console.WriteLine (" Row: " + r.ToString ());
  230. for (int f = 0; f < reader.FieldCount; f++) {
  231. string sname = "";
  232. object ovalue = "";
  233. string svalue = "";
  234. string sDataType = "";
  235. string sFieldType = "";
  236. string sDataTypeName = "";
  237. string sOraDataType = "";
  238. sname = reader.GetName (f);
  239. if (reader.IsDBNull (f)) {
  240. ovalue = DBNull.Value;
  241. svalue = "";
  242. sDataType = "DBNull.Value";
  243. sOraDataType = "DBNull.Value";
  244. }
  245. else {
  246. ovalue = reader.GetOracleValue (f);
  247. object oravalue = null;
  248. sDataType = ovalue.GetType ().ToString ();
  249. switch (sDataType) {
  250. case "System.Data.OracleClient.OracleString":
  251. oravalue = ((OracleString) ovalue).Value;
  252. break;
  253. case "System.Data.OracleClient.OracleNumber":
  254. oravalue = ((OracleNumber) ovalue).Value;
  255. break;
  256. case "System.Data.OracleClient.OracleLob":
  257. OracleLob lob = (OracleLob) ovalue;
  258. oravalue = lob.Value;
  259. lob.Close ();
  260. break;
  261. case "System.Data.OracleClient.OracleDateTime":
  262. oravalue = ((OracleDateTime) ovalue).Value;
  263. break;
  264. default:
  265. oravalue = "*** no test available ***";
  266. break;
  267. }
  268. sOraDataType = oravalue.GetType ().ToString ();
  269. if (sOraDataType.Equals ("System.Byte[]"))
  270. svalue = GetHexString ((byte[]) oravalue);
  271. else
  272. svalue = oravalue.ToString();
  273. }
  274. sFieldType = reader.GetFieldType(f).ToString();
  275. sDataTypeName = reader.GetDataTypeName(f);
  276. Console.WriteLine(" Field: " + f.ToString());
  277. Console.WriteLine(" Name: " + sname);
  278. Console.WriteLine(" Value: " + svalue);
  279. Console.WriteLine(" Oracle Data Type: " + sOraDataType);
  280. Console.WriteLine(" Data Type: " + sDataType);
  281. Console.WriteLine(" Field Type: " + sFieldType);
  282. Console.WriteLine(" Data Type Name: " + sDataTypeName);
  283. }
  284. }
  285. if(r == 0)
  286. Console.WriteLine(" No data returned.");
  287. }
  288. static void DataAdapterTest (OracleConnection connection)
  289. {
  290. Console.WriteLine(" Create select command...");
  291. OracleCommand command = connection.CreateCommand ();
  292. command.CommandText = "SELECT * FROM EMP";
  293. Console.WriteLine(" Create data adapter...");
  294. OracleDataAdapter adapter = new OracleDataAdapter (command);
  295. Console.WriteLine(" Create DataSet...");
  296. DataSet dataSet = new DataSet ("EMP");
  297. Console.WriteLine(" Fill DataSet via data adapter...");
  298. adapter.Fill (dataSet);
  299. Console.WriteLine(" Get DataTable...");
  300. DataTable table = dataSet.Tables [0];
  301. Console.WriteLine(" Display each row...");
  302. int rowCount = 0;
  303. foreach (DataRow row in table.Rows) {
  304. Console.WriteLine (" row {0}", rowCount + 1);
  305. for (int i = 0; i < table.Columns.Count; i += 1) {
  306. Console.WriteLine (" {0}: {1}", table.Columns [i].ColumnName, row [i]);
  307. }
  308. Console.WriteLine ();
  309. rowCount += 1;
  310. }
  311. }
  312. static void RollbackTest (OracleConnection connection)
  313. {
  314. OracleTransaction transaction = connection.BeginTransaction ();
  315. OracleCommand insert = connection.CreateCommand ();
  316. insert.Transaction = transaction;
  317. insert.CommandText = "INSERT INTO EMP (EMPNO, ENAME, JOB) VALUES (8787, 'T Coleman', 'Monoist')";
  318. Console.WriteLine (" Inserting record ...");
  319. insert.ExecuteNonQuery ();
  320. OracleCommand select = connection.CreateCommand ();
  321. select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
  322. select.Transaction = transaction;
  323. OracleDataReader reader = select.ExecuteReader ();
  324. reader.Read ();
  325. Console.WriteLine (" Row count SHOULD BE 1, VALUE IS {0}", reader.GetValue (0));
  326. reader.Close ();
  327. Console.WriteLine (" Rolling back transaction ...");
  328. transaction.Rollback ();
  329. select = connection.CreateCommand ();
  330. select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
  331. reader = select.ExecuteReader ();
  332. reader.Read ();
  333. Console.WriteLine (" Row count SHOULD BE 0, VALUE IS {0}", reader.GetValue (0));
  334. reader.Close ();
  335. }
  336. static void CommitTest (OracleConnection connection)
  337. {
  338. OracleTransaction transaction = connection.BeginTransaction ();
  339. OracleCommand insert = connection.CreateCommand ();
  340. insert.Transaction = transaction;
  341. insert.CommandText = "INSERT INTO EMP (EMPNO, ENAME, JOB) VALUES (8787, 'T Coleman', 'Monoist')";
  342. Console.WriteLine (" Inserting record ...");
  343. insert.ExecuteNonQuery ();
  344. OracleCommand select = connection.CreateCommand ();
  345. select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
  346. select.Transaction = transaction;
  347. Console.WriteLine (" Row count SHOULD BE 1, VALUE IS {0}", select.ExecuteScalar ());
  348. Console.WriteLine (" Committing transaction ...");
  349. transaction.Commit ();
  350. select = connection.CreateCommand ();
  351. select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
  352. Console.WriteLine ("Row count SHOULD BE 1, VALUE IS {0}", select.ExecuteScalar ());
  353. transaction = connection.BeginTransaction ();
  354. OracleCommand delete = connection.CreateCommand ();
  355. delete.Transaction = transaction;
  356. delete.CommandText = "DELETE FROM EMP WHERE EMPNO = 8787";
  357. delete.ExecuteNonQuery ();
  358. transaction.Commit ();
  359. }
  360. public static void ParameterTest (OracleConnection connection)
  361. {
  362. OracleTransaction transaction = connection.BeginTransaction ();
  363. OracleCommand insert = connection.CreateCommand ();
  364. insert.Transaction = transaction;
  365. insert.CommandText = "INSERT INTO EMP (EMPNO, ENAME, JOB) VALUES (:P1, :P2, :P3)";
  366. insert.Parameters.Add (":P1", 8888);
  367. insert.Parameters.Add (":P2", "danmorg");
  368. insert.Parameters.Add (":P3", "Monoist");
  369. Console.WriteLine (" INSERTING DATA WITH PARAMETERS...");
  370. Console.WriteLine (" " + insert.CommandText);
  371. insert.Prepare ();
  372. insert.ExecuteNonQuery ();
  373. OracleCommand select = connection.CreateCommand ();
  374. select.Transaction = transaction;
  375. select.CommandText = "SELECT ENAME, JOB FROM EMP WHERE EMPNO=:P1";
  376. select.Parameters.Add (":P1", 8888);
  377. Console.WriteLine (" VERIFYING RESULTS ...");
  378. OracleDataReader reader = select.ExecuteReader ();
  379. if (!reader.Read ())
  380. Console.WriteLine ("ERROR: RECORD NOT FOUND");
  381. Console.WriteLine (" ENAME - SHOULD BE danmorg, is {0}", reader.GetValue (0));
  382. Console.WriteLine (" JOB - SHOULD BE Monoist, is {0}", reader.GetValue (1));
  383. reader.Close ();
  384. Console.WriteLine (" ROLLBACK TRANSACTION...");
  385. transaction.Rollback ();
  386. }
  387. public static void CLOBTest (OracleConnection connection)
  388. {
  389. Console.WriteLine (" BEGIN TRANSACTION ...");
  390. OracleTransaction transaction = connection.BeginTransaction ();
  391. Console.WriteLine (" Drop table CLOBTEST ...");
  392. try {
  393. OracleCommand cmd2 = connection.CreateCommand ();
  394. cmd2.Transaction = transaction;
  395. cmd2.CommandText = "DROP TABLE CLOBTEST";
  396. cmd2.ExecuteNonQuery ();
  397. }
  398. catch (OracleException oe1) {
  399. // ignore if table already exists
  400. }
  401. Console.WriteLine (" CREATE TABLE ...");
  402. OracleCommand create = connection.CreateCommand ();
  403. create.Transaction = transaction;
  404. create.CommandText = "CREATE TABLE CLOBTEST (CLOB_COLUMN CLOB)";
  405. create.ExecuteNonQuery ();
  406. Console.WriteLine (" INSERT RECORD ...");
  407. OracleCommand insert = connection.CreateCommand ();
  408. insert.Transaction = transaction;
  409. insert.CommandText = "INSERT INTO CLOBTEST VALUES (EMPTY_CLOB())";
  410. insert.ExecuteNonQuery ();
  411. OracleCommand select = connection.CreateCommand ();
  412. select.Transaction = transaction;
  413. select.CommandText = "SELECT CLOB_COLUMN FROM CLOBTEST FOR UPDATE";
  414. Console.WriteLine (" SELECTING A CLOB (CHARACTER) VALUE FROM CLOBTEST");
  415. OracleDataReader reader = select.ExecuteReader ();
  416. if (!reader.Read ())
  417. Console.WriteLine ("ERROR: RECORD NOT FOUND");
  418. Console.WriteLine (" TESTING OracleLob OBJECT ...");
  419. OracleLob lob = reader.GetOracleLob (0);
  420. Console.WriteLine (" LENGTH: {0}", lob.Length);
  421. Console.WriteLine (" CHUNK SIZE: {0}", lob.ChunkSize);
  422. UnicodeEncoding encoding = new UnicodeEncoding ();
  423. byte[] value = new byte [lob.Length * 2];
  424. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  425. Console.WriteLine (" UPDATING VALUE TO 'TEST ME!'");
  426. value = encoding.GetBytes ("TEST ME!");
  427. lob.Write (value, 0, value.Length);
  428. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  429. Console.WriteLine (" RE-READ VALUE...");
  430. lob.Seek (1, SeekOrigin.Begin);
  431. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  432. value = new byte [lob.Length * 2];
  433. lob.Read (value, 0, value.Length);
  434. Console.WriteLine (" VALUE: {0}", encoding.GetString (value));
  435. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  436. Console.WriteLine (" CLOSE OracleLob...");
  437. lob.Close ();
  438. Console.WriteLine (" CLOSING READER...");
  439. reader.Close ();
  440. transaction.Commit ();
  441. }
  442. public static void BLOBTest (OracleConnection connection)
  443. {
  444. Console.WriteLine (" BEGIN TRANSACTION ...");
  445. OracleTransaction transaction = connection.BeginTransaction ();
  446. Console.WriteLine (" Drop table BLOBTEST ...");
  447. try {
  448. OracleCommand cmd2 = connection.CreateCommand ();
  449. cmd2.Transaction = transaction;
  450. cmd2.CommandText = "DROP TABLE BLOBTEST";
  451. cmd2.ExecuteNonQuery ();
  452. }
  453. catch (OracleException oe1) {
  454. // ignore if table already exists
  455. }
  456. Console.WriteLine (" CREATE TABLE ...");
  457. OracleCommand create = connection.CreateCommand ();
  458. create.Transaction = transaction;
  459. create.CommandText = "CREATE TABLE BLOBTEST (BLOB_COLUMN BLOB)";
  460. create.ExecuteNonQuery ();
  461. Console.WriteLine (" INSERT RECORD ...");
  462. OracleCommand insert = connection.CreateCommand ();
  463. insert.Transaction = transaction;
  464. insert.CommandText = "INSERT INTO BLOBTEST VALUES (EMPTY_BLOB())";
  465. insert.ExecuteNonQuery ();
  466. OracleCommand select = connection.CreateCommand ();
  467. select.Transaction = transaction;
  468. select.CommandText = "SELECT BLOB_COLUMN FROM BLOBTEST FOR UPDATE";
  469. Console.WriteLine (" SELECTING A BLOB (Binary) VALUE FROM BLOBTEST");
  470. OracleDataReader reader = select.ExecuteReader ();
  471. if (!reader.Read ())
  472. Console.WriteLine ("ERROR: RECORD NOT FOUND");
  473. Console.WriteLine (" TESTING OracleLob OBJECT ...");
  474. OracleLob lob = reader.GetOracleLob (0);
  475. byte[] value = null;
  476. string bvalue = "";
  477. Console.WriteLine (" UPDATING VALUE");
  478. byte[] bytes = new byte[6];
  479. bytes[0] = 0x31;
  480. bytes[1] = 0x32;
  481. bytes[2] = 0x33;
  482. bytes[3] = 0x34;
  483. bytes[4] = 0x35;
  484. bytes[5] = 0x36;
  485. lob.Write (bytes, 0, bytes.Length);
  486. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  487. Console.WriteLine (" RE-READ VALUE...");
  488. lob.Seek (1, SeekOrigin.Begin);
  489. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  490. value = new byte [lob.Length];
  491. lob.Read (value, 0, value.Length);
  492. bvalue = "";
  493. if (value.GetType ().ToString ().Equals ("System.Byte[]"))
  494. bvalue = GetHexString (value);
  495. Console.WriteLine (" Bytes: " + bvalue);
  496. Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
  497. Console.WriteLine (" CLOSE OracleLob...");
  498. lob.Close ();
  499. Console.WriteLine (" CLOSING READER...");
  500. reader.Close ();
  501. transaction.Commit ();
  502. }
  503. static void Wait(string msg)
  504. {
  505. Console.WriteLine(msg);
  506. if (msg.Equals(""))
  507. Console.WriteLine("Waiting... Press Enter to continue...");
  508. string nothing = Console.ReadLine();
  509. }
  510. // use this function to read a byte array into a string
  511. // for easy display of binary data, such as, a BLOB value
  512. public static string GetHexString (byte[] bytes)
  513. {
  514. string bvalue = "";
  515. StringBuilder sb2 = new StringBuilder();
  516. for (int z = 0; z < bytes.Length; z++) {
  517. byte byt = bytes[z];
  518. sb2.Append (byt.ToString("x"));
  519. }
  520. if (sb2.Length > 0)
  521. bvalue = "0x" + sb2.ToString ();
  522. return bvalue;
  523. }
  524. static void StoredProcedureTest1 (OracleConnection con)
  525. {
  526. // test stored procedure with no parameters
  527. OracleCommand cmd2 = con.CreateCommand ();
  528. Console.WriteLine(" Drop table MONO_TEST_TABLE1...");
  529. try {
  530. cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE1";
  531. cmd2.ExecuteNonQuery ();
  532. }
  533. catch(OracleException oe1) {
  534. // ignore if table did not exist
  535. }
  536. Console.WriteLine(" Drop procedure SP_TEST1...");
  537. try {
  538. cmd2.CommandText = "DROP PROCEDURE SP_TEST1";
  539. cmd2.ExecuteNonQuery ();
  540. }
  541. catch(OracleException oe1) {
  542. // ignore if procedure did not exist
  543. }
  544. Console.WriteLine(" Create table MONO_TEST_TABLE1...");
  545. cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE1 (" +
  546. " COL1 VARCHAR2(8), "+
  547. " COL2 VARCHAR2(32))";
  548. cmd2.ExecuteNonQuery ();
  549. Console.WriteLine(" Create stored procedure SP_TEST1...");
  550. cmd2.CommandText = "CREATE PROCEDURE SP_TEST1 " +
  551. " IS " +
  552. " BEGIN " +
  553. " INSERT INTO MONO_TEST_TABLE1 (COL1,COL2) VALUES ('aaa','bbbb');" +
  554. " COMMIT;" +
  555. " END;";
  556. cmd2.ExecuteNonQuery ();
  557. Console.WriteLine("COMMIT...");
  558. cmd2.CommandText = "COMMIT";
  559. cmd2.ExecuteNonQuery ();
  560. Console.WriteLine(" Call stored procedure sp_test1...");
  561. OracleCommand cmd3 = con.CreateCommand ();
  562. cmd3.CommandType = CommandType.StoredProcedure;
  563. cmd3.CommandText = "sp_test1";
  564. cmd3.ExecuteNonQuery ();
  565. }
  566. static void StoredProcedureTest2 (OracleConnection con)
  567. {
  568. // test stored procedure with 2 parameters
  569. Console.WriteLine(" Drop table MONO_TEST_TABLE2...");
  570. OracleCommand cmd2 = con.CreateCommand ();
  571. try {
  572. cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE2";
  573. cmd2.ExecuteNonQuery ();
  574. }
  575. catch(OracleException oe1) {
  576. // ignore if table already exists
  577. }
  578. Console.WriteLine(" Drop procedure SP_TEST2...");
  579. try {
  580. cmd2.CommandText = "DROP PROCEDURE SP_TEST2";
  581. cmd2.ExecuteNonQuery ();
  582. }
  583. catch(OracleException oe1) {
  584. // ignore if table already exists
  585. }
  586. Console.WriteLine(" Create table MONO_TEST_TABLE2...");
  587. cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE2 (" +
  588. " COL1 VARCHAR2(8), "+
  589. " COL2 VARCHAR2(32))";
  590. cmd2.ExecuteNonQuery ();
  591. Console.WriteLine(" Create stored procedure SP_TEST2...");
  592. cmd2.CommandText = "CREATE PROCEDURE SP_TEST2(parm1 VARCHAR2,parm2 VARCHAR2) " +
  593. " IS " +
  594. " BEGIN " +
  595. " INSERT INTO MONO_TEST_TABLE2 (COL1,COL2) VALUES (parm1,parm2);" +
  596. " COMMIT;" +
  597. " END;";
  598. cmd2.ExecuteNonQuery ();
  599. Console.WriteLine(" COMMIT...");
  600. cmd2.CommandText = "COMMIT";
  601. cmd2.ExecuteNonQuery ();
  602. Console.WriteLine(" Call stored procedure SP_TEST2 with two parameters...");
  603. OracleCommand cmd3 = con.CreateCommand ();
  604. cmd3.CommandType = CommandType.StoredProcedure;
  605. cmd3.CommandText = "sp_test2";
  606. OracleParameter myParameter1 = new OracleParameter("parm1", OracleType.VarChar);
  607. myParameter1.Value = "yyy13";
  608. myParameter1.Size = 8;
  609. myParameter1.Direction = ParameterDirection.Input;
  610. OracleParameter myParameter2 = new OracleParameter("parm2", OracleType.VarChar);
  611. myParameter2.Value = "iii13";
  612. myParameter2.Size = 32;
  613. myParameter2.Direction = ParameterDirection.Input;
  614. cmd3.Parameters.Add (myParameter1);
  615. cmd3.Parameters.Add (myParameter2);
  616. cmd3.ExecuteNonQuery ();
  617. }
  618. static void ShowConnectionProperties (OracleConnection con)
  619. {
  620. IDbConnection dbcon = (IDbConnection) con;
  621. try {
  622. Console.WriteLine ("ServerVersion: " + con.ServerVersion);
  623. } catch (System.InvalidOperationException ioe) {
  624. Console.WriteLine ("InvalidOperationException caught.");
  625. Console.WriteLine ("Message: " + ioe.Message);
  626. }
  627. Console.WriteLine ("DataSource: " + con.DataSource);
  628. }
  629. static void NullAggregateTest (OracleConnection con)
  630. {
  631. Console.WriteLine(" Drop table MONO_TEST_TABLE3...");
  632. OracleCommand cmd2 = con.CreateCommand ();
  633. try {
  634. cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE3";
  635. cmd2.ExecuteNonQuery ();
  636. }
  637. catch(OracleException oe1) {
  638. // ignore if table already exists
  639. }
  640. Console.WriteLine(" Create table MONO_TEST_TABLE3...");
  641. cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE3 (" +
  642. " COL1 VARCHAR2(8), "+
  643. " COL2 VARCHAR2(32))";
  644. cmd2.ExecuteNonQuery ();
  645. Console.WriteLine(" Insert some rows into table MONO_TEST_TABLE3...");
  646. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('1','one')";
  647. cmd2.ExecuteNonQuery ();
  648. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('1','uno')";
  649. cmd2.ExecuteNonQuery ();
  650. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3','three')";
  651. cmd2.ExecuteNonQuery ();
  652. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3', null)";
  653. cmd2.ExecuteNonQuery ();
  654. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3','few')";
  655. cmd2.ExecuteNonQuery ();
  656. Console.WriteLine(" ExecuteScalar...");
  657. cmd2.CommandText = "SELECT COL1, COUNT(COL2) AS MAX_COL1 FROM MONO_TEST_TABLE3 GROUP BY COL1";
  658. OracleDataReader reader = cmd2.ExecuteReader ();
  659. Console.WriteLine (" Read...");
  660. while (reader.Read ()) {
  661. object obj0 = reader.GetValue (0);
  662. Console.WriteLine("Value 0: " + obj0.ToString ());
  663. object obj1 = reader.GetValue (1);
  664. Console.WriteLine("Value 1: " + obj1.ToString ());
  665. Console.WriteLine (" Read...");
  666. }
  667. Console.WriteLine (" No more records.");
  668. }
  669. static void OnInfoMessage (object sender, OracleInfoMessageEventArgs e)
  670. {
  671. Console.WriteLine("InfoMessage Message: " + e.Message.ToString());
  672. Console.WriteLine("InfoMessage Code: " + e.Code.ToString());
  673. Console.WriteLine("InfoMessage Source: " + e.Source.ToString());
  674. }
  675. static void OnStateChange (object sender, StateChangeEventArgs e)
  676. {
  677. Console.WriteLine("StateChange CurrentSate:" + e.CurrentState.ToString ());
  678. Console.WriteLine("StateChange OriginalState:" + e.OriginalState.ToString ());
  679. }
  680. [STAThread]
  681. static void Main(string[] args)
  682. {
  683. args = new string[3] { "palis", "scott", "tiger" };
  684. if(args.Length != 3) {
  685. Console.WriteLine("Usage: mono TestOracleClient database userid password");
  686. return;
  687. }
  688. string connectionString = String.Format(
  689. "Data Source={0};" +
  690. "User ID={1};" +
  691. "Password={2}",
  692. args[0], args[1], args[2]);
  693. OracleConnection con1 = new OracleConnection();
  694. ShowConnectionProperties (con1);
  695. con1.ConnectionString = connectionString;
  696. con1.InfoMessage += new OracleInfoMessageEventHandler (OnInfoMessage);
  697. con1.StateChange += new StateChangeEventHandler (OnStateChange);
  698. Console.WriteLine("Opening...");
  699. con1.Open ();
  700. Console.WriteLine("Opened.");
  701. ShowConnectionProperties (con1);
  702. Console.WriteLine ("Mono Oracle Test BEGIN ...");
  703. MonoTest (con1);
  704. Console.WriteLine ("Mono Oracle Test END ...");
  705. Wait ("");
  706. Console.WriteLine ("LOB Test BEGIN...");
  707. CLOBTest (con1);
  708. BLOBTest (con1);
  709. Console.WriteLine ("LOB Test END.");
  710. Wait ("");
  711. Console.WriteLine ("Read Simple Test BEGIN - scott.emp...");
  712. ReadSimpleTest(con1, "SELECT e.*, e.rowid FROM scott.emp e");
  713. Console.WriteLine ("Read Simple Test END - scott.emp");
  714. Wait ("");
  715. Console.WriteLine ("DataAdapter Test BEGIN...");
  716. DataAdapterTest(con1);
  717. Console.WriteLine ("DataAdapter Test END.");
  718. Wait ("");
  719. Console.WriteLine ("Rollback Test BEGIN...");
  720. RollbackTest(con1);
  721. Console.WriteLine ("Rollback Test END.");
  722. Wait ("");
  723. Console.WriteLine ("Commit Test BEGIN...");
  724. CommitTest(con1);
  725. Console.WriteLine ("Commit Test END.");
  726. Wait ("");
  727. Console.WriteLine ("Parameter Test BEGIN...");
  728. ParameterTest(con1);
  729. Console.WriteLine ("Parameter Test END.");
  730. Wait ("");
  731. Console.WriteLine ("Stored Proc Test 1 BEGIN...");
  732. StoredProcedureTest1 (con1);
  733. ReadSimpleTest(con1, "SELECT * FROM MONO_TEST_TABLE1");
  734. Console.WriteLine ("Stored Proc Test 1 END...");
  735. Wait ("");
  736. Console.WriteLine ("Stored Proc Test 2 BEGIN...");
  737. StoredProcedureTest2 (con1);
  738. ReadSimpleTest(con1, "SELECT * FROM MONO_TEST_TABLE2");
  739. Console.WriteLine ("Stored Proc Test 2 END...");
  740. Wait ("");
  741. Console.WriteLine ("Null Aggregate Warning BEGIN test...");
  742. NullAggregateTest (con1);
  743. Console.WriteLine ("Null Aggregate Warning END test...");
  744. Console.WriteLine("Closing...");
  745. con1.Close ();
  746. Console.WriteLine("Closed.");
  747. Console.WriteLine("Done.");
  748. }
  749. }
  750. }