是MSMQ的问题还是Delphi的问题??(200分)

  • 主题发起人 主题发起人 xfwing
  • 开始时间 开始时间
X

xfwing

Unregistered / Unconfirmed
GUEST, unregistred user!
我想利用Msmq发送blob型的数据(存的是jpg格式的照片,每张大约2k多)
可是却发现发送的数据变小了.
procedure TForm1.Button9Click(Sender: TObject);
var
vZp:variant;
strZp:string;
olevZp:olevariant;
begin
adoquery1.Close;
adoquery1.SQL.clear;
adoquery1.SQL.Add('select bh,zp from g_zp where bh=741');
adoquery1.Open;
//从oracle 的long raw 类型的字段中取出.jpg型的照片数据
strZp:=ADOQuery1.FieldByName('zp').asstring;
vZp:=ADOQuery1.FieldByName('zp').value;
olevZp:=ADOQuery1.FieldByName('zp').value;

//同一记录显示取出的照片数据的大小却不同//

//运行显示为2672字节,该字节为该照片的实际长度
showmessage('照片长度:'+inttostr(length(strZp)));
//运行显示为2672字节,该字节为该照片的实际长度
showmessage('照片长度:'+inttostr(length(strZp)));
//运行显示为2493字节,比实际长度少
showmessage('照片长度:'+inttostr(length(strZp)));

msmqqueueinfo1.PathName:='./MYqueue';
MSMQQueueInfo1.Label_:='Myqueue';
msmqqueue1.ConnectTo(msmqqueueinfo1.Open(2,0));
//将照片数据送如消息队列
MSMQMessage1.Label_:='l_zp';
MSMQMessage1.Body:=strzp;
//MSMQMessage对象的bodyLength既不是2672也不是2493,且比两者都大
showmessage(inttostr(Msmqmessage1.BodyLength));
//用length()函数得到2493
showmessage('body'+inttostr(length(msmqmessage1.body)));;
MSMQMessage1.Send(msmqqueue1.DefaultInterface);
msmqqueue1.Close;

end;
我将取得的数据写入文件后证实2672字节的可正确显示照片.
各位大侠看看是MSMQ的问题,(消息的大小有限制ms的文档好象说可为4M)
还是Delphi的olevariant类型有什么特殊用法.
(MSMQmessage.body为olevariant类型,即使将其他类型的值赋给它仍会转换
而产生错误),难道blob类型的数据无法利用MSMQ发送吗??
请各位多多指教.
 
图片干嘛要做到数据库里?那你数据不是变得很大吗?
 
我想一个mis系统应该把图片存在库里,请关注我的问题,谢谢.
 
数据库大了,容易出错又影响速度.
其实你可以在库中只保留文件路径和名称.
如:d:/mypic/0001.jpg,
然后在要显示的地方调出来显示.
如:loadfrom('d:/mypic/0001.jpg');
 
我也是把图片保存在数据库里,这样可以保证数据的一致性。另外,当存取大量图片时,
不会影响操作系统的性能。
 
在delphi中如何引入msmq
 
我的人事档案管理程序还需要上报和接收,所以必须放在数据库中了:(
还有,就是删除照片
我用fileldbyname('photo').value:=null;虽然可以实现,
但不知这种方法对吗?
 
那位老大讲讲msmq的配置及使用,另有200分相送
 
后退
顶部