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

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

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

我有例外:

 Character to numeric conversion error 

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

 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] 

Informix JDBC数据类型映射文档说明如下:

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

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

您只需将其作为构造函数参数传递,就可以从String “转换”为BigDecimal 。 反过来可以通过调用BigDecimaltoString()方法来完成。

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

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

编辑

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

Interesting Posts