TestOracleClient.cs 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316
  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 OutParmTest1 (OracleConnection con)
  696. {
  697. // test stored procedure with 2 parameters
  698. // 1. input varchar2
  699. // 2. output varchar
  700. OracleCommand cmd2 = null;
  701. Console.WriteLine(" Drop procedure SP_OUTPUTPARMTEST1...");
  702. try {
  703. cmd2 = con.CreateCommand ();
  704. cmd2.CommandText = "DROP PROCEDURE SP_OUTPUTPARMTEST1";
  705. cmd2.ExecuteNonQuery ();
  706. }
  707. catch(OracleException oe1) {
  708. // ignore if table already exists
  709. }
  710. Console.WriteLine(" Create stored procedure SP_OUTPUTPARMTEST1...");
  711. // stored procedure concatenates strings
  712. cmd2.CommandText =
  713. "CREATE OR REPLACE PROCEDURE SP_TESTOUTPARM1(parm1 IN VARCHAR2,parm2 OUT VARCHAR2) " +
  714. "IS " +
  715. "BEGIN " +
  716. " parm2 := 'one' || parm1 || 'three';" +
  717. "END;";
  718. cmd2.ExecuteNonQuery ();
  719. Console.WriteLine(" COMMIT...");
  720. cmd2.CommandText = "COMMIT";
  721. cmd2.ExecuteNonQuery ();
  722. Console.WriteLine(" Call stored procedure SP_TESTOUTPARM1 with two parameters...");
  723. OracleCommand cmd3 = con.CreateCommand ();
  724. cmd3.CommandType = CommandType.Text;
  725. cmd3.CommandText =
  726. "BEGIN " +
  727. " SP_TESTOUTPARM1(:p1, :p2);" +
  728. "END;";
  729. OracleParameter myParameter1 = new OracleParameter("p1", OracleType.VarChar);
  730. myParameter1.Value = "two";
  731. myParameter1.Size = 4;
  732. myParameter1.Direction = ParameterDirection.Input;
  733. OracleParameter myParameter2 = new OracleParameter("p2", OracleType.VarChar);
  734. myParameter2.Size = 12;
  735. myParameter2.Direction = ParameterDirection.Output;
  736. cmd3.Parameters.Add (myParameter1);
  737. cmd3.Parameters.Add (myParameter2);
  738. cmd3.ExecuteNonQuery ();
  739. string outValue = (string) myParameter2.Value;
  740. Console.WriteLine (" Out Value should be: onetwothree");
  741. Console.WriteLine (" Out Value: " + outValue);
  742. }
  743. static void OutParmTest2 (OracleConnection con)
  744. {
  745. // test stored procedure with 2 parameters
  746. // 1. input number(18,2)
  747. // 2. output number(18,2)
  748. OracleCommand cmd2 = null;
  749. Console.WriteLine(" Drop procedure SP_OUTPUTPARMTEST2...");
  750. try {
  751. cmd2 = con.CreateCommand ();
  752. cmd2.CommandText = "DROP PROCEDURE SP_OUTPUTPARMTEST2";
  753. cmd2.ExecuteNonQuery ();
  754. }
  755. catch(OracleException oe1) {
  756. // ignore if table already exists
  757. }
  758. Console.WriteLine(" Create stored procedure SP_OUTPUTPARMTEST2...");
  759. // stored procedure addes two numbers
  760. cmd2.CommandText =
  761. "CREATE OR REPLACE PROCEDURE SP_TESTOUTPARM2(parm1 IN NUMBER,parm2 OUT NUMBER) " +
  762. "IS " +
  763. "BEGIN " +
  764. " parm2 := parm1 + 3; " +
  765. "END;";
  766. cmd2.ExecuteNonQuery ();
  767. Console.WriteLine(" COMMIT...");
  768. cmd2.CommandText = "COMMIT";
  769. cmd2.ExecuteNonQuery ();
  770. Console.WriteLine(" Call stored procedure SP_TESTOUTPARM2 with two parameters...");
  771. OracleCommand cmd3 = con.CreateCommand ();
  772. cmd3.CommandType = CommandType.Text;
  773. cmd3.CommandText =
  774. "BEGIN " +
  775. " SP_TESTOUTPARM2(:p1, :p2);" +
  776. "END;";
  777. OracleParameter myParameter1 = new OracleParameter("p1", OracleType.Number);
  778. myParameter1.Value = 2;
  779. myParameter1.Direction = ParameterDirection.Input;
  780. OracleParameter myParameter2 = new OracleParameter("p2", OracleType.Number);
  781. myParameter2.Direction = ParameterDirection.Output;
  782. cmd3.Parameters.Add (myParameter1);
  783. cmd3.Parameters.Add (myParameter2);
  784. cmd3.ExecuteNonQuery ();
  785. decimal outValue = (decimal) myParameter2.Value;
  786. Console.WriteLine (" Out Value should be: 5");
  787. Console.WriteLine (" Out Value: {0}", outValue);
  788. }
  789. static void OutParmTest3 (OracleConnection con)
  790. {
  791. // test stored procedure with 2 parameters
  792. // 1. input date
  793. // 2. output date
  794. OracleCommand cmd2 = null;
  795. Console.WriteLine(" Drop procedure SP_OUTPUTPARMTEST3...");
  796. try {
  797. cmd2 = con.CreateCommand ();
  798. cmd2.CommandText = "DROP PROCEDURE SP_OUTPUTPARMTEST3";
  799. cmd2.ExecuteNonQuery ();
  800. }
  801. catch(OracleException oe1) {
  802. // ignore if table already exists
  803. }
  804. Console.WriteLine(" Create stored procedure SP_OUTPUTPARMTEST3...");
  805. // stored procedure adds 3 days to date
  806. cmd2.CommandText =
  807. "CREATE OR REPLACE PROCEDURE SP_TESTOUTPARM3(parm1 IN DATE,parm2 OUT DATE) " +
  808. "IS " +
  809. "BEGIN " +
  810. " parm2 := parm1 + 3; " +
  811. "END;";
  812. cmd2.ExecuteNonQuery ();
  813. Console.WriteLine(" COMMIT...");
  814. cmd2.CommandText = "COMMIT";
  815. cmd2.ExecuteNonQuery ();
  816. Console.WriteLine(" Call stored procedure SP_TESTOUTPARM3 with two parameters...");
  817. OracleCommand cmd3 = con.CreateCommand ();
  818. cmd3.CommandType = CommandType.Text;
  819. cmd3.CommandText =
  820. "BEGIN " +
  821. " SP_TESTOUTPARM3(:p1, :p2);" +
  822. "END;";
  823. OracleParameter myParameter1 = new OracleParameter("p1", OracleType.DateTime);
  824. myParameter1.Value = new DateTime(2004,12,15);
  825. myParameter1.Direction = ParameterDirection.Input;
  826. OracleParameter myParameter2 = new OracleParameter("p2", OracleType.DateTime);
  827. myParameter2.Direction = ParameterDirection.Output;
  828. cmd3.Parameters.Add (myParameter1);
  829. cmd3.Parameters.Add (myParameter2);
  830. cmd3.ExecuteNonQuery ();
  831. DateTime outValue = (DateTime) myParameter2.Value;
  832. Console.WriteLine (" Out Value should be: 2004-12-18");
  833. Console.WriteLine (" Out Value: {0}", outValue.ToString ("yyyy-mm-dd"));
  834. }
  835. static void ShowConnectionProperties (OracleConnection con)
  836. {
  837. try {
  838. Console.WriteLine ("ServerVersion: " + con.ServerVersion);
  839. } catch (System.InvalidOperationException ioe) {
  840. Console.WriteLine ("InvalidOperationException caught.");
  841. Console.WriteLine ("Message: " + ioe.Message);
  842. }
  843. Console.WriteLine ("DataSource: " + con.DataSource);
  844. }
  845. static void NullAggregateTest (OracleConnection con)
  846. {
  847. Console.WriteLine(" Drop table MONO_TEST_TABLE3...");
  848. OracleCommand cmd2 = con.CreateCommand ();
  849. try {
  850. cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE3";
  851. cmd2.ExecuteNonQuery ();
  852. }
  853. catch(OracleException oe1) {
  854. // ignore if table already exists
  855. }
  856. Console.WriteLine(" Create table MONO_TEST_TABLE3...");
  857. cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE3 (" +
  858. " COL1 VARCHAR2(8), "+
  859. " COL2 VARCHAR2(32))";
  860. cmd2.ExecuteNonQuery ();
  861. Console.WriteLine(" Insert some rows into table MONO_TEST_TABLE3...");
  862. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('1','one')";
  863. cmd2.ExecuteNonQuery ();
  864. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('1','uno')";
  865. cmd2.ExecuteNonQuery ();
  866. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3','three')";
  867. cmd2.ExecuteNonQuery ();
  868. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3', null)";
  869. cmd2.ExecuteNonQuery ();
  870. cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3','few')";
  871. cmd2.ExecuteNonQuery ();
  872. Console.WriteLine(" ExecuteScalar...");
  873. cmd2.CommandText = "SELECT COL1, COUNT(COL2) AS MAX_COL1 FROM MONO_TEST_TABLE3 GROUP BY COL1";
  874. OracleDataReader reader = cmd2.ExecuteReader ();
  875. Console.WriteLine (" Read...");
  876. while (reader.Read ()) {
  877. object obj0 = reader.GetValue (0);
  878. Console.WriteLine("Value 0: " + obj0.ToString ());
  879. object obj1 = reader.GetValue (1);
  880. Console.WriteLine("Value 1: " + obj1.ToString ());
  881. Console.WriteLine (" Read...");
  882. }
  883. Console.WriteLine (" No more records.");
  884. }
  885. static void OnInfoMessage (object sender, OracleInfoMessageEventArgs e)
  886. {
  887. Console.WriteLine("InfoMessage Message: " + e.Message.ToString());
  888. Console.WriteLine("InfoMessage Code: " + e.Code.ToString());
  889. Console.WriteLine("InfoMessage Source: " + e.Source.ToString());
  890. }
  891. static void OnStateChange (object sender, StateChangeEventArgs e)
  892. {
  893. Console.WriteLine("StateChange CurrentSate:" + e.CurrentState.ToString ());
  894. Console.WriteLine("StateChange OriginalState:" + e.OriginalState.ToString ());
  895. }
  896. public static void ConnectionPoolingTest1 () {
  897. Console.WriteLine("Start Connection Pooling Test 1...");
  898. OracleConnection[] connections = null;
  899. int maxCon = MAX_CONNECTIONS + 1; // add 1 more over the max connections to cause it to wait for the next available connection
  900. int i = 0;
  901. try {
  902. connections = new OracleConnection[maxCon];
  903. for (i = 0; i < maxCon; i++) {
  904. Console.WriteLine(" Open connection: {0}", i);
  905. connections[i] = new OracleConnection(conStr);
  906. connections[i].Open ();
  907. }
  908. } catch (InvalidOperationException e) {
  909. Console.WriteLine("Expected exception InvalidOperationException caught.");
  910. Console.WriteLine(e);
  911. }
  912. for (i = 0; i < maxCon; i++) {
  913. if (connections[i] != null) {
  914. Console.WriteLine(" Close connection: {0}", i);
  915. if (connections[i].State == ConnectionState.Open)
  916. connections[i].Close ();
  917. connections[i].Dispose ();
  918. connections[i] = null;
  919. }
  920. }
  921. connections = null;
  922. Console.WriteLine("Done Connection Pooling Test 1.");
  923. }
  924. public static void ConnectionPoolingTest2 () {
  925. Console.WriteLine("Start Connection Pooling Test 2...");
  926. OracleConnection[] connections = null;
  927. int maxCon = MAX_CONNECTIONS;
  928. int i = 0;
  929. connections = new OracleConnection[maxCon];
  930. for (i = 0; i < maxCon; i++) {
  931. Console.WriteLine(" Open connection: {0}", i);
  932. connections[i] = new OracleConnection(conStr);
  933. connections[i].Open ();
  934. }
  935. Console.WriteLine("Start another thread...");
  936. t = new Thread(new ThreadStart(AnotherThreadProc));
  937. t.Start ();
  938. Console.WriteLine("Sleep...");
  939. Thread.Sleep(100);
  940. Console.WriteLine("Closing...");
  941. for (i = 0; i < maxCon; i++) {
  942. if (connections[i] != null) {
  943. Console.WriteLine(" Close connection: {0}", i);
  944. if (connections[i].State == ConnectionState.Open)
  945. connections[i].Close ();
  946. connections[i].Dispose ();
  947. connections[i] = null;
  948. }
  949. }
  950. connections = null;
  951. }
  952. private static void AnotherThreadProc () {
  953. Console.WriteLine("Open connection via another thread...");
  954. OracleConnection[] connections = null;
  955. int maxCon = MAX_CONNECTIONS;
  956. int i = 0;
  957. connections = new OracleConnection[maxCon];
  958. for (i = 0; i < maxCon; i++) {
  959. Console.WriteLine(" Open connection: {0}", i);
  960. connections[i] = new OracleConnection(conStr);
  961. connections[i].Open ();
  962. }
  963. Console.WriteLine("Done Connection Pooling Test 2.");
  964. System.Environment.Exit (0);
  965. }
  966. [STAThread]
  967. static void Main(string[] args)
  968. {
  969. if(args.Length != 3) {
  970. Console.WriteLine("Usage: mono TestOracleClient database userid password");
  971. return;
  972. }
  973. string connectionString = String.Format(
  974. "Data Source={0};" +
  975. "User ID={1};" +
  976. "Password={2}",
  977. args[0], args[1], args[2]);
  978. conStr = connectionString;
  979. OracleConnection con1 = new OracleConnection();
  980. ShowConnectionProperties (con1);
  981. con1.ConnectionString = connectionString;
  982. con1.InfoMessage += new OracleInfoMessageEventHandler (OnInfoMessage);
  983. con1.StateChange += new StateChangeEventHandler (OnStateChange);
  984. Console.WriteLine("Opening...");
  985. con1.Open ();
  986. Console.WriteLine("Opened.");
  987. ShowConnectionProperties (con1);
  988. Console.WriteLine ("Mono Oracle Test BEGIN ...");
  989. MonoTest (con1);
  990. Console.WriteLine ("Mono Oracle Test END ...");
  991. Wait ("");
  992. Console.WriteLine ("LOB Test BEGIN...");
  993. CLOBTest (con1);
  994. BLOBTest (con1);
  995. Console.WriteLine ("LOB Test END.");
  996. Wait ("");
  997. Console.WriteLine ("Read Simple Test BEGIN - scott.emp...");
  998. ReadSimpleTest(con1, "SELECT e.*, e.rowid FROM scott.emp e");
  999. Console.WriteLine ("Read Simple Test END - scott.emp");
  1000. Wait ("");
  1001. Console.WriteLine ("DataAdapter Test BEGIN...");
  1002. DataAdapterTest(con1);
  1003. Console.WriteLine ("DataAdapter Test END.");
  1004. Wait ("");
  1005. Console.WriteLine ("Rollback Test BEGIN...");
  1006. RollbackTest(con1);
  1007. Console.WriteLine ("Rollback Test END.");
  1008. Wait ("");
  1009. Console.WriteLine ("Commit Test BEGIN...");
  1010. CommitTest(con1);
  1011. Console.WriteLine ("Commit Test END.");
  1012. Wait ("");
  1013. Console.WriteLine ("Parameter Test BEGIN...");
  1014. ParameterTest(con1);
  1015. ReadSimpleTest(con1, "SELECT * FROM MONO_TEST_TABLE7");
  1016. Console.WriteLine ("Parameter Test END.");
  1017. Wait ("");
  1018. Console.WriteLine ("Stored Proc Test 1 BEGIN...");
  1019. StoredProcedureTest1 (con1);
  1020. ReadSimpleTest(con1, "SELECT * FROM MONO_TEST_TABLE1");
  1021. Console.WriteLine ("Stored Proc Test 1 END...");
  1022. Wait ("");
  1023. Console.WriteLine ("Stored Proc Test 2 BEGIN...");
  1024. StoredProcedureTest2 (con1);
  1025. ReadSimpleTest(con1, "SELECT * FROM MONO_TEST_TABLE2");
  1026. Console.WriteLine ("Stored Proc Test 2 END...");
  1027. Console.WriteLine ("Out Parameter and PL/SQL Block Test 1 BEGIN...");
  1028. OutParmTest1 (con1);
  1029. Console.WriteLine ("Out Parameter and PL/SQL Block Test 1 END...");
  1030. Console.WriteLine ("Out Parameter and PL/SQL Block Test 2 BEGIN...");
  1031. OutParmTest2 (con1);
  1032. Console.WriteLine ("Out Parameter and PL/SQL Block Test 2 END...");
  1033. Console.WriteLine ("Out Parameter and PL/SQL Block Test 3 BEGIN...");
  1034. OutParmTest3 (con1);
  1035. Console.WriteLine ("Out Parameter and PL/SQL Block Test 3 END...");
  1036. Wait ("");
  1037. Console.WriteLine ("Null Aggregate Warning BEGIN test...");
  1038. NullAggregateTest (con1);
  1039. Console.WriteLine ("Null Aggregate Warning END test...");
  1040. Console.WriteLine("Closing...");
  1041. con1.Close ();
  1042. Console.WriteLine("Closed.");
  1043. //conStr = conStr + ";pooling=true;min pool size=4;max pool size=" + MAX_CONNECTIONS.ToString ();
  1044. //ConnectionPoolingTest1 ();
  1045. //ConnectionPoolingTest2 ();
  1046. Console.WriteLine("Done.");
  1047. }
  1048. }
  1049. }