2012-08-29 33 views
0

以下情況: 我們的舊AS400 DB無法處理UTF8,因此我需要操作每個select/insert/update。我的第一個想法是:嘿,爲什麼不重寫AS400JDBCPreparedStatement & AS400JDBCResultSet其中我處理set-和getString。聽起來很簡單,但不起作用(由於構造函數的可見性,甚至無法擴展類)。在PreparedStatement和ResultSet中操縱setter和getter

有沒有人有一個想法如何創建一個簡單的方法來操縱resultset.getString(i)和preparedstatement.setString(1,字符串)方法,並讓他們運行我的方法manipulateStringBecauseThisDbIsSoOldAndUseless?

在此先感謝!

@edit: 實際的問題是,我們正在丟失像č這樣的字符的信息。我們的數據庫只能處理ISO-8859-1。

+0

你的代碼在哪裏? –

+0

我沒有任何有用的代碼。我只能提供字符串操作(或多或少只有一個替換) – CodingGentleman

+0

如果您嘗試在數據庫上使用現有的rs.getString(),您會發現會發生什麼情況嗎? –

回答

0

Connection connection = null; PreparedStatement preparedStatement = null; ResultSet generatedKeys = null;

try { 
connection = m_Connection; 
preparedStatement = (PreparedStatement) connection.prepareStatement(qString, Statement.RETURN_GENERATED_KEYS); 

// ... 

int affectedRows = preparedStatement.executeUpdate(); 
if (affectedRows == 0) { 
    throw new SQLException("Creating user failed, no rows affected."); 
} 

generatedKeys = preparedStatement.getGeneratedKeys(); 
int id = -1; 
if (generatedKeys.next()) { 
    id = generatedKeys.getInt(1); 
    id = -1; 
} else { 
    throw new SQLException("Creating user failed, no generated key obtained."); 
} 
} finally { 

} 
1

嘗試研究可能的JDBC驅動程序屬性,以配置字符集發送到服務器/從服務器接收數據。

JDBC Properties可以在代碼中設置集合,或者在Java EE容器(例如Websphere)中運行時附加到數據源配置。

我沒有AS400的經驗,但這list of driver properties可能會有所幫助。特別是它提到

package ccsid =指定的字符編碼要用於SQL 包並將其發送到服務器的任何語句。

選項爲: 「1200」(UCS-2), 「13488」(UTF-16)

參見What character conversion issues must my program deal with?

0

不知道多大的 'AS400' 還真是,但IBM i平臺已經支持UTF8很長時間了。 IBM方面的人員創建一個測試表。假設他們正在使用DDS(他們會知道是什麼意思),這裏是UTF8和UTF16:

A   CHARUTF8  10A   COLHDG('UTF8') 
A          CCSID(1208)  
A          ALWNULL   
A   CHARUTF16  10G   COLHDG('UTF16') 
A          CCSID(1200)  
A          ALWNULL   

如果他們使用SQL DDL定義表格,讓他們嘗試VARGRAPHIC CCSID 1208 UTF8和VARGRAPHIC CCSID 1200用於UTF-16。