起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 424|回复: 20

[结]新的问题急急,汉字被截断。**

[复制链接]
发表于 2008-2-15 21:29:13 | 显示全部楼层 |阅读模式
我这边的2401版本,用了存储过程,我有一部分文字通过存储过程生成编号写到数据库,竟然汉字被截断,没有了,只有数字的,是否你们平台对linux不支持呢,websphere+linux(X64、i386)的数据库oracle 10G的环境。请问是怎么回事,用你们的平台接二连三出现这么多怪问题,一个没有解决又出来一个新问题。怎么搞啊
回复

使用道具 举报

发表于 2008-2-18 08:41:05 | 显示全部楼层
有关存储过程,请参考 http://bbs.justep.com/forum.php?mod=viewthread&tid=21206
如果还有问题,请提供楼主的存储过程和平台上的调用方法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-18 16:27:00 | 显示全部楼层
通过测试,是如果oracle返回的汉字都会被截断取不到汉字,经查资料是因为linux的汉字编码是unicode,数据库是gbk,X3平台使用的是什么汉字编码,请测试linux下调用oracle存储过程的汉字返回问题吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-18 17:19:31 | 显示全部楼层
顶一下
回复 支持 反对

使用道具 举报

发表于 2008-2-18 17:55:00 | 显示全部楼层
楼主给一个你测试的例子,我们找环境重现一下
回复 支持 反对

使用道具 举报

发表于 2008-2-18 18:05:35 | 显示全部楼层
平台使用的是unicode编码。可能是数据库编码和linux编码不一致导致的。提供一下您的存储过程。做一个简化版本就可以。我们想一下解决方案。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-18 18:09:04 | 显示全部楼层
oracle存储过程是
create or replace procedure getidserial(i_type varchar2,i_prefix varchar2,i_len int,o_serial out varchar2) is
      idno number;
      i int;
      fs varchar2(120);
      fno varchar2(120);
    begin
       fs := '';
       FOR I IN 1..i_len LOOP
         fs := fs||'0';
       end loop;

       select count(*) into i from t_sys_autoid where id_type=i_type and id_prefix=i_prefix;

       if i=0 then
          insert into t_sys_autoid (id_type,id_prefix,id_value,AccessTime) values (i_type,i_prefix,2,sysdate);
          select i_prefix||ltrim(to_char(1,fs)) into fno from dual;
          commit;
       else
          --select加锁
          select id_value,i_prefix||ltrim(to_char(id_value,fs)) into  idno,fno
            from t_sys_autoid  where id_type=i_type and id_prefix=i_prefix for update;
          --号表更新
          update t_sys_autoid set id_value = id_value + 1,AccessTime=sysdate where id_type=i_type and id_prefix=i_prefix;
          commit;
       end if;

       --返回号
       o_serial :=fno;
     end;

程序调用的写法是:
    with TStoredProc.Create(nil) do
    try
      ConnectionString := connstr;
      StoredProcName := 'GETIDSERIAL';
      Params.Clear;
      Params.CreateParam(TFieldType.ftString, 'i_type', TParamType.ptInput);
      Params.CreateParam(TFieldType.ftString, 'i_prefix', TParamType.ptInput);
      Params.CreateParam(TFieldType.ftInteger, 'i_len', TParamType.ptInput);
      Params.CreateParam(TFieldType.ftString, 'o_serial', TParamType.ptOutput);
      Params.ParamByName('i_type').AsString := AIDType;
      Params.ParamByName('i_prefix').AsString := lStr1+lStr2;
      Params.ParamByName('i_len').AsInteger := lLen;
      Execute;
      //修改linux下文号无法显示的bug   by linhai 080215
      //Result := Params.ParamByName('o_serial').AsString + lEndStr;
      lStr2 := lStr1 + lStr2 + Params.ParamByName('o_serial').AsString + lEndStr;
      Result := lStr2;
    finally
      Free;
    end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-18 21:12:07 | 显示全部楼层
//Result := Params.ParamByName('o_serial').AsString + lEndStr;
      lStr2 := lStr1 + lStr2 + Params.ParamByName('o_serial').AsString + lEndStr;
      Result := lStr2;
这个错误,更正一下出问题的原来调用,后面两句没有
Result := Params.ParamByName('o_serial').AsString + lEndStr;
这样就会江存储过程返回值是汉字的截断,就没有汉字,有时候就变成??或者其他字符
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-18 21:12:59 | 显示全部楼层
周二,也就是08年2月19号,我和你们联系下,QQ上面处理。
回复 支持 反对

使用道具 举报

发表于 2008-2-21 11:49:46 | 显示全部楼层
Oracle 数据库安装在windows Server上
X3服务端安装在RedHat Linux 4企业版
执行用汉字没有出现楼主的错误
我的存储过程是
CREATE OR REPLACE PROCEDURE "TEST_PROC" (inprm in varchar2,
inprm1 in varchar2,
inprm2 in varchar2) is
begin
  INSERT INTO TSYSINFO
  (FINFOID, FINFOSCOPE , FCLIENTACCOUNT , FINFOVALUE )
  VALUES
  (inprm , inprm1, inprm2, inprm2 || inprm1 );
end TEST_PROC;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-7 14:15 , Processed in 0.041993 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表