2010-01-07 104 views
2

我有使用MONEY數據類型的JDBC應用程序的問題。 當我插入MONEY列:Informix 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只是點:

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') 

結果,當我跑錢字面點和逗號:

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] 
+0

你可以發佈你正在使用的確切的Java代碼來做你的插入嗎? – 2010-01-07 14:07:22

+0

我剛剛添加了使用ODBC和JDBC驅動程序的Jython代碼。 – 2010-01-11 07:54:49

回答

0

我通過使用PreparedStatement解決了這個問題。我認爲「字符數字轉換錯誤」是Informix JDBC驅動程序中的一個錯誤。

在我經常使用的其他數據庫PostgreSQL中,如果通過本地JDBC驅動程序或通過JDBC-ODBC橋運行查詢,則沒有區別。我發現PostgreSQL不接受數字形式123.45。 PostgreSQL接受帶點的字符串文字,但是這個點被當作千位分隔符處理。唯一正確接受的值是逗號分隔小數部分的字符串字面值。

編輯

它可以通過在服務器端設置DBMONEY=.得到解決,那麼所有的連接(ODBC,JDBC)將與設置工作。

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參數傳遞即可。另一種方法可以通過調用toString()方法BigDecimal完成。

+0

如果我知道什麼類型的列,那麼我應該使用'123.45'(作爲數字,而不是字符串)。但是從csv導入數據的ODBC版本構建「通用」插入查詢,並且將所有參數作爲字符串進行安全處理是安全的。看來,現在是重新組織該代碼並使用PreparedStatement的時候了。 – 2010-01-11 08:01:11