db-torque-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "CG Monroe (JIRA)" <j...@apache.org>
Subject [jira] Commented: (TORQUE-53) Inserting wrong data if data type is Double and 0(zero) is the last digit
Date Mon, 21 Aug 2006 20:32:14 GMT
    [ http://issues.apache.org/jira/browse/TORQUE-53?page=comments#action_12429519 ] 
            
CG Monroe commented on TORQUE-53:
---------------------------------

I reproduced a similar error with MS SQL and a different JDBC driver.  In my case, the update
did not happen at all.  Once you got to 12345670.0000 and greater, the value stayed the same
(1234560.0000).  Adding in a fraction caused it to work.

So, I started digging thru the code to figure it out.  After creating a Village jar with some
debug statements, I finally tracked it down to the following:

Village uses the actual DB Meta data to determine the SQL Column type and object value to
use in populating the prepared statement.  With an SQL Column type of Numeric, it maps to
a BigDecimal.  In setting the prepared statement parameters (in Value.setPreparedStatementValue),
it has to convert the Double value to a BigDecimal.  This is done in the Value.asBigDecimal()
method using the equivalent of:

new BigDecimal(  valueObject.asString() )

7 digits is the point at which a Double object's toString() converts to Exponential notation.
There are several Java bug entries about problems with BigDecimal's conversion from text to
object.  I suspect that the ending in "0" is one of them, but did not find an exact match
in a VERY brief scan.

If you convert a Double to a BigDecimal using the BigDecimal( Double) constructor it works
fine.  The Village Value.asBigDecimal() method should probably be patched to handle this case
(and lots more I'm sure).

But in the meantime, I'd suggest having your schema define the field exactly as it is in the
DB, e.g.:

    <column name="balance" type="NUMERIC" size="15" scale="4"/>

Then convert your Double values to BigDecimal with the "safe" constructor before saving them.


(You may also try an updated Java VM version, a lot of bugs related to the seemed to have
been fixed in newer JVMs (Mine is 1.5.0_06...).

Bottom line is, not sure if this is a Torque or Village bug, or really a Java VM bug.  I'll
leave that for others to determine.





> Inserting wrong data if data type is Double and 0(zero) is the last digit
> -------------------------------------------------------------------------
>
>                 Key: TORQUE-53
>                 URL: http://issues.apache.org/jira/browse/TORQUE-53
>             Project: Torque
>          Issue Type: Bug
>    Affects Versions: 3.2
>         Environment: Windows NT
>            Reporter: Sudhakar Pandey
>
> Problem: Torque is inserting wrong data in the database for Double type. 
> Database description
> ~~~~~~~~~~~~~~~~~
> Database: Oracle 10g
> Oracle JDBC version: 10.2.0.1.0
> Table Name: Bank_Account
> Column Name: Current_Balance
> Column dataType: NUMBER(15,4)
> When I am trying to enter a value new Double(1234567890) it insert/update 12.3456 in
the database. This happens only if the number of digits are more than 7 and last digit is
0(zero).
> I have tried updating using directly PreparedStatement and it just worked fine. Problem
comes only with Torque.
> Following is the program I have used for varification:
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> <Code>
> ............
> 	public static void main(String argv[]) {
> 		TorqueInitializer.init();
> 		Connection db_connection = null;
> 		db_connection = Common.getConnection();
> 		
> 		if (db_connection == null) {
> 			System.out.println("Unable to get dbConnection");
> 		}
> 		
> 		try {
> 			BankAccount bankAccount = showCurrentBalance(db_connection);
> 			long value = 12345l;
> 			for (int i = 5; i < 11; i++, value = ((value * 10) + i)) {
> 				System.out.println("Value=" + value);		
> 				System.out.print("<Before update> ");
> 				bankAccount = showCurrentBalance(db_connection);
> 				
> 				if (updateUsingPrepStat)
> 					updateCurrentBalanceUsingPStat(db_connection, new Double(
> 							value * 10));
> 				else
> 					updateCurrentBalanceUsingTorque(bankAccount, db_connection,
> 							new Double(value * 10));
> 				System.out.print("<After update> ");
> 				bankAccount = showCurrentBalance(db_connection);
> 			}
> 		} catch (Exception e) {
> 			e.printStackTrace();
> 		} finally {
> 			
> 			if (db_connection != null)
> 				try {
> 					db_connection.close();
> 				} catch (SQLException e) {
> 					e.printStackTrace();
> 				}
> 		}
> 	}
> 	
> 	public static BankAccount showCurrentBalance(Connection db_connection) {
> 		try {
> 			Criteria c = new Criteria();
> 			c.add(BankAccountPeer.BANK_ACCOUNT_ID, new Long(1523764));
> 			List list = BankAccountPeer.doSelect(c, db_connection);
> 			BankAccount bankAccount = (BankAccount) list.get(0);
> 			System.out.println("Current account balance: "
> 					+ bankAccount.getCurrentBalance());
> 			return bankAccount;
> 		} catch (TorqueException e) {
> 			e.printStackTrace();
> 		}
> 		return null;
> 	}
> 	
> 	public static void updateCurrentBalanceUsingTorque(BankAccount bankAccount,
> 			Connection db_connection, Double value) throws Exception {
> 		bankAccount.setCurrentBalance(value);
> 		bankAccount.save(db_connection, "ibdv70");
> 	}
> ............
> </Code

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org


Mime
View raw message