diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerException.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerException.java index 0f54156a8e..fc3e6a424b 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerException.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerException.java @@ -15,6 +15,7 @@ enum SQLState { STATEMENT_CANCELED("HY008"), DATA_EXCEPTION_NOT_SPECIFIC("22000"), DATA_EXCEPTION_DATETIME_FIELD_OVERFLOW("22008"), + NUMERIC_DATA_OUT_OF_RANGE("22003"), DATA_EXCEPTION_LENGTH_MISMATCH("22026"), COL_NOT_FOUND("42S22"); diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResource.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResource.java index 609dc7e135..7f30ca791e 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResource.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResource.java @@ -257,6 +257,7 @@ protected Object[][] getContents() { {"R_invalidProperty", "This property is not supported: {0}."}, {"R_referencingFailedTSP", "The DataSource trustStore password needs to be set."}, {"R_valueOutOfRange", "One or more values is out of range of values for the {0} SQL Server data type."}, + {"R_valueOutOfRangeSQLType", "One or more values is out of range of values for the {0} SQL type."}, {"R_integratedAuthenticationFailed", "Integrated authentication failed."}, {"R_permissionDenied", "Security violation. Permission to target \"{0}\" denied."}, {"R_getSchemaError", "Error getting default schema name."}, diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java b/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java index d60a9de3fa..ae3693af54 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java @@ -1083,8 +1083,16 @@ void execute(DTV dtv, Double doubleValue) throws SQLServerException { void execute(DTV dtv, BigDecimal bigDecimalValue) throws SQLServerException { if (DDC.exceedsMaxRPCDecimalPrecisionOrScale(bigDecimalValue)) { - String strValue = bigDecimalValue.toString(); - tdsWriter.writeRPCStringUnicode(name, strValue, isOutParam, collation); + if (JDBCType.DECIMAL == dtv.getJdbcType() || JDBCType.NUMERIC == dtv.getJdbcType()) { + // Throw exception for DECIMAL and NUMERIC Datatypes + MessageFormat form = new MessageFormat(SQLServerException.getErrString("R_valueOutOfRangeSQLType")); + Object[] msgArgs = {dtv.getJdbcType()}; + throw new SQLServerException(form.format(msgArgs), SQLState.NUMERIC_DATA_OUT_OF_RANGE, + DriverError.NOT_SET, null); + } else { + String strValue = bigDecimalValue.toString(); + tdsWriter.writeRPCStringUnicode(name, strValue, isOutParam, collation); + } } else { tdsWriter.writeRPCBigDecimal(name, bigDecimalValue, outScale, isOutParam); } @@ -1758,7 +1766,7 @@ else if ((JDBCType.VARCHAR == jdbcTypeSetByUser) || (JDBCType.CHAR == jdbcTypeSe SQLServerException.getErrString("R_valueOutOfRange")); Object[] msgArgs = {cryptoMeta.getBaseTypeInfo().getSSTypeName()}; throw new SQLServerException(form.format(msgArgs), - SQLState.DATA_EXCEPTION_DATETIME_FIELD_OVERFLOW, DriverError.NOT_SET, null); + SQLState.NUMERIC_DATA_OUT_OF_RANGE, DriverError.NOT_SET, null); } } else { // if the precision that user provides is smaller than the precision of the actual @@ -1772,7 +1780,7 @@ else if ((JDBCType.VARCHAR == jdbcTypeSetByUser) || (JDBCType.CHAR == jdbcTypeSe SQLServerException.getErrString("R_valueOutOfRange")); Object[] msgArgs = {SSType.DECIMAL}; throw new SQLServerException(form.format(msgArgs), - SQLState.DATA_EXCEPTION_DATETIME_FIELD_OVERFLOW, DriverError.NOT_SET, null); + SQLState.NUMERIC_DATA_OUT_OF_RANGE, DriverError.NOT_SET, null); } }