请教高手。一个关于string的问题。(50分)

  • 主题发起人 主题发起人 yuanzhucn
  • 开始时间 开始时间
Y

yuanzhucn

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做一个关于sybase的c/s结构的应用程序时碰到一个这样的问题:
在我的sybase数据库中有一个字段类行为image,我在程序中要取得这个字段,并把他的值存在一个文件中,我是这样做的:
......
query1.sql.add('select PLD from ......');// 这里是我的加的sql,PLD为那个类型为image NULL的字段,目的是要取得我想要得PLD字段;
query1.prepare;
query1.open;
str:=query1.fields.fields[0].asstring;//我要把取得值父给我定义的一个string变量str中。
......
之后,我又通过文件读取操作把str的值存到一个文件中,但是,我发现我得到的文件的内容少了很多。

我想,是不是string类型的大小是有限制的,在我的sybase库中,我的那个类型为image的字段存储的是一幅图,图的格式是有一些点和线组成,存成文件其实就是一个文本文件,里面的存的字符串是点的坐标。
现在不知道要怎么做,请高手指教。
 
用widestring试试
 
用Stream, TBlobStream
 
TBlobStream怎么用?
能详细一点吗?
 
不完整, 仅供参考...
procedure TMessageQueue.Get(aData: TStream; var aHeader: TMessageHeader; AutoCommit: Boolean=True);
var
DeathTime : TDateTime;
begin
Assert(Assigned(aData));

FDatabase.StartTransaction;

try
//根据检索条件检索数据
with qrySelectByDestination, aHeader do
begin
Close;
Params[0].AsString := FPattern; //Destination
Open;
if IsEmpty then raise EQueueEmpty.Create('Queue is Empty');

No := Fields[0].AsInteger; //No
Source := Fields[1].AsString; //Source
Destination := Fields[2].AsString; //Destination
Priority := Fields[3].AsInteger; //Priority
DeathTime := Fields[4].AsDateTime; //DeathTime
TimeToLive := Trunc((DeathTime-Now)*24*3600);

aData.Seek(0, soFromBeginning);
TBlobField(Fields[5]).SaveToStream(aData); //DataField
Close;
end;

if AutoCommit then
begin
//自动提交, 删除已经读取的记录
with qryDeleteByNo do
begin
Params[0].AsInteger := aHeader.No; //No
ExecSQL;
end;
end
else
begin
//非自动提交, 将记录状态更新为读未提交
with qryUpdateByNo do
begin
Params[0].AsString := ReadNotCommit; //State
Params[1].AsInteger := FSession; //Session
Params[2].AsInteger := aHeader.No; //No
ExecSQL;
end;
end;

FDatabase.Commit;
except
on E: Exception do
begin
if not (E is EQueueEmpty) then TLogFile.WriteLn('读取数据失败. 错误信息=%s ', [E.Message]);
FDatabase.Rollback;
raise;
end;
end;
end;

procedure TMessageQueue.Put(aData: TStream; aHeader: TMessageHeader; AutoCommit: Boolean=True);
var
States : Char;
Session: Cardinal;
begin
Assert(Assigned(aData));

FDatabase.StartTransaction;

try
if AutoCommit then
begin
//自动提价, 记录状态为已提交
States := Commited;
Session := 0;
end
else
begin
//非自动提交, 记录状态为写未提交
States := WriteNotCommit;
Session := FSession;
end;

qrySelectMaxNo.Open;
aHeader.No := qrySelectMaxNo.Fields[0].AsInteger;
Inc(aHeader.No);
qrySelectMaxNo.Close;

//将数据插入磁盘队列
with qryInsert, aHeader do
begin
Params[0].AsInteger := No;
Params[1].AsInteger := Session; //Session
Params[2].AsString := Source; //Source
Params[3].AsString := Destination; //Destination
Params[4].AsSmallInt:= Priority; //Priority
Params[5].AsDateTime:= IncSecond(Now, TimeToLive);//DeathTime
Params[6].AsString := States; //State

aData.Seek(0, soFrombeginning);
Params[7].LoadFromStream(aData, ftBlob); //DataField

ExecSQL;
end;
FDatabase.Commit;
except
on E: Exception do
begin
TLogFile.WriteLn('写数据失败. 错误信息=%s ', [E.Message]);
FDatabase.Rollback;
raise;
end;
end;
end;
 
据我最新试验,不是string的问题,应该是 field的大小问题,但是我不知道要怎么做.
 
问题已经解决了,原来不是我程序的问题,是bde设置的问题.哈哈,分给谁呢?
平分了吧.
 
多人接受答案了。
 
后退
顶部