免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3936 | 回复: 7
打印 上一主题 下一主题

AS400JDBCConnection如何在运行时改变CCSID [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-13 10:16 |只看该作者 |倒序浏览
目前我的系统中,所有柜员的CCSID为65535,系统CCSID为37,现在需要JDBC连接AS400,获取一些表的信息,这时如果字段的text属性为中文,则用JDBC取出的字段名称虽然正确,但是注解(remarks)为乱码。
尝试将usrprf中的CCSID改为935,则一切正常,我不希望因为一个外部工具去修改用户设置,有没有办法在JDBC运行时,修改连接信息,修改CCSID?

——用的是JT400
另外,表的数据内容,不论原来的码是什么,用JDBC的getBytes获取后,都是可以用JT400的CharConverter转码的,这里最大的问题是表字段自身的remark,只能通过连接的元数据来获取,这个地方不支持getBytes,用getString获取的数据已经是AS400JDBCConnection依赖连接当前的CCSID做过转码的了,这时是乱码。

有没有好的解决方法?

论坛徽章:
0
2 [报告]
发表于 2013-03-19 20:23 |只看该作者
参见我发的帖子,有解决方法的,我找下去!

论坛徽章:
0
3 [报告]
发表于 2013-03-19 20:26 |只看该作者
SQL方式查询表有这种乱码问题如无法修改表的的情况下,可通过反射机制修改指定字段的ccsid值来实现。
SQL查询后获取到的result对象。
通过JAVA反射机制,强制修改对象的指定私有属性的值,具体的怎么改忘了,回头找给你。

论坛徽章:
0
4 [报告]
发表于 2013-03-20 10:37 |只看该作者
回复 3# xml1988
大致的思路是什么?

我的目标是做一个各个数据库平台都通用的数据库工具,所以我自己包装了一个ResultSet接口,当发现当前的数据库是As400 DB2的时候,调用的getString方法会先调用getBytes取回目标字段的内容,然后再用CharConvert转成对应客户端当前的字符集。

但是对于metadata来说,好像它不支持getBytes,报了个什么错来着,我记不得了。只好在这里用的是原始的getString。

所以就出现了表的内容,中文都转换过来了,但是表的标题、字段的标题都是乱码。

   

论坛徽章:
0
5 [报告]
发表于 2013-03-20 18:59 |只看该作者
如果你把JT400.jar包反编译出来再DEBUG跟踪就会知道问题的原因在那里。
今天忙了点忘了发代码,明天发上来。

论坛徽章:
0
6 [报告]
发表于 2013-03-21 09:49 |只看该作者
/**
         * 获取系统表对象列表。
         * @param stmt
         * @param sql
         * @return
         * @throws SQLException
         */
        public static List<SysTable> getSysTable(Statement stmt, String sql) throws SQLException {
                // TODO Auto-generated method stub
                AS400JDBCStatement asStmt = (AS400JDBCStatement)stmt;
                AS400JDBCResultSet rs = (AS400JDBCResultSet)asStmt.executeQuery(sql);
                try {
                        //获取AS400JDBCResultSet对象的私有成员row_对应的java.lang.reflect.Field对象
                        Field f = rs.getClass().getDeclaredField("row_");
                        //设置属性是否可以访问,如果你调用get和set方法,那么有可能会引发访问权限的错误,这个时候你可以调用setAccessible方法使得该属性可以访问
                        f.setAccessible(true);
                        //获取AS400JDBCResultSet对象的私有成员row_
                        Object o =f.get(rs);
                        //获取私有成员row_的私有成员ccsids_对应java.lang.reflect.Field对象
                        Field f2 = o.getClass().getDeclaredField("ccsids_");
                        f2.setAccessible(true);
                        //获取ccsids_私有成员
                        Object o2 =f2.get(o);
                        //由反编译或DEBUG可知ccsids_成员为int数组,所以强制转换。
                        int[] ccsid = (int[])o2;
                        //表的第六个字段的CCSID值不正确,因此强制修改为中文CCSID值
                        ccsid[5]=935;
                        //修改好的成员写回对应的对象。
                        f2.set(o, ccsid);
                        f.set(rs, o);
                        //关闭成员可访问性
                        f2.setAccessible(false);
                        f.setAccessible(false);
                       
                } catch (SecurityException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (NoSuchFieldException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
               
                // 查询到结果
                if (rs!= null && rs.next()) {
                        List<SysTable> list = new ArrayList<SysTable>();
                        do{
                                SysTable sysTable = new SysTable();
                                sysTable.setName(StringUtil.rightTrim(rs.getString("TABLE_NAME")));      
                                sysTable.setCreator(StringUtil.rightTrim(rs.getString("TABLE_OWNER")));
                                sysTable.setType(StringUtil.rightTrim(rs.getString("TABLE_TYPE")));
                                sysTable.setColcount(rs.getInt("COLUMN_COUNT")) ;
                                sysTable.setReclength(rs.getInt("ROW_LENGTH"));
                                sysTable.setLabel(StringUtil.rightTrim(rs.getString("TABLE_TEXT")));
                                sysTable.setRemarks(StringUtil.rightTrim(rs.getString("LONG_COMMENT")==null?"":rs.getString("LONG_COMMENT")))  ;
                                sysTable.setDbname(StringUtil.rightTrim(rs.getString("TABLE_SCHEMA")))   ;
                                sysTable.setAlteredts(StringUtil.rightTrim(rs.getString("LAST_ALTERED_TIMESTAMP")));
                                sysTable.setSysTname(StringUtil.rightTrim(rs.getString("SYSTEM_TABLE_NAME"))) ;
                                sysTable.setSysDname(StringUtil.rightTrim(rs.getString("SYSTEM_TABLE_SCHEMA"))) ;
                                sysTable.setFiletype(StringUtil.rightTrim(rs.getString("FILE_TYPE"))) ;
                                sysTable.setTbdbname(StringUtil.rightTrim(rs.getString("BASE_TABLE_SCHEMA")==null?"":rs.getString("BASE_TABLE_SCHEMA"))) ;
                                sysTable.setTbname(StringUtil.rightTrim(rs.getString("BASE_TABLE_NAME")==null?"":rs.getString("BASE_TABLE_NAME")))   ;
                                sysTable.setTbmember(StringUtil.rightTrim(rs.getString("BASE_TABLE_MEMBER")==null?"":rs.getString("BASE_TABLE_MEMBER"))) ;
                                sysTable.setSystable(StringUtil.rightTrim(rs.getString("SYSTEM_TABLE"))) ;
                                sysTable.setSelectomit(StringUtil.rightTrim(rs.getString("SELECT_OMIT")));
                                sysTable.setInsertable(StringUtil.rightTrim(rs.getString("IS_INSERTABLE_INTO")));
                                sysTable.setIaspnumber(rs.getShort("IASP_NUMBER"));
                                sysTable.setEnabled(StringUtil.rightTrim(rs.getString("ENABLED")==null?"":rs.getString("ENABLED")))   ;
                                sysTable.setMaintain(StringUtil.rightTrim(rs.getString("MAINTENANCE")==null?"":rs.getString("MAINTENANCE")))  ;
                                sysTable.setRefresh(StringUtil.rightTrim(rs.getString("REFRESH")==null?"":rs.getString("REFRESH")))   ;
                                sysTable.setRefreshdts(rs.getString("REFRESH_TIME"));
                                sysTable.setMqtdef(rs.getClob("MQT_DEFINITION"))    ;
                                sysTable.setIsolation(StringUtil.rightTrim(rs.getString("ISOLATION")==null?"":rs.getString("ISOLATION"))) ;
                                sysTable.setPartTable(StringUtil.rightTrim(rs.getString("PARTITION_TABLE"))) ;
                                list.add(sysTable);
                        }while(rs.next());
                       
                        return list;
                }

                return null;
        }

论坛徽章:
0
7 [报告]
发表于 2013-03-21 10:19 |只看该作者
是跟我的做法不同。
我看看是否对元数据有效。


论坛徽章:
0
8 [报告]
发表于 2013-03-21 19:24 |只看该作者
如果你能弄明白JT400.jar包中的那核心编码转换程序和几十个编码文件,可以自己写个转码程序将代码反转码回去再转码为自己需要的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP