Exemplo n.º 1
0
        ///
        /// Bind this parameter
        ///
        internal short Bind(IntPtr hwndStmt, short paramNum)
        {
            int inLength = requiredMemory;

            db2LastUsedDataType = db2DataType;
            short db2CType = DB2Constants.SQL_C_DEFAULT;

            if ((direction == ParameterDirection.Input) || (direction == ParameterDirection.InputOutput))
            {
                if (Convert.IsDBNull(Value))
                {
                    inLength = DB2Constants.SQL_NULL_DATA;
                    if ((db2DataType == DB2Constants.SQL_UNKNOWN_TYPE) ||
                        (db2DataType == DB2Constants.SQL_DECIMAL))
                    {
                        db2LastUsedDataType = DB2Constants.SQL_VARGRAPHIC;
                        db2CType            = DB2Constants.SQL_C_WCHAR;
                    }
                }
            }
            if ((direction == ParameterDirection.Input) || (direction == ParameterDirection.InputOutput))
            {
                switch (db2DataType)
                {
                case DB2Constants.SQL_WCHAR:
                    string tmpString = Convert.ToString(Value);
                    inLength = tmpString.Length;
                    if ((Size > 0) && (inLength > Size))
                    {
                        inLength = Size;
                    }
                    Marshal.Copy(tmpString.ToCharArray(), 0, internalBuffer, inLength);
                    inLength           *= 2;
                    db2LastUsedDataType = DB2Constants.SQL_VARGRAPHIC;
                    db2CType            = DB2Constants.SQL_C_WCHAR;
                    if (inLength > 32000)
                    {
                        db2LastUsedDataType = DB2Constants.SQL_TYPE_BLOB;
                    }
                    break;

                case DB2Constants.SQL_VARBINARY:
                    byte[] tmpBytes = (byte[])Value;
                    inLength = tmpBytes.Length;
                    if ((Size > 0) && (inLength > Size))
                    {
                        inLength = Size;
                    }
                    Marshal.Copy(tmpBytes, 0, internalBuffer, inLength);
                    db2CType = DB2Constants.SQL_TYPE_BINARY;
                    break;

                case DB2Constants.SQL_BIT:
                case DB2Constants.SQL_UTINYINT:
                case DB2Constants.SQL_SMALLINT:
                    Marshal.WriteInt16(internalBuffer, Convert.ToInt16(Value));
                    db2CType = DB2Constants.SQL_C_SSHORT;
                    break;

                case DB2Constants.SQL_INTEGER:
                    Marshal.WriteInt32(internalBuffer, Convert.ToInt32(Value));
                    db2CType = DB2Constants.SQL_C_SLONG;
                    break;

                case DB2Constants.SQL_BIGINT:
                    Marshal.WriteInt64(internalBuffer, Convert.ToInt64(Value));
                    db2CType = DB2Constants.SQL_C_SBIGINT;
                    break;

                case DB2Constants.SQL_REAL:
                    Marshal.StructureToPtr((float)Convert.ToDouble(Value), internalBuffer, false);
                    db2CType = DB2Constants.SQL_C_TYPE_REAL;
                    break;

                case DB2Constants.SQL_DOUBLE:
                    Marshal.StructureToPtr(Convert.ToDouble(Value), internalBuffer, false);
                    db2CType = DB2Constants.SQL_C_DOUBLE;
                    break;

                case DB2Constants.SQL_DECIMAL:
                    byte[] tmpDecimalData = System.Text.Encoding.UTF8.GetBytes(
                        Convert.ToDecimal(Value).ToString(System.Globalization.CultureInfo.InvariantCulture));
                    inLength = Math.Min(tmpDecimalData.Length, requiredMemory);
                    Marshal.Copy(tmpDecimalData, 0, internalBuffer, inLength);
                    db2LastUsedDataType = DB2Constants.SQL_VARCHAR;
                    db2CType            = DB2Constants.SQL_C_CHAR;
                    break;

                case DB2Constants.SQL_TYPE_DATE:
                    DateTime tmpDate = Convert.ToDateTime(Value);
                    Marshal.WriteInt16(internalBuffer, 0, (short)tmpDate.Year);
                    Marshal.WriteInt16(internalBuffer, 2, (short)tmpDate.Month);
                    Marshal.WriteInt16(internalBuffer, 4, (short)tmpDate.Day);
                    db2CType = DB2Constants.SQL_C_TYPE_DATE;
                    break;

                case DB2Constants.SQL_TYPE_TIMESTAMP:
                    DateTime tmpDateTime = Convert.ToDateTime(Value);
                    Marshal.WriteInt16(internalBuffer, 0, (short)tmpDateTime.Year);
                    Marshal.WriteInt16(internalBuffer, 2, (short)tmpDateTime.Month);
                    Marshal.WriteInt16(internalBuffer, 4, (short)tmpDateTime.Day);
                    Marshal.WriteInt16(internalBuffer, 6, (short)tmpDateTime.Hour);
                    Marshal.WriteInt16(internalBuffer, 8, (short)tmpDateTime.Minute);
                    Marshal.WriteInt16(internalBuffer, 10, (short)tmpDateTime.Second);
                    Marshal.WriteInt32(internalBuffer, 12, (int)((tmpDateTime.Ticks % 10000000) * 100));
                    db2CType = DB2Constants.SQL_C_TYPE_TIMESTAMP;
                    break;

                case DB2Constants.SQL_TYPE_TIME:
                    TimeSpan tmpTime = (TimeSpan)Value;
                    Marshal.WriteInt16(internalBuffer, 0, (short)tmpTime.Hours);
                    Marshal.WriteInt16(internalBuffer, 2, (short)tmpTime.Minutes);
                    Marshal.WriteInt16(internalBuffer, 4, (short)tmpTime.Seconds);
                    db2CType = DB2Constants.SQL_C_TYPE_TIME;
                    break;
                }
            }
            else
            {
                switch (db2DataType)
                {
                case DB2Constants.SQL_WCHAR:
                    db2LastUsedDataType = DB2Constants.SQL_VARGRAPHIC;
                    db2CType            = DB2Constants.SQL_C_WCHAR;
                    break;

                case DB2Constants.SQL_VARBINARY:
                    db2CType = DB2Constants.SQL_TYPE_BINARY;
                    break;

                case DB2Constants.SQL_BIT:
                case DB2Constants.SQL_UTINYINT:
                case DB2Constants.SQL_SMALLINT:
                    db2CType = DB2Constants.SQL_C_SSHORT;
                    break;

                case DB2Constants.SQL_INTEGER:
                    db2CType = DB2Constants.SQL_C_SLONG;
                    break;

                case DB2Constants.SQL_BIGINT:
                    db2CType = DB2Constants.SQL_C_SBIGINT;
                    break;

                case DB2Constants.SQL_REAL:
                    db2CType = DB2Constants.SQL_C_TYPE_REAL;
                    break;

                case DB2Constants.SQL_DOUBLE:
                    db2CType = DB2Constants.SQL_C_DOUBLE;
                    break;

                case DB2Constants.SQL_DECIMAL:
                    db2LastUsedDataType = DB2Constants.SQL_VARCHAR;
                    db2CType            = DB2Constants.SQL_C_CHAR;
                    break;

                case DB2Constants.SQL_TYPE_DATE:
                    db2CType = DB2Constants.SQL_C_TYPE_DATE;
                    break;

                case DB2Constants.SQL_TYPE_TIMESTAMP:
                    db2CType = DB2Constants.SQL_C_TYPE_TIMESTAMP;
                    break;

                case DB2Constants.SQL_TYPE_TIME:
                    db2CType = DB2Constants.SQL_C_TYPE_TIME;
                    break;
                }
            }
            Marshal.WriteInt32(internalLengthBuffer, inLength);
            short sqlRet = DB2CLIWrapper.SQLBindParameter(hwndStmt, paramNum, db2Direction,
                                                          db2CType, db2LastUsedDataType, Size, Scale,
                                                          internalBuffer, requiredMemory, internalLengthBuffer);

            return(sqlRet);
        }