MTS三层中如何传递blob字段内容?(100分)

  • 主题发起人 主题发起人 trackboy
  • 开始时间 开始时间
T

trackboy

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi+MTS+sybase:win200 数据库有一blob字段存放word文档内容,想法是在中间层(MTS/com)写一个通
用的blob字段存储函数,但是MTS传输的都是olevariant,想用Tblobfield(app_data_query.fieldbyname('data')).LoadFromStream(word_data));
word_data为客户端穿过来得参数,包错"incompatible types:'Tstream' and 'oleVariant'"
如何解决?
 
兄弟,你不会用以个公用底内存表呀,然后As_getrecord得到他的数据给一个Clientdataset
然后再从他的字段中读取blob类型,呵呵,我就是这样传报表底,还经过压缩底,然后在
客户端解压缩底,有问题再说撒
 
to jjzhou_2001:
对你的方法,我还是不太了解,你的意思是不是用一个公用表取得blob字段内容,在客户端用
clientdataset去进行存储,如果是这样的话,是不是想大家说得没有真正的划分为三层,即客户端
不会去操作数据库,我得理解是客户端只负责读取word内容,传到中间层,由中间层去存储,不知道
这样理解对不对,请各位来评判!!
 
老何,可能他是说在中间层取到再传给clientdataset。但是不太明白,能不能详细一点。公用底内存表如何用啊?(now@长沙)
 
你的word_data是什么类型?
 
to cloudshao:
哈哈哈哈!!!!!!(笑死了~~~~~~~~)
怎么会在这里碰到你,下我一条,怎么不上qq,聊聊嘛,好多问题问你!!
 
啊,今天才开始培训,qq还没装,不知端口能不能用,jjzhou_2001可能是想通过tclientdataset
数据库控件来传blob的东西,这种思路好象不错,研究一下tclientdataset看看,As_getrecord
方法取到数据,然后想办法传过去,在客户端再取。
 
to j_shen2000:
word_data是Tstream,
to all:
我觉得关键是找到一合适方法,既可将客户端对数据库操作分开,
又方便客户端与中间层的传输,方便中间层存取数据.
 
to cloudshao:
你的意思是不是,在中间层用clientdataset的as_getrecord取的blob字段内容,再想办法
传会客户端.
另外,我现在用的是BDE连数据库,因为不知道用ADO怎么连sybase,你是如何解决的
 
1、为什么不用clientdataset本身的SAVETOSTREAM和LOADFROMSTREAM呢?
这种方式肯定可行。
2、如果你非要用自己的方式,也并非不可行,关键在于OLEVARIANT和STREAM之间的
数据转换,以下是两个有效的转换函数:
function MemoryStreamToOleVariant(Strm: TMemoryStream): OleVariant;
var
Data: PByteArray;
begin
Result := VarArrayCreate([0, Strm.Size - 1], varByte);
Data := VarArrayLock(Result);
try
Strm.Position := 0;
Strm.ReadBuffer(Data^, Strm.Size);
finally
VarArrayUnlock(Result);
end;
end;

function OleVariantToMemoryStream(OV: OleVariant): TMemoryStream;
var
Data: PByteArray;
Size: integer;
begin
Result := TMemoryStream.Create;
try
Size := VarArrayHighBound (OV, 1) - VarArrayLowBound(OV, 1) + 1;
Data := VarArrayLock(OV);
try
Result.Position := 0;
Result.WriteBuffer(Data^, Size);
finally
VarArrayUnlock(OV);
end;
except
Result.Free;
Result := nil;
end;
end;
 
to j_shen2000:
太好了,感谢提供的转换函数~~~~
对于你说的用loadfromstream,savetostream,能否详细说明客户端,中间层处理的过程.
我的目的是客户端读取一个文件,存到blob字段,想法是在客户端将文件读成stream,但是
怎么传到中间层是个问题,或许有更好的办法,不用转换成variant,怎么做呢??有点贪心,嘿嘿
 
这两个转换函数是当初我用TSOCKETCONNECTION写一个文件上传下载模块时用的。
所谓clientdataset的loadfromstream和savetostream,其实很简单。例如:
clientdataset1.fieldbyname('name').asstring:='1';
clientdataset1.fieldbyname('id').asinteger:=1;
(clientdataset1.fieldbyname('blob1') as tblobfield).loadfromstream(stream1);
(clientdataset1.fieldbyname('blob1') as tblobfield).savetostream(stream1);
其实,在客户端无论是asstring,asinteger还是loadfromstream等等在从客户端发送给
中间层之前,都是作过数据转换的,只不过这种转换是由三层结构的默认机制自动实现的,
对于客户来说是透明的,因此你在使用clientdataset时,就如同本地操作一样。
不过,对于那些比较庞大的stream或者网络情况不好(比如广域网),第二种方法有很明显
的优势,比如你可以分块传输,可以压缩,可以模拟断点续传等等,第一种方法就是简单,
如果不用考虑网络状况的条件下,应该是首选。
 
接受答案了.
 
j_shen2000,发错分了,请到
http://www.delphibbs.com/delphibbs/dispq.asp?lid=844090
 
呵呵,天上掉下大饼了。
 
后退
顶部