天翎MyApps技术社区 - 低代码平台 | 流程管理系统 | BPM软件

 找回密码
 注册成为天翎用户
查看: 1509|回复: 4

长中文字符存储数据库中,自动被截取255长度问题

[复制链接]
zyzma 发表于 2011-12-12 10:54:03 | 显示全部楼层 |阅读模式
本帖最后由 shary 于 2011-12-12 15:22 编辑

问题描述:
var newdoc = new Packages.cn.myapps.core.dynaform.document.ejb.Document();
newdoc.addStringItem("考核标准",doc1.getItemValueAsString("考核标准"));
process.doCreate(newdoc);

如果newdoc对象StringItem属性设置长度超过255个中文字符。在存储数据库的时候会自动截取只留255个中文字符。
例如上面的代码。如果"考核标准"设置过长,超过255个中文字符。就回自动截取只剩下前255个中文字符。


问题原因:
我查到在源码中Item.java类中的getVarcharvalue() 对字符窜长度进行了截取。如下:
           /**
         * :
         * @return
         * @uml.property name="varcharvalue"
         */
        public String getVarcharvalue() {
                if (getType().equals(VALUE_TYPE_VARCHAR)) {
                        if (varcharvalue != null && varcharvalue.length() > 255) {
                                return varcharvalue.substring(0, 255);
                        } else {
                                return varcharvalue;
                        }
               
                                } else if (getType().equals(VALUE_TYPE_NUMBER)) {
                        Double num = getNumbervalue();
                        return num != null ? DECIMAL_FORMAT.format(num) : "";
                } else if (getType().equals(VALUE_TYPE_DATE)) {
                        Date dt = getDatevalue();
                        if (dt != null) {
                                return DATE_FORMAT.format(dt);
                        }
                } else if (getType().equals(VALUE_TYPE_TEXT)) {
                        return getTextvalue();
                }
                return null;
        }

解决方法提问:
1、平台getVarcharvalue() 方法为什么对字符窜长度进行了截取?
2、我这边的软件只连接sql或oracle。如果想把截取改长。最长能改为多少?
purple 发表于 2011-12-12 11:02:05 | 显示全部楼层
您好,关于此问题解决方案,请参考这个帖子:http://www.teemlink.com/bbs/view ... &extra=page%3D1
 楼主| zyzma 发表于 2011-12-12 11:30:08 | 显示全部楼层
我用的是多行文本控件。在sql里自动是ntext类型。长度肯定超过255了。
 楼主| zyzma 发表于 2011-12-12 11:35:04 | 显示全部楼层
看这段代码
if (varcharvalue != null && varcharvalue.length() > 255) {
                                return varcharvalue.substring(0, 255);
                        } else {
                                return varcharvalue;
                        }            
就是说调用getVarcharvalue() 方法。就会被截取。
改registerColumnType(Types.VARCHAR, "NVARCHAR(200)");也没有用啊?
 楼主| zyzma 发表于 2011-12-12 11:51:44 | 显示全部楼层
问题解决。和源码无关
var newdoc = new Packages.cn.myapps.core.dynaform.document.ejb.Document();
newdoc.addStringItem("考核标准",doc1.getItemValueAsString("考核标准"));
process.doCreate(newdoc);

应该用
var newdoc = new Packages.cn.myapps.core.dynaform.document.ejb.Document();
newdoc.addTextItem("考核标准",doc1.getItemValueAsString("考核标准"));
process.doCreate(newdoc);

是应用层面的问题。结贴。

本版积分规则

QQ|手机版|天翎MyApps技术社区 ( 粤ICP备11093750号 )

GMT+8, 2026-8-12 17:40

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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