Pārlūkot izejas kodu

2003-02-18 Tim Coleman <[email protected]>
* System.Data.OracleClient/OciBindHandle.cs:
* list:
Add new class
* System.Data.OracleClient/OracleCommand.cs:
Add transaction logic for rollback/commit,
attaching to oracle service context, and a
couple of test cases.
Add Parameter handling
* System.Data.OracleClient/OracleDataReader.cs:
Change GetValue call
* System.Data.OracleClient/OracleParameter.cs:
Make this work
* System.Data.OracleClient/OracleType.cs:
Add values to enum
* System.Data.OracleClient.Oci/OciDefineHandle.cs:
Add GetValue call which is used by data reader
* System.Data.OracleClient.Oci/OciStatementHandle.cs:
Add parameter logic
* Test/TestOracleClient.cs:
Add some new test cases.

svn path=/trunk/mcs/; revision=11709

Tim Coleman 23 gadi atpakaļ
vecāks
revīzija
7aa6feb8b4

+ 20 - 2
mcs/class/System.Data.OracleClient/ChangeLog

@@ -1,11 +1,29 @@
 2003-02-18  Tim Coleman <[email protected]>
+	* System.Data.OracleClient/OciBindHandle.cs:
+	* list:
+		Add new class
 	* System.Data.OracleClient/OracleCommand.cs:
+		Add transaction logic for rollback/commit,
+		attaching to oracle service context, and a
+		couple of test cases.
+		Add Parameter handling
+	* System.Data.OracleClient/OracleDataReader.cs:
+		Change GetValue call
+	* System.Data.OracleClient/OracleParameter.cs:
+		Make this work
+	* System.Data.OracleClient/OracleType.cs:
+		Add values to enum
+	* System.Data.OracleClient.Oci/OciDefineHandle.cs:
+		Add GetValue call which is used by data reader
+	* System.Data.OracleClient.Oci/OciStatementHandle.cs:
+		Add parameter logic
+	* Test/TestOracleClient.cs:
+		Add some new test cases.
 	* System.Data.OracleClient/OracleTransaction.cs:
 	* System.Data.OracleClient.Oci/OciTransactionHandle.cs:
 	* Test/TestOracleClient.cs:
 		Add transaction logic for rollback/commit,
-		attaching to oracle service context, and a
-		couple of test cases.
+		attaching to oracle service context
 
 
 2003-02-17  Tim Coleman <[email protected]>

+ 164 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciBindHandle.cs

@@ -0,0 +1,164 @@
+// 
+// OciBindHandle.cs 
+//  
+// Part of managed C#/.NET library System.Data.OracleClient.dll
+//
+// Part of the Mono class libraries at
+// mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci
+//
+// Assembly: System.Data.OracleClient.dll
+// Namespace: System.Data.OracleClient.Oci
+// 
+// Author: 
+//     Tim Coleman <[email protected]>
+//         
+// Copyright (C) Tim Coleman, 2003
+// 
+
+using System;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace System.Data.OracleClient.Oci {
+	internal sealed class OciBindHandle : IOciHandle, IDisposable
+	{
+		#region Fields
+
+		IntPtr handle;
+		string name;
+		IntPtr value;
+		OciStatementHandle statement;
+		OciDataType type;
+		int size;
+		int indicator;
+	
+		#endregion // Fields
+
+		#region Constructors
+
+		public OciBindHandle (string name)
+		{
+			this.name = name;
+			this.value = IntPtr.Zero;
+			this.indicator = 0;
+		}
+
+		#endregion // Constructors
+
+		#region Properties
+
+		public IntPtr Handle {
+			get { return handle; }
+			set { handle = value; }
+		}
+
+		public OciHandleType HandleType {
+			get { return OciHandleType.Bind; }
+		}
+
+		public string Name {
+			get { return name; }
+			set { name = value; }
+		}
+
+		public int Size {
+			get { return size; }
+			set { size = value; }
+		}
+
+		public OciDataType Type {
+			get { return type; }
+			set { type = value; }
+		}
+
+		public IntPtr Value {
+			get { return value; }
+		}
+
+		#endregion
+
+		#region Methods
+
+		[DllImport ("oci", EntryPoint = "OCIBindByName")]
+		public static extern int OCIBindByName (IntPtr stmtp,
+							out IntPtr bindpp,
+							IntPtr errhp,
+							string placeholder,
+							int placeh_len,
+							IntPtr valuep,
+							int value_sz,
+							[MarshalAs (UnmanagedType.U2)] OciDataType dty,
+							ref int indp,
+							IntPtr alenp,
+							ushort rcodep,
+							uint maxarr_len,
+							IntPtr curelp,
+							uint mode);
+
+		public void Bind (OciStatementHandle statement, object val)
+		{
+			Console.WriteLine ("IN BIND");
+			handle = IntPtr.Zero;
+
+			this.statement = statement;
+
+			int indp = 0;
+			ushort alenp = 0;
+			IntPtr rcodep = IntPtr.Zero;
+			int status = 0;
+			OciDataType bindType = Type;
+			int definedSize = 0;
+
+			string stringValue = val.ToString ();
+			if (val == DBNull.Value) 
+				indicator = -1;
+			else {
+				switch (Type) {
+				case OciDataType.Number:
+				case OciDataType.Integer:
+				case OciDataType.Float:
+				case OciDataType.VarNum:
+					bindType = OciDataType.Char;
+					definedSize = stringValue.Length;
+					value = Marshal.StringToHGlobalAnsi (stringValue);
+					break;
+				case OciDataType.Date:
+					break;
+				default:
+					bindType = OciDataType.Char;
+					definedSize = stringValue.Length;
+					value = Marshal.StringToHGlobalAnsi (stringValue);
+					break;
+				}
+			}
+
+				
+			status = OCIBindByName (statement.Handle,
+						out handle,
+						statement.ErrorHandle.Handle,
+						name,
+						name.Length,
+						value,
+						definedSize,
+						bindType,
+						ref indicator,
+						IntPtr.Zero,
+						0,
+						0,
+						IntPtr.Zero, 
+						0);
+
+			if (status != 0) {
+				OciErrorInfo info = statement.ErrorHandle.HandleError ();
+				throw new OracleException (info.ErrorCode, info.ErrorMessage);
+			}
+		}
+
+		public void Dispose ()
+		{
+			Marshal.FreeHGlobal (value);
+		}
+
+		#endregion // Methods
+	}
+}

+ 44 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciDefineHandle.cs

@@ -173,6 +173,50 @@ namespace System.Data.OracleClient.Oci {
 			Marshal.FreeHGlobal (value);
 		}
 
+		public object GetValue ()
+		{
+			object tmp;
+
+			switch (DataType) {
+			case OciDataType.VarChar2:
+			case OciDataType.String:
+			case OciDataType.VarChar:
+			case OciDataType.Char:
+			case OciDataType.CharZ:
+			case OciDataType.OciString:
+				tmp = Marshal.PtrToStringAnsi (Value, Size);
+				if (tmp != null)
+					return String.Copy ((string) tmp);
+				break;
+			case OciDataType.Integer:
+				tmp = Marshal.PtrToStringAnsi (Value, Size);
+				if (tmp != null)
+					return Int32.Parse (String.Copy ((string) tmp));
+				break;
+			case OciDataType.Number:
+				tmp = Marshal.PtrToStringAnsi (Value, Size);
+				if (tmp != null) {
+					if (Scale == 0)
+						return Int32.Parse (String.Copy ((string) tmp));
+					else
+						return Decimal.Parse (String.Copy ((string) tmp));
+				}
+				break;
+			case OciDataType.Float:
+				tmp = Marshal.PtrToStringAnsi (Value, Size);
+				if (tmp != null)
+					return Double.Parse (String.Copy ((string) tmp));
+				break;
+			case OciDataType.Date:
+				tmp = Marshal.PtrToStringAnsi (Value, Size);
+				if (tmp != null)
+					return DateTime.Parse ((string) tmp);
+				break;
+			}
+
+			return DBNull.Value;
+		}
+
 		#endregion // Methods
 	}
 }

+ 14 - 0
mcs/class/System.Data.OracleClient/System.Data.OracleClient.Oci/OciStatementHandle.cs

@@ -28,7 +28,9 @@ namespace System.Data.OracleClient.Oci {
 		OciStatementMode mode;
 		OciServiceHandle serviceHandle;
 		OciErrorHandle errorHandle;
+
 		ArrayList values;
+		ArrayList parameters;
 
 		bool moreResults;
 		int columnCount;
@@ -40,6 +42,7 @@ namespace System.Data.OracleClient.Oci {
 		public OciStatementHandle (OciEnvironmentHandle environment, IntPtr handle)
 			: base (OciHandleType.Statement, environment, handle)
 		{
+			parameters = new ArrayList ();
 			language = OciStatementLanguage.NTV;
 			mode = OciStatementMode.Default;
 			moreResults = false;
@@ -131,6 +134,17 @@ namespace System.Data.OracleClient.Oci {
 			return handle;
 		}
 
+		public void FreeBindHandle (IntPtr handle)
+		{
+			int status = 0;
+
+			//status = OCIDescriptorFree (handle, OciDescriptorType.Parameter);
+			if (status != 0) {
+				OciErrorInfo info = ErrorHandle.HandleError ();
+				throw new OracleException (info.ErrorCode, info.ErrorMessage);
+			}
+		}
+
 		public void FreeParameterHandle (IntPtr handle)
 		{
 			int status = 0;

+ 23 - 4
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleCommand.cs

@@ -143,6 +143,12 @@ namespace System.Data.OracleClient {
 
 		#region Methods
 
+		public void BindParameters ()
+		{
+			foreach (OracleParameter p in Parameters) 
+				p.Bind (statement);
+		}
+
 		[MonoTODO]
 		public void Cancel ()
 		{
@@ -190,12 +196,14 @@ namespace System.Data.OracleClient {
 		{
 			int rowsAffected = -1;
 
+			statement = Connection.Oci.CreateStatement ();
 			ValidateCommand ("ExecuteNonQuery");
 			if (Transaction != null) 
 				Transaction.AttachToServiceContext ();
 
-			statement = Connection.Oci.CreateStatement ();
 			statement.Prepare (CommandText);
+			BindParameters ();
+
 			statement.ExecuteNonQuery ();
 
 			return rowsAffected;
@@ -220,19 +228,30 @@ namespace System.Data.OracleClient {
 
 		public OracleDataReader ExecuteReader (CommandBehavior behavior)
 		{
+			statement = Connection.Oci.CreateStatement ();
 			ValidateCommand ("ExecuteNonQuery");
 			if (Transaction != null) 
 				Transaction.AttachToServiceContext ();
-			statement = Connection.Oci.CreateStatement ();
 			statement.Prepare (CommandText);
+			BindParameters ();
+
 			statement.ExecuteQuery ();
 			return new OracleDataReader (this);
 		}
 
-		[MonoTODO]
 		public object ExecuteScalar ()
 		{
-			throw new NotImplementedException ();
+			statement = Connection.Oci.CreateStatement ();
+			ValidateCommand ("ExecuteNonQuery");
+			if (Transaction != null) 
+				Transaction.AttachToServiceContext ();
+			statement.Prepare (CommandText);
+			BindParameters ();
+
+			statement.ExecuteQuery ();
+			if (statement.Fetch ()) 
+				return ((OciDefineHandle) StatementHandle.Values [0]).GetValue ();
+			return DBNull.Value;
 		}
 
 		IDbDataParameter IDbCommand.CreateParameter ()

+ 3 - 42
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleDataReader.cs

@@ -318,53 +318,14 @@ namespace System.Data.OracleClient {
 			return (TimeSpan) value;
 		}
 
-		[MonoTODO]
 		public object GetValue (int i)
 		{
 			OciDefineHandle defineHandle = (OciDefineHandle) command.StatementHandle.Values [i];
-			object tmp;
 
-			if (defineHandle.IsNull)
+			if (IsDBNull (i))
 				return DBNull.Value;
 
-			switch (defineHandle.DataType) {
-			case OciDataType.VarChar2:
-			case OciDataType.String:
-			case OciDataType.VarChar:
-			case OciDataType.Char:
-			case OciDataType.CharZ:
-			case OciDataType.OciString:
-				tmp = Marshal.PtrToStringAnsi (defineHandle.Value, defineHandle.Size);
-				if (tmp != null)
-					return String.Copy ((string) tmp);
-				break;
-			case OciDataType.Integer:
-				tmp = Marshal.PtrToStringAnsi (defineHandle.Value, defineHandle.Size);
-				if (tmp != null) 
-					return Int32.Parse (String.Copy ((string) tmp));
-				break;
-			case OciDataType.Number:
-				tmp = Marshal.PtrToStringAnsi (defineHandle.Value, defineHandle.Size);
-				if (tmp != null) {
-					if (defineHandle.Scale == 0) 
-						return Int32.Parse (String.Copy ((string) tmp));
-					else
-						return Decimal.Parse (String.Copy ((string) tmp));
-				}
-				break;
-			case OciDataType.Float:
-				tmp = Marshal.PtrToStringAnsi (defineHandle.Value, defineHandle.Size);
-				if (tmp != null) 
-					return Double.Parse (String.Copy ((string) tmp));
-				break;
-			case OciDataType.Date:
-				tmp = Marshal.PtrToStringAnsi (defineHandle.Value, defineHandle.Size);
-				if (tmp != null)
-					return DateTime.Parse ((string) tmp);
-				break;
-			}
-
-			return DBNull.Value;
+			return defineHandle.GetValue ();
 		}
 
 		public int GetValues (object[] values)
@@ -391,7 +352,7 @@ namespace System.Data.OracleClient {
 
 		public bool IsDBNull (int i)
 		{
-			return GetValue (i) == null;
+			return ((OciDefineHandle) command.StatementHandle.Values [i]).IsNull;
 		}
 
 		[MonoTODO]

+ 231 - 18
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleParameter.cs

@@ -26,48 +26,67 @@ namespace System.Data.OracleClient {
 	{
 		#region Fields
 
+		string name;
+		OracleType oracleType = OracleType.VarChar;
+		int size;
+		ParameterDirection direction;
+		bool isNullable;
+		byte precision;
+		byte scale;
+		string srcColumn;
+		DataRowVersion srcVersion;
 		DbType dbType = DbType.AnsiString;
-		ParameterDirection direction = ParameterDirection.Input;
-		bool isNullable = false;
 		int offset = 0;
-		OracleType oracleType = OracleType.VarChar;
-		string name;
-		byte precision = 0x0;
-		byte scale = 0x0;
-		int size = 0;
 		bool sizeSet = false;
-		string srcColumn = String.Empty;
-		DataRowVersion srcVersion = DataRowVersion.Current;
 		object value = null;
 
 		OracleParameterCollection container = null;
+		OciBindHandle bindHandle;
 
 		#endregion // Fields
 
 		#region Constructors
 
 		public OracleParameter ()
+			: this (String.Empty, OracleType.VarChar, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
 		{
 		}
 
 		public OracleParameter (string name, object value)
 		{
+			bindHandle = new OciBindHandle (name);
+			this.name = name;
+			this.value = value;
+			SourceVersion = DataRowVersion.Current;
+			InferOracleType (value);
 		}
 
 		public OracleParameter (string name, OracleType dataType)
+			: this (name, dataType, 0, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
 		{
 		}
 
 		public OracleParameter (string name, OracleType dataType, int size)
+			: this (name, dataType, size, ParameterDirection.Input, false, 0, 0, String.Empty, DataRowVersion.Current, null)
 		{
 		}
 
 		public OracleParameter (string name, OracleType dataType, int size, string srcColumn)
+			: this (name, dataType, size, ParameterDirection.Input, false, 0, 0, srcColumn, DataRowVersion.Current, null)
 		{
 		}
 
 		public OracleParameter (string name, OracleType dataType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value)
 		{
+			bindHandle = new OciBindHandle (name);
+			this.name = name;
+			this.size = size;
+			this.value = value;
+
+			OracleType = dataType;
+			Direction = direction;
+			SourceColumn = srcColumn;
+			SourceVersion = srcVersion;
 		}
 
 		#endregion // Constructors
@@ -105,8 +124,8 @@ namespace System.Data.OracleClient {
 		}
 		
 		public string ParameterName {
-			get { return name; }
-			set { name = value; }
+			get { return bindHandle.Name; }
+			set { bindHandle.Name = value; }
 		}
 
 		public byte Precision {
@@ -115,7 +134,7 @@ namespace System.Data.OracleClient {
 		}
 
 		public byte Scale {
-			get { return precision; }
+			get { return scale; }
 			set { /* NO EFFECT*/ }
 		}
 
@@ -146,25 +165,219 @@ namespace System.Data.OracleClient {
 
 		#region Methods
 
+		internal void Bind (OciStatementHandle handle)
+		{
+			bindHandle.Bind (handle, value);
+		}
+
 		[MonoTODO]
 		object ICloneable.Clone ()
 		{
 			throw new NotImplementedException ();
 		}
 
-		public override string ToString ()
+		private void InferOracleType (object value)
 		{
-			return ParameterName;
+			Type type = value.GetType ();
+			string exception = String.Format ("The parameter data type of {0} is invalid.", type.Name);
+			switch (type.FullName) {
+			case "System.Int64":
+				SetOracleType (OracleType.Number);
+				break;
+			case "System.Boolean":
+			case "System.Byte":
+				SetOracleType (OracleType.Byte);
+				break;
+			case "System.String":
+				SetOracleType (OracleType.VarChar);
+				break;
+			case "System.DataType":
+				SetOracleType (OracleType.DateTime);
+				break;
+			case "System.Decimal":
+				SetOracleType (OracleType.Number);
+				//scale = ((decimal) value).Scale;
+				break;
+			case "System.Double":
+				SetOracleType (OracleType.Double);
+				break;
+			case "System.Byte[]":
+			case "System.Guid":
+				SetOracleType (OracleType.Raw);
+				break;
+			case "System.Int32":
+				SetOracleType (OracleType.Int32);
+				break;
+			case "System.Single":
+				SetOracleType (OracleType.Float);
+				break;
+			case "System.Int16":
+				SetOracleType (OracleType.Int16);
+				break;
+			default:
+				throw new ArgumentException (exception);
+			}
+		}
+
+		public void SetDbType (DbType type)
+		{
+			string exception = String.Format ("No mapping exists from DbType {0} to a known OracleType.", type);
+			switch (type) {
+			case DbType.AnsiString:
+				oracleType = OracleType.VarChar;
+				bindHandle.Type = OciDataType.VarChar;
+				break;
+			case DbType.AnsiStringFixedLength:
+				oracleType = OracleType.Char;
+				bindHandle.Type = OciDataType.Char;
+				break;
+			case DbType.Binary:
+			case DbType.Guid:
+				oracleType = OracleType.Raw;
+				bindHandle.Type = OciDataType.Raw;
+				break;
+			case DbType.Boolean:
+			case DbType.Byte:
+				oracleType = OracleType.Byte;
+				bindHandle.Type = OciDataType.Integer;
+				break;
+			case DbType.Currency:
+			case DbType.Decimal:
+			case DbType.Int64:
+				oracleType = OracleType.Number;
+				bindHandle.Type = OciDataType.Number;
+				break;
+			case DbType.Date:
+			case DbType.DateTime:
+			case DbType.Time:
+				oracleType = OracleType.DateTime;
+				bindHandle.Type = OciDataType.Char;
+				break;
+			case DbType.Double:
+				oracleType = OracleType.Double;
+				bindHandle.Type = OciDataType.Float;
+				break;
+			case DbType.Int16:
+				oracleType = OracleType.Int16;
+				bindHandle.Type = OciDataType.Integer;
+				break;
+			case DbType.Int32:
+				oracleType = OracleType.Int32;
+				bindHandle.Type = OciDataType.Integer;
+				break;
+			case DbType.Object:
+				oracleType = OracleType.Blob;
+				bindHandle.Type = OciDataType.Blob;
+				break;
+			case DbType.Single:
+				oracleType = OracleType.Float;
+				bindHandle.Type = OciDataType.Float;
+				break;
+			case DbType.String:
+				oracleType = OracleType.NVarChar;
+				bindHandle.Type = OciDataType.VarChar;
+				break;
+			case DbType.StringFixedLength:
+				oracleType = OracleType.NChar;
+				bindHandle.Type = OciDataType.Char;
+				break;
+			default:
+				throw new ArgumentException (exception);
+			}
+			dbType = type;
+
 		}
 
-		void SetDbType (DbType dbType)
+		public void SetOracleType (OracleType type)
 		{
-			this.dbType = dbType;
+			string exception = String.Format ("No mapping exists from OracleType {0} to a known DbType.", type);
+			switch (type) {
+			case OracleType.BFile:
+			case OracleType.Blob:
+			case OracleType.LongRaw:
+			case OracleType.Raw:
+				dbType = DbType.Binary;
+				bindHandle.Type = OciDataType.Raw;
+				break;
+			case OracleType.Byte:
+				dbType = DbType.Byte;
+				bindHandle.Type = OciDataType.Integer;
+				break;
+			case OracleType.Char:
+				dbType = DbType.AnsiStringFixedLength;
+				bindHandle.Type = OciDataType.Char;
+				break;
+			case OracleType.Clob:
+			case OracleType.LongVarChar:
+			case OracleType.RowId:
+			case OracleType.VarChar:
+				dbType = DbType.AnsiString;
+				bindHandle.Type = OciDataType.VarChar;
+				break;
+			case OracleType.Cursor:
+			case OracleType.IntervalDayToSecond:
+				dbType = DbType.Object;
+				bindHandle.Type = OciDataType.Blob;
+				break;
+			case OracleType.DateTime:
+			case OracleType.Timestamp:
+			case OracleType.TimestampLocal:
+			case OracleType.TimestampWithTZ:
+				dbType = DbType.DateTime;
+				bindHandle.Type = OciDataType.Char;
+				break;
+			case OracleType.Double:
+				dbType = DbType.Double;
+				bindHandle.Type = OciDataType.Float;
+				break;
+			case OracleType.Float:
+				dbType = DbType.Single;
+				bindHandle.Type = OciDataType.Float;
+				break;
+			case OracleType.Int16:
+				dbType = DbType.Int16;
+				bindHandle.Type = OciDataType.Integer;
+				break;
+			case OracleType.Int32:
+			case OracleType.IntervalYearToMonth:
+				dbType = DbType.Int32;
+				bindHandle.Type = OciDataType.Integer;
+				break;
+			case OracleType.NChar:
+				dbType = DbType.StringFixedLength;
+				bindHandle.Type = OciDataType.Char;
+				break;
+			case OracleType.NClob:
+			case OracleType.NVarChar:
+				dbType = DbType.String;
+				bindHandle.Type = OciDataType.VarChar;
+				break;
+			case OracleType.Number:
+				dbType = DbType.VarNumeric;
+				bindHandle.Type = OciDataType.Number;
+				break;
+			case OracleType.SByte:
+				dbType = DbType.SByte;
+				bindHandle.Type = OciDataType.Integer;
+				break;
+			case OracleType.UInt16:
+				dbType = DbType.UInt16;
+				bindHandle.Type = OciDataType.Integer;
+				break;
+			case OracleType.UInt32:
+				dbType = DbType.UInt32;
+				bindHandle.Type = OciDataType.Integer;
+				break;
+			default:
+				throw new ArgumentException (exception);
+			}
+
+			oracleType = type;
 		}
 
-		void SetOracleType (OracleType oracleType)
+		public override string ToString ()
 		{
-			this.oracleType = oracleType;
+			return ParameterName;
 		}
 
 		#endregion // Methods

+ 28 - 28
mcs/class/System.Data.OracleClient/System.Data.OracleClient/OracleType.cs

@@ -20,33 +20,33 @@ namespace System.Data.OracleClient {
 	[Serializable]
 	public enum OracleType
 	{
-		BFile,
-		Blob,
-		Byte,
-		Char,
-		Clob,
-		Cursor,
-		DateTime,
-		Double,
-		Float,
-		Int16,
-		Int32,
-		IntervalDayToSecond,
-		IntervalYearToMonth,
-		LongRaw,
-		LongVarChar,
-		NChar,
-		NClob,
-		Number,
-		NVarChar,
-		Raw,
-		RowId,
-		SByte,
-		Timestamp,
-		TimestampLocal,
-		TimestampWithTZ,
-		UInt16,
-		UInt32,
-		VarChar
+		BFile = 0x01,
+		Blob = 0x02,
+		Byte = 0x17,
+		Char = 0x03,
+		Clob = 0x04,
+		Cursor = 0x05,
+		DateTime = 0x06,
+		Double = 0x1e,
+		Float = 0x1d,
+		Int16 = 0x1c,
+		Int32 = 0x1b,
+		IntervalDayToSecond = 0x07,
+		IntervalYearToMonth = 0x08,
+		LongRaw = 0x09,
+		LongVarChar = 0x0a,
+		NChar = 0x0b,
+		NClob = 0x0c,
+		Number = 0x0d,
+		NVarChar = 0x0e,
+		Raw = 0x0f,
+		RowId = 0x10,
+		SByte = 0x1a,
+		Timestamp = 0x12,
+		TimestampLocal = 0x13,
+		TimestampWithTZ = 0x14,
+		UInt16 = 0x18,
+		UInt32 = 0x19,
+		VarChar = 0x16
 	}
 }

+ 118 - 0
mcs/class/System.Data.OracleClient/Test/TestOracleClient.cs

@@ -153,6 +153,112 @@ namespace Test.OracleClient
 			}
 		}
 
+		static void RollbackTest (OracleConnection connection)
+		{
+			OracleTransaction transaction = connection.BeginTransaction ();
+
+			OracleCommand insert = connection.CreateCommand ();
+			insert.Transaction = transaction;
+			insert.CommandText = "INSERT INTO EMP (EMPNO, ENAME, JOB) VALUES (8787, 'T Coleman', 'Monoist')";
+
+			Console.WriteLine ("Inserting record ...");
+
+			insert.ExecuteNonQuery ();
+
+			OracleCommand select = connection.CreateCommand ();
+			select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
+			select.Transaction = transaction;
+			OracleDataReader reader = select.ExecuteReader ();
+			reader.Read ();
+
+			Console.WriteLine ("Row count SHOULD BE 1, VALUE IS {0}", reader.GetValue (0));
+			reader.Close ();
+
+			Console.WriteLine ("Rolling back transaction ...");
+
+			transaction.Rollback ();
+
+			select = connection.CreateCommand ();
+			select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
+
+			reader = select.ExecuteReader ();
+			reader.Read ();
+			Console.WriteLine ("Row count SHOULD BE 0, VALUE IS {0}", reader.GetValue (0));
+			reader.Close ();
+		}
+		
+		static void CommitTest (OracleConnection connection)
+		{
+			OracleTransaction transaction = connection.BeginTransaction ();
+
+			OracleCommand insert = connection.CreateCommand ();
+			insert.Transaction = transaction;
+			insert.CommandText = "INSERT INTO EMP (EMPNO, ENAME, JOB) VALUES (8787, 'T Coleman', 'Monoist')";
+
+			Console.WriteLine ("Inserting record ...");
+
+			insert.ExecuteNonQuery ();
+
+			OracleCommand select = connection.CreateCommand ();
+			select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
+			select.Transaction = transaction;
+
+			Console.WriteLine ("Row count SHOULD BE 1, VALUE IS {0}", select.ExecuteScalar ());
+
+			Console.WriteLine ("Committing transaction ...");
+
+			transaction.Commit ();
+
+			select = connection.CreateCommand ();
+			select.CommandText = "SELECT COUNT(*) FROM EMP WHERE EMPNO = 8787";
+
+			Console.WriteLine ("Row count SHOULD BE 1, VALUE IS {0}", select.ExecuteScalar ());
+			transaction = connection.BeginTransaction ();
+			OracleCommand delete = connection.CreateCommand ();
+			delete.Transaction = transaction;
+			delete.CommandText = "DELETE FROM EMP WHERE EMPNO = 8787";
+			delete.ExecuteNonQuery ();
+			transaction.Commit ();
+		}
+
+		public static void ParameterTest (OracleConnection connection)
+		{
+			OracleTransaction transaction = connection.BeginTransaction ();
+			OracleCommand insert = connection.CreateCommand ();
+			insert.Transaction = transaction;
+
+			insert.CommandText = "INSERT INTO EMP (EMPNO, ENAME, JOB) VALUES (:P1, :P2, :P3)";
+			insert.Parameters.Add (":P1", 8888);
+			insert.Parameters.Add (":P2", "danmorg");
+			insert.Parameters.Add (":P3", "Monoist");
+
+			Console.WriteLine ("INSERTING DATA WITH PARAMETERS...");
+			Console.WriteLine (insert.CommandText);
+			insert.ExecuteNonQuery ();
+
+			OracleCommand select = connection.CreateCommand ();
+			select.Transaction = transaction;
+
+			select.CommandText = "SELECT ENAME, JOB FROM EMP WHERE EMPNO=:P1";
+			select.Parameters.Add (":P1", 8888);
+
+			Console.WriteLine ("VERIFYING RESULTS ...");
+
+			OracleDataReader reader = select.ExecuteReader ();
+			if (!reader.Read ())
+				Console.WriteLine ("ERROR: RECORD NOT FOUND");
+
+			Console.WriteLine ("ENAME - SHOULD BE danmorg, is {0}", reader.GetValue (0));
+			Console.WriteLine ("JOB - SHOULD BE Monoist, is {0}", reader.GetValue (1));
+
+			reader.Close ();
+
+			Console.WriteLine ("ROLLBACK TRANSACTION...");
+
+			transaction.Rollback ();
+		}
+
+
 		static void Wait(string msg) 
 		{
 			//Console.WriteLine(msg);
@@ -210,6 +316,18 @@ namespace Test.OracleClient
                         DataAdapterTest(con1);
 			Console.WriteLine ("DataAdapter Test END.");
 
+			Console.WriteLine ("Rollback Test BEGIN...");
+                        RollbackTest(con1);
+			Console.WriteLine ("Rollback Test END.");
+
+			Console.WriteLine ("Commit Test BEGIN...");
+                        CommitTest(con1);
+			Console.WriteLine ("Commit Test END.");
+
+			Console.WriteLine ("Parameter Test BEGIN...");
+                        ParameterTest(con1);
+			Console.WriteLine ("Parameter Test END.");
+
 			Wait("Verify Proper Results.");
 						
 			con1.Close();		

+ 1 - 0
mcs/class/System.Data.OracleClient/list

@@ -1,5 +1,6 @@
 System.Data.OracleClient.Oci/IOciHandle.cs
 System.Data.OracleClient.Oci/OciAttributeType.cs
+System.Data.OracleClient.Oci/OciBindHandle.cs
 System.Data.OracleClient.Oci/OciColumnInfo.cs
 System.Data.OracleClient.Oci/OciCredentialType.cs
 System.Data.OracleClient.Oci/OciDataType.cs