操纵二传手PreparedStatement和ResultSet中的getter

时间:2012-08-29 06:22:42

标签: java prepared-statement ibm-midrange resultset

以下情况: 我们的旧AS400 DB无法处理UTF8,因此我需要操作每个选择/插入/更新。我的第一个想法是:嘿,为什么不覆盖AS400JDBCPreparedStatement& AS400JDBCResultSet,我在其中处理set-和getString。听起来很简单,但不起作用(由于构造函数的可见性,甚至无法扩展类)。

有没有人知道如何创建一个简单的方法来操作resultset.getString(i)和preparedstatement.setString(1,string)方法并让它们运行我的方法manipulateStringBecauseThisDbIsSoOldAndUseless?

提前致谢!

@edit: 实际问题是,我们正在丢失像č这样的人物信息。我们的DB只能处理ISO-8859-1。

3 个答案:

答案 0 :(得分:1)

尝试研究可能的JDBC驱动程序属性,以配置字符集向/从服务器发送/接收。

JDBC Properties可以在代码中设置set,如果在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?

答案 1 :(得分:0)

连接连接= 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 {

}

答案 2 :(得分: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用于UTF-8和VARGRAPHIC CCSID 1200用于UTF-16。