首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

tclientdataset传输数据时出现mismatch in datapacket有关问题

2012-03-07 
tclientdataset传输数据时出现mismatch in datapacket问题要把数据库中的图像字段显示到image1中,执行cds1

tclientdataset传输数据时出现mismatch in datapacket问题
要把数据库中的图像字段显示到image1中,执行cds1.Data:=cds1.DataRequest(VarArrayOf(['TN_TechPhoto','TechPhoto','00386']));的时候报错,我到事件内跟踪了,执行都正确,返回的olevariant我保存到文件也没问题,就是当DataSetProvider1DataRequest这个事件结束就会出现标题所示错误。
下附完整源码,数据库字段是image类型,经测试取字段数据没问题。

Delphi(Pascal) code
unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ADODB, Provider, DB, DBClient, ExtCtrls, StdCtrls, jpeg;type  TByteArray  = array of byte;    TForm1 = class(TForm)    Button1: TButton;    Image1: TImage;    cds1: TClientDataSet;    DataSetProvider1: TDataSetProvider;    ADOQuery1: TADOQuery;    procedure Button1Click(Sender: TObject);    function DataSetProvider1DataRequest(Sender: TObject; Input: OLEVariant):        OLEVariant;  private    procedure LoadPicFromDB(fn:string;jpgimg:TImage);    procedure OleVariantToStream(var Input: OleVariant; Stream: TStream);    function StreamToOleVariant(Stream: TStream; Count: Integer): OleVariant;    { Private declarations }  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin  cds1.Open;  cds1.Data:=cds1.DataRequest(VarArrayOf(['TN_TechPhoto','TechPhoto','00386']));//  ShowMessage('cao');  if not VarIsNull(cds1.Data) then    LoadPicFromDB('TechPhoto',Image1)  else    Image1.Picture.Graphic:=nil;end;function TForm1.DataSetProvider1DataRequest(Sender: TObject; Input:    OLEVariant): OLEVariant;var  Ms:TMemoryStream;  procedure savetofile(pbuf:OleVariant);  var    p: Pointer;    fs:TFileStream;    nSize:Integer;  begin    nSize := VarArrayHighBound(pBuf, 1) - VarArrayLowBound(pBuf, 1) + 1;    fs := TFileStream.Create('d:\abc', fmCreate or fmOpenWrite);    try      p := VarArrayLock(pBuf);      try      fs.Seek(0, soFromBeginning);      fs.WriteBuffer(p^, nSize);      finally        VarArrayUnLock(pBuf);      end;    finally      fs.Free;    end;  end;begin  ms:=TMemoryStream.Create;  with ADOQuery1 do  begin    Close;    sql.Clear;    sql.Add('select '+Input[1]+' as tu from '+input[0]+' where FactoryStyle='+QuotedStr(input[2]));    open;    if recordcount=1 then    begin      TBlobField(FieldByName('tu')).SaveToStream(ms);      Result:=StreamToOleVariant(ms,ms.Size);    end    else      Result:=NULL;       end;  ms.free;  savetofile(Result);end;procedure TForm1.LoadPicFromDB(fn: string; jpgimg: TImage);var  Ms:TMemoryStream;  jpg:Tjpegimage;  o:OleVariant;begin  Ms:=TMemoryStream.Create;  jpg:=TJPEGImage.Create;  o:=cds1.Data;  OleVariantToStream(o,Ms);  Ms.Position :=0;  Jpg.LoadFromStream(Ms);  jpgimg.Picture.Assign(Jpg);  Ms.Free;  jpg.free;end;procedure TForm1.OleVariantToStream(var Input: OleVariant;  Stream: TStream);var  pBuf: Pointer;begin  pBuf := VarArrayLock(Input);  Stream.Write(TByteArray(pBuf^), Length(TByteArray(Input)));  VarArrayUnlock(Input);end;function TForm1.StreamToOleVariant(Stream: TStream;  Count: Integer): OleVariant;var  pBuf: Pointer;begin  Result:=VarArrayCreate([0,Count-1],varByte);  pBuf:=VarArrayLock(Result);  Stream.Position:=0;  Stream.Read(TByteArray(pBuf^),Length(TByteArray(Result)));  VarArrayUnlock(Result);end;end.


[解决办法]
Delphi(Pascal) code
var  o:olevariant;begin  ......  o:=cds1.DataRequest(VarArrayOf(['TN_TechPhoto','TechPhoto','00386']));  ......end; 

热点排行