internal int PutOracleValue( object value, HandleRef valueBuffer, MetaType metaType, OracleConnection connection ) { // writes the managed object into the buffer in the appropriate // native Oracle format. OCI.DATATYPE ociType = metaType.OciType; int dataSize; OracleParameter parameter = Parameter; switch (ociType) { case OCI.DATATYPE.FLOAT: case OCI.DATATYPE.INTEGER: case OCI.DATATYPE.UNSIGNEDINT: Marshal.StructureToPtr(value, (IntPtr)valueBuffer, false); dataSize = metaType.BindSize; break; case OCI.DATATYPE.RAW: case OCI.DATATYPE.LONGRAW: case OCI.DATATYPE.LONGVARRAW: dataSize = OracleBinary.MarshalToNative(value, parameter.Offset, parameter.Size, valueBuffer, ociType); break; case OCI.DATATYPE.DATE: case OCI.DATATYPE.INT_TIMESTAMP: case OCI.DATATYPE.INT_TIMESTAMP_TZ: case OCI.DATATYPE.INT_TIMESTAMP_LTZ: dataSize = OracleDateTime.MarshalToNative(value, valueBuffer, ociType); break; case OCI.DATATYPE.BFILE: // We cannot construct lobs; if you want to bind a lob, you have to have // a lob. if (!(value is OracleBFile)) { throw ADP.BadBindValueType(value.GetType(), metaType.OracleType); } Marshal.WriteIntPtr((IntPtr)valueBuffer, (IntPtr)((OracleBFile)value).Descriptor.Handle); dataSize = IntPtr.Size; break; case OCI.DATATYPE.BLOB: case OCI.DATATYPE.CLOB: // We cannot construct lobs; if you want to bind a lob, you have to have // a lob. if (!(value is OracleLob)) { throw ADP.BadBindValueType(value.GetType(), metaType.OracleType); } // If you don't disable the buffering, you'll cause the PL/SQL code that // uses this LOB to have problems doing things like DBMS_LOB.GET_LENGTH() ((OracleLob)value).EnsureBuffering(false); Marshal.WriteIntPtr((IntPtr)valueBuffer, (IntPtr)((OracleLob)value).Descriptor.Handle); dataSize = IntPtr.Size; break; case OCI.DATATYPE.INT_INTERVAL_YM: dataSize = OracleMonthSpan.MarshalToNative(value, valueBuffer); break; case OCI.DATATYPE.VARNUM: dataSize = OracleNumber.MarshalToNative(value, valueBuffer, connection); break; case OCI.DATATYPE.CHAR: case OCI.DATATYPE.VARCHAR2: case OCI.DATATYPE.LONG: case OCI.DATATYPE.LONGVARCHAR: dataSize = OracleString.MarshalToNative(value, parameter.Offset, parameter.Size, valueBuffer, ociType, _bindAsUCS2); break; case OCI.DATATYPE.INT_INTERVAL_DS: dataSize = OracleTimeSpan.MarshalToNative(value, valueBuffer); break; default: throw ADP.TypeNotSupported(ociType); } Debug.Assert(dataSize <= _bufferLengthInBytes, String.Format("Internal Error: Exceeded Internal Buffer. DataSize={0} BufferLength={1}", dataSize, _bufferLengthInBytes)); return(dataSize); }