java - Informix JDBC、MONEY 和字符串文字中的小数点分隔符的问题

标签 java jdbc informix currency

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

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

我有异常:

Character to numeric conversion error

相同的 SQL 在使用 ODBC 驱动程序的 native Windows 应用程序中运行。 我住在波兰,有波兰语语言环境,在我的国家逗号分隔 数字的小数部分,所以我尝试了:

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

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

insert into _money_test (amt) values (123.45)

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

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

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

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 data type mapping documentation说如下:

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

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

您可以将String“转换”为BigDecimal,只需将其作为constructor 传递即可。争论。反过来可以通过调用 toString() 来完成。 BigDecimal 的方法。

关于java - Informix JDBC、MONEY 和字符串文字中的小数点分隔符的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2020608/

相关文章:

database - 在 Ubuntu 上安装 Informix

database - 调整 Informix 查询

java - 将缓冲图像移动到特定坐标

java - 使用java将数据从mysql数据库复制到其他mysql数据库

java - 如何创建一个像 Internet Download Manager 应用程序中使用的表一样的 JTable?

java - Findbugs错误 "Load of known null value"SQL连接

java - 使用 jdbc 从 mssql 存储过程获取结果

informix - Informix 4GL termcap 的功能代码列表

java - 无法比较类型错误 : Object and int in Telegram

java - 需要从java文件中写入的字符串中删除特殊字符