示例#1
0
        public override void SetParameter(DataConnection dataConnection, IDbDataParameter parameter, string name, DbDataType dataType, object?value)
        {
            switch (dataType.DataType)
            {
            case DataType.DateTimeOffset:
                if (value is DateTimeOffset dto)
                {
                    dto = DataTools.AdjustPrecision(dto, (byte?)dataType.Precision ?? 6);
                    var zone = (dto.Offset < TimeSpan.Zero ? "-" : "+") + dto.Offset.ToString("hh\\:mm");
                    value = Adapter.CreateOracleTimeStampTZ(dto, zone);
                }
                break;

            case DataType.Boolean:
                dataType = dataType.WithDataType(DataType.Byte);
                if (value is bool boolValue)
                {
                    value = boolValue ? (byte)1 : (byte)0;
                }
                break;

            case DataType.Guid:
                if (value is Guid guid)
                {
                    value = guid.ToByteArray();
                }
                break;

            case DataType.Time:
                // According to http://docs.oracle.com/cd/E16655_01/win.121/e17732/featOraCommand.htm#ODPNT258
                // Inference of DbType and OracleDbType from Value: TimeSpan - Object - IntervalDS
                if (value is TimeSpan)
                {
                    dataType = dataType.WithDataType(DataType.Undefined);
                }
                break;

            case DataType.BFile:
            {
                // TODO: BFile we do not support setting parameter value
                value = null;
                break;
            }

            case DataType.DateTime:
            {
                if (value is DateTime dt)
                {
                    value = DataTools.AdjustPrecision(dt, 0);
                }
                break;
            }

            case DataType.DateTime2:
            {
                if (value is DateTime dt)
                {
                    value = DataTools.AdjustPrecision(dt, (byte?)dataType.Precision ?? 6);
                }
                break;
            }
            }

            if (dataType.DataType == DataType.Undefined && value is string && ((string)value).Length >= 4000)
            {
                dataType = dataType.WithDataType(DataType.NText);
            }

            base.SetParameter(dataConnection, parameter, name, dataType, value);
        }