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;
}
#endregion