in src/main/java/com/microsoft/sqlserver/jdbc/dtv.java [1147:1380]
void writeEncryptData(DTV dtv, boolean isNull) throws SQLServerException {
JDBCType destType = (null == jdbcTypeSetByUser) ? dtv.getJdbcType() : jdbcTypeSetByUser;
switch (destType.getIntValue()) {
case java.sql.Types.INTEGER: // 0x38
tdsWriter.writeByte(TDSType.INTN.byteValue());
tdsWriter.writeByte((byte) 0x04);
break;
case java.sql.Types.BIGINT: // 0x7f
tdsWriter.writeByte(TDSType.INTN.byteValue());
tdsWriter.writeByte((byte) 0x08);
break;
case java.sql.Types.BIT: // 0x32
tdsWriter.writeByte(TDSType.BITN.byteValue());
tdsWriter.writeByte((byte) 0x01);
break;
case java.sql.Types.SMALLINT: // 0x34
tdsWriter.writeByte(TDSType.INTN.byteValue());
tdsWriter.writeByte((byte) 0x02);
break;
case java.sql.Types.TINYINT: // 0x30
tdsWriter.writeByte(TDSType.INTN.byteValue());
tdsWriter.writeByte((byte) 0x01);
break;
case java.sql.Types.DOUBLE: // (FLT8TYPE) 0x3E
tdsWriter.writeByte(TDSType.FLOATN.byteValue());
tdsWriter.writeByte((byte) 0x08);
break;
case java.sql.Types.REAL: // (FLT4TYPE) 0x3B
tdsWriter.writeByte(TDSType.FLOATN.byteValue());
tdsWriter.writeByte((byte) 0x04);
break;
case microsoft.sql.Types.MONEY:
case microsoft.sql.Types.SMALLMONEY:
case java.sql.Types.NUMERIC:
case java.sql.Types.DECIMAL:
// money/smallmoney is mapped to JDBC types java.sql.Types.Decimal
if ((JDBCType.MONEY == destType) || (JDBCType.SMALLMONEY == destType)) {
tdsWriter.writeByte(TDSType.MONEYN.byteValue()); // 0x6E
tdsWriter.writeByte((byte) ((JDBCType.MONEY == destType) ? 8 : 4));
} else {
tdsWriter.writeByte(TDSType.NUMERICN.byteValue()); // 0x6C
if (isNull) {
tdsWriter.writeByte((byte) 0x11); // maximum length
if (null != cryptoMeta && null != cryptoMeta.getBaseTypeInfo()) {
tdsWriter.writeByte(
(byte) ((0 != valueLength) ? valueLength
: cryptoMeta.getBaseTypeInfo().getPrecision()));
} else {
tdsWriter.writeByte((byte) ((0 != valueLength) ? valueLength : 0x12)); // default
// length, 0x12
// equals to 18,
// which is
// the default
// length for
// decimal value
}
tdsWriter.writeByte((byte) (outScale)); // send scale
} else {
tdsWriter.writeByte((byte) 0x11); // maximum length
if (null != cryptoMeta && null != cryptoMeta.getBaseTypeInfo()) {
tdsWriter.writeByte((byte) cryptoMeta.getBaseTypeInfo().getPrecision());
} else {
tdsWriter.writeByte((byte) ((0 != valueLength) ? valueLength : 0x12)); // default
// length, 0x12
// equals to 18,
// which is
// the default
// length for
// decimal value
}
if (null != cryptoMeta && null != cryptoMeta.getBaseTypeInfo()) {
tdsWriter.writeByte((byte) cryptoMeta.getBaseTypeInfo().getScale());
} else {
tdsWriter.writeByte((byte) ((null != dtv.getScale()) ? dtv.getScale() : 0)); // send
// scale
}
}
}
break;
case microsoft.sql.Types.GUID:
tdsWriter.writeByte(TDSType.GUID.byteValue());
if (isNull)
tdsWriter.writeByte((byte) ((0 != valueLength) ? valueLength : 1));
else
tdsWriter.writeByte((byte) 0x10);
break;
case java.sql.Types.CHAR: // 0xAF
// BIGCHARTYPE
tdsWriter.writeByte(TDSType.BIGCHAR.byteValue());
if (isNull)
tdsWriter.writeShort((short) ((0 != valueLength) ? valueLength : 1));
else
tdsWriter.writeShort((short) (valueLength));
if (null != collation)
collation.writeCollation(tdsWriter);
else
conn.getDatabaseCollation().writeCollation(tdsWriter);
break;
case java.sql.Types.NCHAR: // 0xEF
tdsWriter.writeByte(TDSType.NCHAR.byteValue());
if (isNull)
tdsWriter.writeShort((short) ((0 != valueLength) ? (valueLength * 2) : 1));
else {
if (isOutParam) {
tdsWriter.writeShort((short) (valueLength * 2));
} else {
if (valueLength > DataTypes.SHORT_VARTYPE_MAX_BYTES) {
tdsWriter.writeShort((short) DataTypes.MAX_VARTYPE_MAX_CHARS);
} else {
tdsWriter.writeShort((short) valueLength);
}
}
}
if (null != collation)
collation.writeCollation(tdsWriter);
else
conn.getDatabaseCollation().writeCollation(tdsWriter);
break;
case java.sql.Types.LONGVARCHAR:
case java.sql.Types.VARCHAR: // 0xA7
// BIGVARCHARTYPE
tdsWriter.writeByte(TDSType.BIGVARCHAR.byteValue());
if (isNull) {
if (dtv.jdbcTypeSetByUser.getIntValue() == java.sql.Types.LONGVARCHAR) {
tdsWriter.writeShort((short) DataTypes.MAX_VARTYPE_MAX_CHARS);
} else {
tdsWriter.writeShort((short) ((0 != valueLength) ? valueLength : 1));
}
} else {
if (dtv.jdbcTypeSetByUser.getIntValue() == java.sql.Types.LONGVARCHAR) {
tdsWriter.writeShort((short) DataTypes.MAX_VARTYPE_MAX_CHARS);
} else if ((dtv.getJdbcType().getIntValue() == java.sql.Types.LONGVARCHAR)
|| (dtv.getJdbcType().getIntValue() == java.sql.Types.LONGNVARCHAR)) {
tdsWriter.writeShort((short) 1);
} else {
if (valueLength > DataTypes.SHORT_VARTYPE_MAX_BYTES) {
tdsWriter.writeShort((short) DataTypes.MAX_VARTYPE_MAX_CHARS);
} else {
tdsWriter.writeShort((short) valueLength);
}
}
}
if (null != collation)
collation.writeCollation(tdsWriter);
else
conn.getDatabaseCollation().writeCollation(tdsWriter);
break;
case java.sql.Types.LONGNVARCHAR:
case java.sql.Types.NVARCHAR: // 0xE7
tdsWriter.writeByte(TDSType.NVARCHAR.byteValue());
if (isNull) {
if (dtv.jdbcTypeSetByUser.getIntValue() == java.sql.Types.LONGNVARCHAR) {
tdsWriter.writeShort((short) DataTypes.MAX_VARTYPE_MAX_CHARS);
} else {
tdsWriter.writeShort((short) ((0 != valueLength) ? (valueLength * 2) : 1));
}
} else {
if (isOutParam) {
// for stored procedure output parameter, we need to
// double the length that is sent to SQL Server,
// Otherwise it gives Operand Clash exception.
if (dtv.jdbcTypeSetByUser.getIntValue() == java.sql.Types.LONGNVARCHAR) {
tdsWriter.writeShort((short) DataTypes.MAX_VARTYPE_MAX_CHARS);
} else {
tdsWriter.writeShort((short) (valueLength * 2));
}
} else {
if (valueLength > DataTypes.SHORT_VARTYPE_MAX_BYTES) {
tdsWriter.writeShort((short) DataTypes.MAX_VARTYPE_MAX_CHARS);
} else {
tdsWriter.writeShort((short) valueLength);
}
}
}
if (null != collation)
collation.writeCollation(tdsWriter);
else
conn.getDatabaseCollation().writeCollation(tdsWriter);
break;
case java.sql.Types.BINARY: // 0xAD
tdsWriter.writeByte(TDSType.BIGBINARY.byteValue());
if (isNull)
tdsWriter.writeShort((short) ((0 != valueLength) ? valueLength : 1));
else
tdsWriter.writeShort((short) (valueLength));
break;
case java.sql.Types.LONGVARBINARY:
case java.sql.Types.VARBINARY: // 0xA5
// BIGVARBINARY
tdsWriter.writeByte(TDSType.BIGVARBINARY.byteValue());
if (isNull) {
if (dtv.jdbcTypeSetByUser.getIntValue() == java.sql.Types.LONGVARBINARY) {
tdsWriter.writeShort((short) DataTypes.MAX_VARTYPE_MAX_BYTES);
} else {
tdsWriter.writeShort((short) ((0 != valueLength) ? valueLength : 1));
}
} else {
if (dtv.jdbcTypeSetByUser.getIntValue() == java.sql.Types.LONGVARBINARY) {
tdsWriter.writeShort((short) DataTypes.MAX_VARTYPE_MAX_BYTES);
} else {
tdsWriter.writeShort((short) (valueLength));
}
}
break;
default:
MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_UnsupportedDataTypeAE"));
throw new SQLServerException(form.format(new Object[] {destType}), null, 0, null);
}
tdsWriter.writeCryptoMetaData();
}