字符串文字中的Informix JDBC,MONEY和小数分隔符问题

时间:2010-01-07 13:34:09

标签: java jdbc informix currency

我在使用MONEY数据类型的JDBC应用程序时遇到问题。 当我插入MONEY列时:

insert into _money_test (amt) values ('123.45')

我有例外:

Character to numeric conversion error

使用ODBC驱动程序从本机Windows应用程序运行相同的SQL。 我住在波兰,有波兰语,在我的国家逗号分开 数字的小数部分,所以我试过:

insert into _money_test (amt) values ('123,45')

它有效。 我在PreparedStatement中检查过,我必须使用点分隔符:123.45。 当然我可以使用:

insert into _money_test (amt) values (123.45)

但有些代码是“通用的”,它从csv文件导入数据,将数字放入字符串文字是安全的。

如何强制JDBC在文字中使用DBMONEY(或简单点)?

我的工作站是WinXP。 我在版本3.50 TC5 / JC5中有ODBC和JDBC Informix客户端。 我已将DBMONEY设置为dot:

DBMONEY=.

编辑:

Jython中的测试代码:

import sys
import traceback
from java.sql import DriverManager
from java.lang import Class

Class.forName("com.informix.jdbc.IfxDriver")

QUERY = "insert into _money_test (amt) values ('123.45')"

def test_money(driver, db_url, usr, passwd):
    try:
        print("\n\n%s\n--------------" % (driver))
        db = DriverManager.getConnection(db_url, usr, passwd)
        c = db.createStatement()
        c.execute("delete from _money_test")
        c.execute(QUERY)
        rs = c.executeQuery("select amt from _money_test")
        while (rs.next()):
            print('[%s]' % (rs.getString(1)))
        rs.close()
        c.close()
        db.close()
    except:
        print("there were errors!")
        s = traceback.format_exc()
        sys.stderr.write("%s\n" % (s))



print(QUERY)
test_money("com.informix.jdbc.IfxDriver", 'jdbc:informix-sqli://169.0.1.225:9088/test:informixserver=ol_225;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250', 'informix', 'passwd')
test_money("sun.jdbc.odbc.JdbcOdbcDriver", 'jdbc:odbc:test', 'informix', 'passwd')

当我使用点和逗号运行money literal时的结果:

C:\db_examples>jython ifx_jdbc_money.py
insert into _money_test (amt) values ('123,45')


com.informix.jdbc.IfxDriver
--------------
[123.45]


sun.jdbc.odbc.JdbcOdbcDriver
--------------
there were errors!
Traceback (most recent call last):
    File "ifx_jdbc_money.py", line 16, in test_money
        c.execute(QUERY)
SQLException: java.sql.SQLException: [Informix][Informix ODBC Driver][Informix]Character to numeric conversion error


C:\db_examples>jython ifx_jdbc_money.py
insert into _money_test (amt) values ('123.45')


com.informix.jdbc.IfxDriver
--------------
there were errors!
Traceback (most recent call last):
    File "ifx_jdbc_money.py", line 16, in test_money
        c.execute(QUERY)
SQLException: java.sql.SQLException: Character to numeric conversion error



sun.jdbc.odbc.JdbcOdbcDriver
--------------
[123.45]

2 个答案:

答案 0 :(得分:2)

Informix JDBC data type mapping documentation说明如下:

  

java.math.BigDecimal MONEY(p,s)1

因此,您需要使用java.math.BigDecimal代替java.lang.String来表示值,PreparedStatement#setBigDecimal()来设置值,ResultSet#getBigDecimal()来获取值。

您可以将String转换为BigDecimal,只需将其作为constructor参数传递即可。反过来可以通过调用BigDecimal的{​​{3}}方法来完成。

答案 1 :(得分:0)

我使用PreparedStatement解决了这个问题。我认为“字符到数字转换错误”是Informix JDBC驱动程序中的一个错误。

在我经常使用的其他数据库中,PostgreSQL,如果我通过本机JDBC驱动程序或JDBC-ODBC桥运行查询,则没有区别。我发现PostgreSQL不接受数字形式123.45。 PostgreSQL接受带有点的字符串文字,但此点作为千位分隔符处理。唯一正确接受的值是字符串文字,其中逗号分隔小数部分。

修改

可以通过在服务器端设置DBMONEY=.来解决,然后所有连接(ODBC,JDBC)都可以使用该设置。