我对使用 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/