2 // TestOracleClient.cs - Tests Sytem.Data.OracleClient
3 // data provider in Mono.
5 // Part of managed C#/.NET library System.Data.OracleClient.dll
7 // Part of the Mono class libraries at
8 // mcs/class/System.Data.OracleClient/System.Data.OracleClient.OCI
11 // Assembly: System.Data.OracleClient.dll
12 // Namespace: System.Data.OracleClient
15 // mcs TestOracleClient.cs /r:System.Data.dll /r:System.Data.OracleClient.dll /nowarn:0168
18 // Daniel Morgan <danielmorgan@verizon.net>
20 // Copyright (C) Daniel Morgan, 2002, 2004-2005
25 using System.Runtime.InteropServices;
27 using System.Data.OracleClient;
29 using System.Threading;
31 namespace Test.OracleClient
33 public class OracleTest
35 private static Thread t = null;
\r
36 private static string conStr;
\r
37 public static readonly int MAX_CONNECTIONS = 30; // max connections default to 100, but I will set to 30.
\r
44 static void MonoTest(OracleConnection con)
46 Console.WriteLine (" Drop table MONO_ORACLE_TEST ...");
48 OracleCommand cmd2 = con.CreateCommand ();
49 cmd2.CommandText = "DROP TABLE MONO_ORACLE_TEST";
50 cmd2.ExecuteNonQuery ();
52 catch (OracleException oe1) {
53 // ignore if table already exists
56 OracleCommand cmd = null;
58 Console.WriteLine(" Creating table MONO_ORACLE_TEST...");
59 cmd = new OracleCommand();
61 cmd.CommandText = "CREATE TABLE MONO_ORACLE_TEST ( " +
62 " varchar2_value VarChar2(32), " +
63 " long_value long, " +
64 " number_whole_value Number(18), " +
65 " number_scaled_value Number(18,2), " +
66 " number_integer_value Integer, " +
67 " float_value Float, " +
68 " date_value Date, " +
69 " char_value Char(32), " +
70 " clob_value Clob, " +
71 " blob_value Blob, " +
72 " clob_empty_value Clob, " +
73 " blob_empty_value Blob, " +
74 " varchar2_null_value VarChar2(32), " +
75 " number_whole_null_value Number(18), " +
76 " number_scaled_null_value Number(18,2), " +
77 " number_integer_null_value Integer, " +
78 " float_null_value Float, " +
79 " date_null_value Date, " +
80 " char_null_value Char(32), " +
81 " clob_null_value Clob, " +
82 " blob_null_value Blob " +
85 cmd.ExecuteNonQuery();
87 Console.WriteLine(" Begin Trans for table MONO_ORACLE_TEST...");
88 OracleTransaction trans = con.BeginTransaction ();
90 Console.WriteLine(" Inserting value into MONO_ORACLE_TEST...");
91 cmd = new OracleCommand();
93 cmd.Transaction = trans;
94 cmd.CommandText = "INSERT INTO mono_oracle_test " +
95 " ( varchar2_value, " +
97 " number_whole_value, " +
98 " number_scaled_value, " +
99 " number_integer_value, " +
105 " clob_empty_value, " +
106 " blob_empty_value " +
110 " 'This is a LONG column', " +
115 " TO_DATE( '2004-12-31', 'YYYY-MM-DD' ), " +
123 cmd.ExecuteNonQuery();
125 Console.WriteLine(" Select/Update CLOB columns on table MONO_ORACLE_TEST...");
127 // update BLOB and CLOB columns
128 OracleCommand select = con.CreateCommand ();
129 select.Transaction = trans;
130 select.CommandText = "SELECT CLOB_VALUE, BLOB_VALUE FROM MONO_ORACLE_TEST FOR UPDATE";
131 OracleDataReader reader = select.ExecuteReader ();
133 Console.WriteLine ("ERROR: RECORD NOT FOUND");
135 Console.WriteLine(" Update CLOB column on table MONO_ORACLE_TEST...");
136 OracleLob clob = reader.GetOracleLob (0);
138 UnicodeEncoding encoding = new UnicodeEncoding ();
139 bytes = encoding.GetBytes ("Mono is fun!");
140 clob.Write (bytes, 0, bytes.Length);
143 Console.WriteLine(" Update BLOB column on table MONO_ORACLE_TEST...");
144 OracleLob blob = reader.GetOracleLob (1);
145 bytes = new byte[6] { 0x31, 0x32, 0x33, 0x34, 0x35, 0x036 };
146 blob.Write (bytes, 0, bytes.Length);
149 Console.WriteLine(" Commit trans for table MONO_ORACLE_TEST...");
152 // OracleCommand.ExecuteReader of MONO_ORACLE_TEST table
153 Console.WriteLine(" Read simple test for table MONO_ORACLE_TEST...");
154 ReadSimpleTest(con, "SELECT * FROM MONO_ORACLE_TEST");
156 // OracleCommand.ExecuteScalar
157 Console.WriteLine(" -ExecuteScalar tests...");
158 string varchar2_value = (string) ReadScalar (con,"SELECT MAX(varchar2_value) FROM MONO_ORACLE_TEST");
159 Console.WriteLine(" String Value: " + varchar2_value);
161 Console.WriteLine(" Read Scalar: number_whole_value");
162 decimal number_whole_value = (decimal)
163 ReadScalar (con,"SELECT MAX(number_whole_value) FROM MONO_ORACLE_TEST");
164 Console.WriteLine(" Int32 Value: " + number_whole_value.ToString());
166 Console.WriteLine(" Read Scalar: number_scaled_value");
167 decimal number_scaled_value = (decimal)
168 ReadScalar (con,"SELECT number_scaled_value FROM MONO_ORACLE_TEST");
169 Console.WriteLine(" Decimal Value: " + number_scaled_value.ToString());
171 Console.WriteLine(" Read Scalar: date_value");
172 DateTime date_value = (DateTime)
173 ReadScalar (con,"SELECT date_value FROM MONO_ORACLE_TEST");
174 Console.WriteLine(" DateTime Value: " + date_value.ToString());
176 Console.WriteLine(" Read Scalar: clob_value");
177 string clob_value = (string)
178 ReadScalar (con,"SELECT clob_value FROM MONO_ORACLE_TEST");
179 Console.WriteLine(" CLOB Value: " + clob_value);
181 Console.WriteLine(" Read Scalar: blob_value");
182 byte[] blob_value = (byte[])
183 ReadScalar (con,"SELECT blob_value FROM MONO_ORACLE_TEST");
184 string sblob_value = GetHexString (blob_value);
185 Console.WriteLine(" BLOB Value: " + sblob_value);
187 // OracleCommand.ExecuteOracleScalar
188 Console.WriteLine(" -ExecuteOracleScalar tests...");
189 Console.WriteLine(" Read Oracle Scalar: varchar2_value");
190 ReadOracleScalar (con,"SELECT MAX(varchar2_value) FROM MONO_ORACLE_TEST");
192 Console.WriteLine(" Read Oracle Scalar: number_whole_value");
193 ReadOracleScalar (con,"SELECT MAX(number_whole_value) FROM MONO_ORACLE_TEST");
195 Console.WriteLine(" Read Oracle Scalar: number_scaled_value");
196 ReadOracleScalar (con,"SELECT number_scaled_value FROM MONO_ORACLE_TEST");
198 Console.WriteLine(" Read Oracle Scalar: date_value");
199 ReadOracleScalar (con,"SELECT date_value FROM MONO_ORACLE_TEST");
201 Console.WriteLine(" Read Oracle Scalar: clob_value");
202 ReadOracleScalar (con,"SELECT clob_value FROM MONO_ORACLE_TEST");
204 Console.WriteLine(" Read Oracle Scalar: blob_value");
205 ReadOracleScalar (con,"SELECT blob_value FROM MONO_ORACLE_TEST");
208 static object ReadScalar (OracleConnection con, string selectSql)
210 OracleCommand cmd = null;
211 cmd = con.CreateCommand();
212 cmd.CommandText = selectSql;
214 object o = cmd.ExecuteScalar ();
216 string dataType = o.GetType ().ToString ();
217 Console.WriteLine (" DataType: " + dataType);
221 static void ReadOracleScalar (OracleConnection con, string selectSql)
223 OracleCommand cmd = null;
224 cmd = con.CreateCommand();
225 cmd.CommandText = selectSql;
227 object o = cmd.ExecuteOracleScalar ();
229 string dataType = o.GetType ().ToString ();
230 Console.WriteLine (" DataType: " + dataType);
231 if (dataType.Equals("System.Data.OracleClient.OracleLob"))
232 o = ((OracleLob) o).Value;
233 if (o.GetType ().ToString ().Equals ("System.Byte[]"))
234 o = GetHexString ((byte[])o);
236 Console.WriteLine (" Value: " + o.ToString ());
239 static void ReadSimpleTest(OracleConnection con, string selectSql)
241 OracleCommand cmd = null;
242 OracleDataReader reader = null;
244 cmd = con.CreateCommand();
245 cmd.CommandText = selectSql;
246 reader = cmd.ExecuteReader();
248 Console.WriteLine(" Results...");
249 Console.WriteLine(" Schema");
251 table = reader.GetSchemaTable();
252 for(int c = 0; c < reader.FieldCount; c++) {
253 Console.WriteLine(" Column " + c.ToString());
254 DataRow row = table.Rows[c];
256 string strColumnName = row["ColumnName"].ToString();
257 string strBaseColumnName = row["BaseColumnName"].ToString();
258 string strColumnSize = row["ColumnSize"].ToString();
259 string strNumericScale = row["NumericScale"].ToString();
260 string strNumericPrecision = row["NumericPrecision"].ToString();
261 string strDataType = row["DataType"].ToString();
263 Console.WriteLine(" ColumnName: " + strColumnName);
264 Console.WriteLine(" BaseColumnName: " + strBaseColumnName);
265 Console.WriteLine(" ColumnSize: " + strColumnSize);
266 Console.WriteLine(" NumericScale: " + strNumericScale);
267 Console.WriteLine(" NumericPrecision: " + strNumericPrecision);
268 Console.WriteLine(" DataType: " + strDataType);
272 Console.WriteLine (" Data");
273 while (reader.Read ()) {
275 Console.WriteLine (" Row: " + r.ToString ());
276 for (int f = 0; f < reader.FieldCount; f++) {
280 string sDataType = "";
281 string sFieldType = "";
282 string sDataTypeName = "";
283 string sOraDataType = "";
285 sname = reader.GetName (f);
287 if (reader.IsDBNull (f)) {
288 ovalue = DBNull.Value;
290 sDataType = "DBNull.Value";
291 sOraDataType = "DBNull.Value";
294 ovalue = reader.GetValue (f);
295 //ovalue = reader.GetOracleValue (f);
296 object oravalue = null;
298 sDataType = ovalue.GetType ().ToString ();
300 case "System.Data.OracleClient.OracleString":
301 oravalue = ((OracleString) ovalue).Value;
303 case "System.Data.OracleClient.OracleNumber":
304 oravalue = ((OracleNumber) ovalue).Value;
306 case "System.Data.OracleClient.OracleLob":
307 OracleLob lob = (OracleLob) ovalue;
308 oravalue = lob.Value;
311 case "System.Data.OracleClient.OracleDateTime":
312 oravalue = ((OracleDateTime) ovalue).Value;
314 case "System.Byte[]":
315 oravalue = GetHexString((byte[])ovalue);
317 case "System.Decimal":
318 Console.WriteLine(" *** Get Decimal, Int16, Int32, Int64, Float, Double, ...");
319 decimal dec = reader.GetDecimal (f);
320 Console.WriteLine(" GetDecimal: " + dec.ToString ());
322 oravalue = (object) dec;
326 } catch (NotSupportedException e) {
327 Console.WriteLine (" ** Expected exception caught for GetInt16: NotSupportedException: " + e.Message);
331 long lng = reader.GetInt64 (f);
332 Console.WriteLine(" GetInt64: " + lng.ToString ());
333 int n = reader.GetInt32 (f);
334 Console.WriteLine(" GetInt32: " + n.ToString ());
335 float flt = reader.GetFloat (f);
336 Console.WriteLine(" GetFloat: " + flt.ToString ());
337 double dbl = reader.GetDouble (f);
338 Console.WriteLine(" GetDouble: " + dbl.ToString ());
339 } catch (OverflowException oe1) {
340 Console.WriteLine (" ** Overflow exception for numbers to big or too small: " + oe1.Message);
345 oravalue = ovalue.ToString ();
350 sOraDataType = oravalue.GetType ().ToString ();
351 if (sOraDataType.Equals ("System.Byte[]"))
352 svalue = GetHexString ((byte[]) oravalue);
354 svalue = oravalue.ToString();
357 sFieldType = reader.GetFieldType(f).ToString();
358 sDataTypeName = reader.GetDataTypeName(f);
360 Console.WriteLine(" Field: " + f.ToString());
361 Console.WriteLine(" Name: " + sname);
362 Console.WriteLine(" Value: " + svalue);
363 Console.WriteLine(" Oracle Data Type: " + sOraDataType);
364 Console.WriteLine(" Data Type: " + sDataType);
365 Console.WriteLine(" Field Type: " + sFieldType);
366 Console.WriteLine(" Data Type Name: " + sDataTypeName);
370 Console.WriteLine(" No data returned.");
373 static void DataAdapterTest (OracleConnection connection)
375 Console.WriteLine(" Create select command...");
376 OracleCommand command = connection.CreateCommand ();
377 command.CommandText = "SELECT * FROM EMP";
379 Console.WriteLine(" Create data adapter...");
380 OracleDataAdapter adapter = new OracleDataAdapter (command);
382 Console.WriteLine(" Create DataSet...");
383 DataSet dataSet = new DataSet ("EMP");
385 Console.WriteLine(" Fill DataSet via data adapter...");
386 adapter.Fill (dataSet);
388 Console.WriteLine(" Get DataTable...");
389 DataTable table = dataSet.Tables [0];
391 Console.WriteLine(" Display each row...");
393 foreach (DataRow row in table.Rows) {
394 Console.WriteLine (" row {0}", rowCount + 1);
395 for (int i = 0; i < table.Columns.Count; i += 1) {
396 Console.WriteLine (" {0}: {1}", table.Columns [i].ColumnName, row [i]);
398 Console.WriteLine ();
403 static void RollbackTest (OracleConnection connection)
405 OracleTransaction transaction = connection.BeginTransaction ();
407 OracleCommand insert = connection.CreateCommand ();
408 insert.Transaction = transaction;
409 insert.CommandText = "INSERT INTO EMP (EMPNO, ENAME, JOB) VALUES (8787, 'T Coleman', 'Monoist')";
411 Console.WriteLine (" Inserting record ...");
413 insert.ExecuteNonQuery ();
415 OracleCommand select = connection.CreateCommand ();
416 select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
417 select.Transaction = transaction;
418 OracleDataReader reader = select.ExecuteReader ();
421 Console.WriteLine (" Row count SHOULD BE 1, VALUE IS {0}", reader.GetValue (0));
424 Console.WriteLine (" Rolling back transaction ...");
426 transaction.Rollback ();
428 select = connection.CreateCommand ();
429 select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
431 reader = select.ExecuteReader ();
433 Console.WriteLine (" Row count SHOULD BE 0, VALUE IS {0}", reader.GetValue (0));
437 static void CommitTest (OracleConnection connection)
439 OracleTransaction transaction = connection.BeginTransaction ();
441 OracleCommand insert = connection.CreateCommand ();
442 insert.Transaction = transaction;
443 insert.CommandText = "INSERT INTO EMP (EMPNO, ENAME, JOB) VALUES (8787, 'T Coleman', 'Monoist')";
445 Console.WriteLine (" Inserting record ...");
447 insert.ExecuteNonQuery ();
449 OracleCommand select = connection.CreateCommand ();
450 select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
451 select.Transaction = transaction;
453 Console.WriteLine (" Row count SHOULD BE 1, VALUE IS {0}", select.ExecuteScalar ());
455 Console.WriteLine (" Committing transaction ...");
457 transaction.Commit ();
459 select = connection.CreateCommand ();
460 select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
462 Console.WriteLine ("Row count SHOULD BE 1, VALUE IS {0}", select.ExecuteScalar ());
463 transaction = connection.BeginTransaction ();
464 OracleCommand delete = connection.CreateCommand ();
465 delete.Transaction = transaction;
466 delete.CommandText = "DELETE FROM EMP WHERE EMPNO = 8787";
467 delete.ExecuteNonQuery ();
468 transaction.Commit ();
471 public static void ParameterTest (OracleConnection connection)
473 Console.WriteLine(" Setting NLS_DATE_FORMAT...");
\r
475 OracleCommand cmd2 = connection.CreateCommand();
\r
476 cmd2.CommandText = "ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'";
\r
478 cmd2.ExecuteNonQuery ();
\r
480 Console.WriteLine(" Drop table MONO_TEST_TABLE2...");
482 cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE7";
483 cmd2.ExecuteNonQuery ();
485 catch(OracleException oe1) {
486 // ignore if table already exists
489 Console.WriteLine(" Create table MONO_TEST_TABLE7...");
491 cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE7(" +
492 " COL1 VARCHAR2(8) NOT NULL, " +
493 " COL2 VARCHAR2(32), " +
494 " COL3 NUMBER(18,2) NOT NULL, " +
495 " COL4 NUMBER(18,2), " +
496 " COL5 DATE NOT NULL, " +
498 " COL7 BLOB NOT NULL, " +
500 " COL9 CLOB NOT NULL, " +
503 cmd2.ExecuteNonQuery ();
505 Console.WriteLine(" COMMIT...");
506 cmd2.CommandText = "COMMIT";
507 cmd2.ExecuteNonQuery ();
509 Console.WriteLine(" create insert command...");
511 OracleTransaction trans = connection.BeginTransaction ();
\r
512 OracleCommand cmd = connection.CreateCommand ();
\r
513 cmd.Transaction = trans;
\r
515 cmd.CommandText = "INSERT INTO MONO_TEST_TABLE7 " +
\r
516 "(COL1,COL2,COL3,COL4,COL5,COL6,COL7,COL8,COL9,COL10) " +
\r
517 "VALUES(:P1,:P2,:P3,:P4,:P5,:P6,:P7,:P8,:P9,:P10)";
\r
519 Console.WriteLine(" Add parameters...");
\r
521 OracleParameter parm1 = cmd.Parameters.Add (":P1", OracleType.VarChar, 8);
\r
522 OracleParameter parm2 = cmd.Parameters.Add (":P2", OracleType.VarChar, 32);
\r
524 OracleParameter parm3 = cmd.Parameters.Add (":P3", OracleType.Number);
\r
525 OracleParameter parm4 = cmd.Parameters.Add (":P4", OracleType.Number);
\r
527 OracleParameter parm5 = cmd.Parameters.Add (":P5", OracleType.DateTime);
\r
528 OracleParameter parm6 = cmd.Parameters.Add (":P6", OracleType.DateTime);
\r
530 // FIXME: fix BLOBs and CLOBs in OracleParameter
\r
532 OracleParameter parm7 = cmd.Parameters.Add (":P7", OracleType.Blob);
\r
533 OracleParameter parm8 = cmd.Parameters.Add (":P8", OracleType.Blob);
\r
535 OracleParameter parm9 = cmd.Parameters.Add (":P9", OracleType.Clob);
\r
536 OracleParameter parm10 = cmd.Parameters.Add (":P10", OracleType.Clob);
\r
538 // TODO: implement out, return, and ref parameters
\r
541 decimal d = 123456789012345.678M;
\r
542 DateTime dt = DateTime.Now;
\r
544 string clob = "Clob";
\r
545 byte[] blob = new byte[] { 0x31, 0x32, 0x33, 0x34, 0x35 };
\r
547 Console.WriteLine(" Set Values...");
\r
550 parm2.Value = DBNull.Value;
\r
553 parm4.Value = DBNull.Value;
\r
556 parm6.Value = DBNull.Value;
\r
558 parm7.Value = blob;
\r
559 parm8.Value = DBNull.Value;
\r
561 parm9.Value = clob;
\r
562 parm10.Value = DBNull.Value;
\r
564 Console.WriteLine(" ExecuteNonQuery...");
\r
566 cmd.ExecuteNonQuery ();
\r
570 public static void CLOBTest (OracleConnection connection)
572 Console.WriteLine (" BEGIN TRANSACTION ...");
574 OracleTransaction transaction = connection.BeginTransaction ();
576 Console.WriteLine (" Drop table CLOBTEST ...");
578 OracleCommand cmd2 = connection.CreateCommand ();
579 cmd2.Transaction = transaction;
580 cmd2.CommandText = "DROP TABLE CLOBTEST";
581 cmd2.ExecuteNonQuery ();
583 catch (OracleException oe1) {
584 // ignore if table already exists
587 Console.WriteLine (" CREATE TABLE ...");
589 OracleCommand create = connection.CreateCommand ();
590 create.Transaction = transaction;
591 create.CommandText = "CREATE TABLE CLOBTEST (CLOB_COLUMN CLOB)";
592 create.ExecuteNonQuery ();
594 Console.WriteLine (" INSERT RECORD ...");
596 OracleCommand insert = connection.CreateCommand ();
597 insert.Transaction = transaction;
598 insert.CommandText = "INSERT INTO CLOBTEST VALUES (EMPTY_CLOB())";
599 insert.ExecuteNonQuery ();
601 OracleCommand select = connection.CreateCommand ();
602 select.Transaction = transaction;
603 select.CommandText = "SELECT CLOB_COLUMN FROM CLOBTEST FOR UPDATE";
604 Console.WriteLine (" SELECTING A CLOB (CHARACTER) VALUE FROM CLOBTEST");
606 OracleDataReader reader = select.ExecuteReader ();
608 Console.WriteLine ("ERROR: RECORD NOT FOUND");
610 Console.WriteLine (" TESTING OracleLob OBJECT ...");
611 OracleLob lob = reader.GetOracleLob (0);
612 Console.WriteLine (" LENGTH: {0}", lob.Length);
613 Console.WriteLine (" CHUNK SIZE: {0}", lob.ChunkSize);
615 UnicodeEncoding encoding = new UnicodeEncoding ();
617 byte[] value = new byte [lob.Length * 2];
619 Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
620 Console.WriteLine (" UPDATING VALUE TO 'TEST ME!'");
621 value = encoding.GetBytes ("TEST ME!");
622 lob.Write (value, 0, value.Length);
624 Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
625 Console.WriteLine (" RE-READ VALUE...");
626 lob.Seek (1, SeekOrigin.Begin);
628 Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
629 value = new byte [lob.Length * 2];
630 lob.Read (value, 0, value.Length);
631 Console.WriteLine (" VALUE: {0}", encoding.GetString (value));
632 Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
634 Console.WriteLine (" CLOSE OracleLob...");
637 Console.WriteLine (" CLOSING READER...");
640 transaction.Commit ();
643 public static void BLOBTest (OracleConnection connection)
645 Console.WriteLine (" BEGIN TRANSACTION ...");
647 OracleTransaction transaction = connection.BeginTransaction ();
649 Console.WriteLine (" Drop table BLOBTEST ...");
651 OracleCommand cmd2 = connection.CreateCommand ();
652 cmd2.Transaction = transaction;
653 cmd2.CommandText = "DROP TABLE BLOBTEST";
654 cmd2.ExecuteNonQuery ();
656 catch (OracleException oe1) {
657 // ignore if table already exists
660 Console.WriteLine (" CREATE TABLE ...");
662 OracleCommand create = connection.CreateCommand ();
663 create.Transaction = transaction;
664 create.CommandText = "CREATE TABLE BLOBTEST (BLOB_COLUMN BLOB)";
665 create.ExecuteNonQuery ();
667 Console.WriteLine (" INSERT RECORD ...");
669 OracleCommand insert = connection.CreateCommand ();
670 insert.Transaction = transaction;
671 insert.CommandText = "INSERT INTO BLOBTEST VALUES (EMPTY_BLOB())";
672 insert.ExecuteNonQuery ();
674 OracleCommand select = connection.CreateCommand ();
675 select.Transaction = transaction;
676 select.CommandText = "SELECT BLOB_COLUMN FROM BLOBTEST FOR UPDATE";
677 Console.WriteLine (" SELECTING A BLOB (Binary) VALUE FROM BLOBTEST");
679 OracleDataReader reader = select.ExecuteReader ();
681 Console.WriteLine ("ERROR: RECORD NOT FOUND");
683 Console.WriteLine (" TESTING OracleLob OBJECT ...");
684 OracleLob lob = reader.GetOracleLob (0);
689 Console.WriteLine (" UPDATING VALUE");
691 byte[] bytes = new byte[6];
699 lob.Write (bytes, 0, bytes.Length);
701 Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
702 Console.WriteLine (" RE-READ VALUE...");
703 lob.Seek (1, SeekOrigin.Begin);
705 Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
706 value = new byte [lob.Length];
707 lob.Read (value, 0, value.Length);
710 if (value.GetType ().ToString ().Equals ("System.Byte[]"))
711 bvalue = GetHexString (value);
712 Console.WriteLine (" Bytes: " + bvalue);
714 Console.WriteLine (" CURRENT POSITION: {0}", lob.Position);
716 Console.WriteLine (" CLOSE OracleLob...");
719 Console.WriteLine (" CLOSING READER...");
722 transaction.Commit ();
725 static void Wait(string msg)
727 Console.WriteLine(msg);
729 Console.WriteLine("Waiting... Press Enter to continue...");
733 // use this function to read a byte array into a string
734 // for easy display of binary data, such as, a BLOB value
735 public static string GetHexString (byte[] bytes)
739 StringBuilder sb2 = new StringBuilder();
740 for (int z = 0; z < bytes.Length; z++) {
742 sb2.Append (byt.ToString("x"));
745 bvalue = "0x" + sb2.ToString ();
750 static void StoredProcedureTest1 (OracleConnection con)
752 // test stored procedure with no parameters
755 OracleCommand cmd2 = con.CreateCommand ();
757 Console.WriteLine(" Drop table MONO_TEST_TABLE1...");
759 cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE1";
760 cmd2.ExecuteNonQuery ();
762 catch(OracleException oe1) {
763 // ignore if table did not exist
766 Console.WriteLine(" Drop procedure SP_TEST1...");
768 cmd2.CommandText = "DROP PROCEDURE SP_TEST1";
769 cmd2.ExecuteNonQuery ();
771 catch(OracleException oe1) {
772 // ignore if procedure did not exist
775 Console.WriteLine(" Create table MONO_TEST_TABLE1...");
776 cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE1 (" +
777 " COL1 VARCHAR2(8), "+
778 " COL2 VARCHAR2(32))";
779 cmd2.ExecuteNonQuery ();
781 Console.WriteLine(" Create stored procedure SP_TEST1...");
782 cmd2.CommandText = "CREATE PROCEDURE SP_TEST1 " +
785 " INSERT INTO MONO_TEST_TABLE1 (COL1,COL2) VALUES ('aaa','bbbb');" +
788 cmd2.ExecuteNonQuery ();
790 Console.WriteLine("COMMIT...");
791 cmd2.CommandText = "COMMIT";
792 cmd2.ExecuteNonQuery ();
794 Console.WriteLine(" Call stored procedure sp_test1...");
795 OracleCommand cmd3 = con.CreateCommand ();
\r
796 cmd3.CommandType = CommandType.StoredProcedure;
\r
797 cmd3.CommandText = "sp_test1";
\r
798 cmd3.ExecuteNonQuery ();
801 static void StoredProcedureTest2 (OracleConnection con)
803 // test stored procedure with 2 parameters
805 Console.WriteLine(" Drop table MONO_TEST_TABLE2...");
806 OracleCommand cmd2 = con.CreateCommand ();
809 cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE2";
810 cmd2.ExecuteNonQuery ();
812 catch(OracleException oe1) {
813 // ignore if table already exists
816 Console.WriteLine(" Drop procedure SP_TEST2...");
818 cmd2.CommandText = "DROP PROCEDURE SP_TEST2";
819 cmd2.ExecuteNonQuery ();
821 catch(OracleException oe1) {
822 // ignore if table already exists
825 Console.WriteLine(" Create table MONO_TEST_TABLE2...");
827 cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE2 (" +
828 " COL1 VARCHAR2(8), "+
829 " COL2 VARCHAR2(32))";
830 cmd2.ExecuteNonQuery ();
832 Console.WriteLine(" Create stored procedure SP_TEST2...");
833 cmd2.CommandText = "CREATE PROCEDURE SP_TEST2(parm1 VARCHAR2,parm2 VARCHAR2) " +
836 " INSERT INTO MONO_TEST_TABLE2 (COL1,COL2) VALUES (parm1,parm2);" +
839 cmd2.ExecuteNonQuery ();
841 Console.WriteLine(" COMMIT...");
842 cmd2.CommandText = "COMMIT";
843 cmd2.ExecuteNonQuery ();
845 Console.WriteLine(" Call stored procedure SP_TEST2 with two parameters...");
846 OracleCommand cmd3 = con.CreateCommand ();
\r
847 cmd3.CommandType = CommandType.StoredProcedure;
\r
848 cmd3.CommandText = "sp_test2";
\r
850 OracleParameter myParameter1 = new OracleParameter("parm1", OracleType.VarChar);
\r
851 myParameter1.Value = "yyy13";
\r
852 myParameter1.Size = 8;
\r
853 myParameter1.Direction = ParameterDirection.Input;
\r
855 OracleParameter myParameter2 = new OracleParameter("parm2", OracleType.VarChar);
\r
856 myParameter2.Value = "iii13";
\r
857 myParameter2.Size = 32;
\r
858 myParameter2.Direction = ParameterDirection.Input;
\r
860 cmd3.Parameters.Add (myParameter1);
\r
861 cmd3.Parameters.Add (myParameter2);
\r
863 cmd3.ExecuteNonQuery ();
866 static void ShowConnectionProperties (OracleConnection con)
869 Console.WriteLine ("ServerVersion: " + con.ServerVersion);
870 } catch (System.InvalidOperationException ioe) {
\r
871 Console.WriteLine ("InvalidOperationException caught.");
\r
872 Console.WriteLine ("Message: " + ioe.Message);
\r
875 Console.WriteLine ("DataSource: " + con.DataSource);
878 static void NullAggregateTest (OracleConnection con)
880 Console.WriteLine(" Drop table MONO_TEST_TABLE3...");
881 OracleCommand cmd2 = con.CreateCommand ();
884 cmd2.CommandText = "DROP TABLE MONO_TEST_TABLE3";
885 cmd2.ExecuteNonQuery ();
887 catch(OracleException oe1) {
888 // ignore if table already exists
891 Console.WriteLine(" Create table MONO_TEST_TABLE3...");
893 cmd2.CommandText = "CREATE TABLE MONO_TEST_TABLE3 (" +
894 " COL1 VARCHAR2(8), "+
895 " COL2 VARCHAR2(32))";
897 cmd2.ExecuteNonQuery ();
899 Console.WriteLine(" Insert some rows into table MONO_TEST_TABLE3...");
900 cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('1','one')";
901 cmd2.ExecuteNonQuery ();
903 cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('1','uno')";
904 cmd2.ExecuteNonQuery ();
906 cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3','three')";
907 cmd2.ExecuteNonQuery ();
909 cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3', null)";
910 cmd2.ExecuteNonQuery ();
912 cmd2.CommandText = "INSERT INTO MONO_TEST_TABLE3 (COL1, COL2) VALUES ('3','few')";
913 cmd2.ExecuteNonQuery ();
915 Console.WriteLine(" ExecuteScalar...");
916 cmd2.CommandText = "SELECT COL1, COUNT(COL2) AS MAX_COL1 FROM MONO_TEST_TABLE3 GROUP BY COL1";
917 OracleDataReader reader = cmd2.ExecuteReader ();
918 Console.WriteLine (" Read...");
919 while (reader.Read ()) {
921 object obj0 = reader.GetValue (0);
922 Console.WriteLine("Value 0: " + obj0.ToString ());
923 object obj1 = reader.GetValue (1);
924 Console.WriteLine("Value 1: " + obj1.ToString ());
926 Console.WriteLine (" Read...");
929 Console.WriteLine (" No more records.");
932 static void OnInfoMessage (object sender, OracleInfoMessageEventArgs e)
\r
934 Console.WriteLine("InfoMessage Message: " + e.Message.ToString());
\r
935 Console.WriteLine("InfoMessage Code: " + e.Code.ToString());
\r
936 Console.WriteLine("InfoMessage Source: " + e.Source.ToString());
\r
939 static void OnStateChange (object sender, StateChangeEventArgs e)
\r
941 Console.WriteLine("StateChange CurrentSate:" + e.CurrentState.ToString ());
\r
942 Console.WriteLine("StateChange OriginalState:" + e.OriginalState.ToString ());
\r
945 public static void ConnectionPoolingTest1 () {
\r
946 Console.WriteLine("Start Connection Pooling Test 1...");
\r
947 OracleConnection[] connections = null;
\r
948 int maxCon = MAX_CONNECTIONS + 1; // add 1 more over the max connections to cause it to wait for the next available connection
\r
952 connections = new OracleConnection[maxCon];
\r
954 for (i = 0; i < maxCon; i++) {
\r
955 Console.WriteLine(" Open connection: {0}", i);
\r
956 connections[i] = new OracleConnection(conStr);
\r
957 connections[i].Open ();
\r
959 } catch (InvalidOperationException e) {
\r
960 Console.WriteLine("Expected exception InvalidOperationException caught.");
\r
961 Console.WriteLine(e);
\r
964 for (i = 0; i < maxCon; i++) {
\r
965 if (connections[i] != null) {
\r
966 Console.WriteLine(" Close connection: {0}", i);
\r
967 if (connections[i].State == ConnectionState.Open)
\r
968 connections[i].Close ();
\r
969 connections[i].Dispose ();
\r
970 connections[i] = null;
\r
974 connections = null;
\r
976 Console.WriteLine("Done Connection Pooling Test 1.");
\r
979 public static void ConnectionPoolingTest2 () {
\r
980 Console.WriteLine("Start Connection Pooling Test 2...");
\r
981 OracleConnection[] connections = null;
\r
982 int maxCon = MAX_CONNECTIONS;
\r
985 connections = new OracleConnection[maxCon];
\r
987 for (i = 0; i < maxCon; i++) {
\r
988 Console.WriteLine(" Open connection: {0}", i);
\r
989 connections[i] = new OracleConnection(conStr);
\r
990 connections[i].Open ();
\r
993 Console.WriteLine("Start another thread...");
\r
994 t = new Thread(new ThreadStart(AnotherThreadProc));
\r
997 Console.WriteLine("Sleep...");
\r
1000 Console.WriteLine("Closing...");
\r
1001 for (i = 0; i < maxCon; i++) {
\r
1002 if (connections[i] != null) {
\r
1003 Console.WriteLine(" Close connection: {0}", i);
\r
1004 if (connections[i].State == ConnectionState.Open)
\r
1005 connections[i].Close ();
\r
1006 connections[i].Dispose ();
\r
1007 connections[i] = null;
\r
1011 connections = null;
\r
1014 private static void AnotherThreadProc () {
\r
1015 Console.WriteLine("Open connection via another thread...");
\r
1016 OracleConnection[] connections = null;
\r
1017 int maxCon = MAX_CONNECTIONS;
\r
1020 connections = new OracleConnection[maxCon];
\r
1022 for (i = 0; i < maxCon; i++) {
\r
1023 Console.WriteLine(" Open connection: {0}", i);
\r
1024 connections[i] = new OracleConnection(conStr);
\r
1025 connections[i].Open ();
\r
1028 Console.WriteLine("Done Connection Pooling Test 2.");
\r
1029 System.Environment.Exit (0);
\r
1033 static void Main(string[] args)
1035 if(args.Length != 3) {
1036 Console.WriteLine("Usage: mono TestOracleClient database userid password");
1040 string connectionString = String.Format(
1041 "Data Source={0};" +
1044 args[0], args[1], args[2]);
1046 conStr = connectionString;
1048 OracleConnection con1 = new OracleConnection();
1050 ShowConnectionProperties (con1);
1052 con1.ConnectionString = connectionString;
1054 con1.InfoMessage += new OracleInfoMessageEventHandler (OnInfoMessage);
1055 con1.StateChange += new StateChangeEventHandler (OnStateChange);
1056 Console.WriteLine("Opening...");
1058 Console.WriteLine("Opened.");
1060 ShowConnectionProperties (con1);
1062 Console.WriteLine ("Mono Oracle Test BEGIN ...");
1064 Console.WriteLine ("Mono Oracle Test END ...");
1068 Console.WriteLine ("LOB Test BEGIN...");
1071 Console.WriteLine ("LOB Test END.");
1074 Console.WriteLine ("Read Simple Test BEGIN - scott.emp...");
1075 ReadSimpleTest(con1, "SELECT e.*, e.rowid FROM scott.emp e");
1076 Console.WriteLine ("Read Simple Test END - scott.emp");
1080 Console.WriteLine ("DataAdapter Test BEGIN...");
1081 DataAdapterTest(con1);
1082 Console.WriteLine ("DataAdapter Test END.");
1086 Console.WriteLine ("Rollback Test BEGIN...");
1088 Console.WriteLine ("Rollback Test END.");
1092 Console.WriteLine ("Commit Test BEGIN...");
1094 Console.WriteLine ("Commit Test END.");
1098 Console.WriteLine ("Parameter Test BEGIN...");
1099 ParameterTest(con1);
1100 ReadSimpleTest(con1, "SELECT * FROM MONO_TEST_TABLE7");
1101 Console.WriteLine ("Parameter Test END.");
1105 Console.WriteLine ("Stored Proc Test 1 BEGIN...");
1106 StoredProcedureTest1 (con1);
1107 ReadSimpleTest(con1, "SELECT * FROM MONO_TEST_TABLE1");
1108 Console.WriteLine ("Stored Proc Test 1 END...");
1112 Console.WriteLine ("Stored Proc Test 2 BEGIN...");
1113 StoredProcedureTest2 (con1);
1114 ReadSimpleTest(con1, "SELECT * FROM MONO_TEST_TABLE2");
1115 Console.WriteLine ("Stored Proc Test 2 END...");
1119 Console.WriteLine ("Null Aggregate Warning BEGIN test...");
1120 NullAggregateTest (con1);
1121 Console.WriteLine ("Null Aggregate Warning END test...");
1123 Console.WriteLine("Closing...");
1125 Console.WriteLine("Closed.");
1127 conStr = conStr + ";pooling=true;min pool size=4;max pool size=" + MAX_CONNECTIONS.ToString ();
\r
1128 ConnectionPoolingTest1 ();
\r
1129 ConnectionPoolingTest2 ();
\r
1131 Console.WriteLine("Done.");