为什么长度为1000的字符串长度变成了200?(100分)

  • 主题发起人 主题发起人 hdzj2000
  • 开始时间 开始时间
H

hdzj2000

Unregistered / Unconfirmed
GUEST, unregistred user!
[:(!]我用下列代码将一个长度为1000的字符串存入Oracle数据库中的一个VARCHAR2(1000)
的字段,可是在数据库中查看后发现只存入了前200个字符,其余800个字符不知去向,麻烦
高手给分析一下原因,并给个正确处理方法。
with ClientDataSet1do
begin
Append;
FieldValues['ID'] := newID;
FieldValues['NAME'] := newName;
FieldValues['Hit'] := defaultHit;//defalutHit为长度为1000的字符串,Hit字段的类型为varchar2(1000)
Post;
ApplyUpdates(0);
end;
说明:数据库为Oracle 8.1.7,连接方式为DCOM+ADO.
ADO驱动是Oracle公司的,版本为8.1.7.2.0
 
你干嘛不 FieldByName('Hit').AsString := defaultHit 呢
 
to Pipi:
我用过你的方法但是问题依旧。
 
ShowMessage(IntToStr(Length(defaultHit)))确实看到是1000?
 
ShowMessage(IntToStr(Length(defaultHit)))确实看到是1000.
等Post以后,将该字段长度取出后发现是200.
 
后面800个字符全是空格?
 
如果后面800个字符全是空格,那么varchar2本来是可以保存这些空格的(除非你用char就不行了)
但是问题可能不是出在oracle,而是client和appserver之间的问题(MIDAS的问题),从客户端
到appserver可能就不见了后面800个空格
 
超过255的字符串是用流的方式吧?
TBlobStream(FieldByName('Hit')).SaveToStream(StrStream);
ShowMessage(StrStream.Text);
这样试试
 
To Pipi:
1000个字符的初始值为'00000.....0'其中没有空格.
To copy_paste:
'Hit'字段在ClientDataSet中定义为TWideStringField,不可能用流方式去处理.
 
为什么没人回答我的问题了呢?
 
因为谁也没碰过
 
这是我Oracle库中的一个字段定义:
TextPropertyCode VARCHAR2(4000) null,
4000就是2000汉字的容量吧,
用三层的(SocketConnection的)一次存储文本超过1200汉字,没有出现问题啊!
并且我的Oracle环境在RedHat 7.1下啊!
我的部分代码:
with DMForm.ClientDataSet_TEXTdo
begin
Close;
CommandText:='insert into TAB_TEXT(TextPropertyCode) values (:Text_X)';

Params.ParamByName('Text_X').AsString:=Memo_Text.Text;
//赋值
try
Execute;
//执行
except
Application.MessageBox('系统出现数据库更新错误!请与系统管理员联系!','错误',MB_OK+MB_ICONERROR);
exit;
end;
end;

供你参考~
 
多人接受答案了。
 
后退
顶部