2012-08-29 32 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。