X
XiaoLiang
Unregistered / Unconfirmed
GUEST, unregistred user!
Server 端放置 TDataBase,TQuery,TDataSetProvider
其中 TDataSetProvider 的 poAllowCommandText 为真
Client 端放置 SocketConnection,ClientDataSet1
其中 ClientDataSet1 的 FetchOnDemond = True,PacketRecord = -1
环境: Delphi 5+Servic Pack 1,Win 98 Oracle 8.1.6,bmp文件都很小 3K左右
程序如下:
存Bmp 文件
procedure Insert_Blob;
var
MyBlobStream :TMemoryStream;
begin
MyBlobStream := TMemoryStream.Create;
MyBlobStream.LoadFromFile('c:/aa.bmp');
MyBlobStream.Seek(0,soFrombegin
ning);
ClientDataSet1.Close;
ClientDataSet1.Params.Clear;
ClientDataSet1.CommandText := 'insert into my_bmp values(1,:bmp)';
ClientDataSet1.Params.CreateParam(ftBlob,'bmp',ptInput);
ClientDataSet1.Params.ParamByName('bmp').LoadFromStream(
MyBlobStream,ftBlob);
ClientDataSet1.Execute;
ClientDataSet1.CommandText := 'Commit';
ClientDataSet1.Params.Clear;
ClientDataSet1.Execute;
MyBlobStream.Free;
end;
取 bmp 数据 Image1 为 TImage
procedure Get_Blob;
var
aStream :TMemoryStream;
begin
aStream := TMemoryStream.Create;
ClientDataSet1.Close;
ClientDataSet1.CommandText := 'select id,bmp from sms_bmp where id=1';
ClienttDataSet1.Open;
ClientDataSet1.FetchBlobs;
TBlobField(ClientDataSet1.FieldByName('bmp')).SaveToStream(aStream);
aStream.SaveToFile('c:/bb.bmp');
aStream.Position := 0;
Image1.Picture.Bitmap.LoadFromStream(aStream);
aStream.Free;
end;
奇怪的问题:
在 Insert_Blob 中,我用 两层(TQuery 代替 TClientDataSet)能正确的存入数据,
用两层或三层的 Get_Blob 都能正确读出并显示。但我用 三层(即上面的语句)也能写入
数据库中,且读出时运行到 aStream.SAveToFile('c:/bb.bmp') 也能正确的写到
bb.bmp 中,用 画笔 能够打开并显示,但运行到 BitMap.LoadFromStream 时,
出 Stream Read Error .
比较 aa.bmp(源)与bb.bmp(从数据库中取出并存入),发现bb.bmp比aa.bmp
少了不少字节,且内容明显不同。
各位大侠能否帮我解释一下? (从画笔来看,aa.bmp 与 bb.bmp 简直一模一样).
另外还发现一个奇怪的事,那就是无论我把 DataSetProvider 的 poFetchBlobsOnDemand
如何设,ClientDataSet 的 FetchOnDemond,PacketRecord 如何设,且不用 FetchBlobs
我都能取到 blob 数据(好象跟书上讲得不太一样哟)。
在三层中到底该如何存取 blob 数据 ?
其中 TDataSetProvider 的 poAllowCommandText 为真
Client 端放置 SocketConnection,ClientDataSet1
其中 ClientDataSet1 的 FetchOnDemond = True,PacketRecord = -1
环境: Delphi 5+Servic Pack 1,Win 98 Oracle 8.1.6,bmp文件都很小 3K左右
程序如下:
存Bmp 文件
procedure Insert_Blob;
var
MyBlobStream :TMemoryStream;
begin
MyBlobStream := TMemoryStream.Create;
MyBlobStream.LoadFromFile('c:/aa.bmp');
MyBlobStream.Seek(0,soFrombegin
ning);
ClientDataSet1.Close;
ClientDataSet1.Params.Clear;
ClientDataSet1.CommandText := 'insert into my_bmp values(1,:bmp)';
ClientDataSet1.Params.CreateParam(ftBlob,'bmp',ptInput);
ClientDataSet1.Params.ParamByName('bmp').LoadFromStream(
MyBlobStream,ftBlob);
ClientDataSet1.Execute;
ClientDataSet1.CommandText := 'Commit';
ClientDataSet1.Params.Clear;
ClientDataSet1.Execute;
MyBlobStream.Free;
end;
取 bmp 数据 Image1 为 TImage
procedure Get_Blob;
var
aStream :TMemoryStream;
begin
aStream := TMemoryStream.Create;
ClientDataSet1.Close;
ClientDataSet1.CommandText := 'select id,bmp from sms_bmp where id=1';
ClienttDataSet1.Open;
ClientDataSet1.FetchBlobs;
TBlobField(ClientDataSet1.FieldByName('bmp')).SaveToStream(aStream);
aStream.SaveToFile('c:/bb.bmp');
aStream.Position := 0;
Image1.Picture.Bitmap.LoadFromStream(aStream);
aStream.Free;
end;
奇怪的问题:
在 Insert_Blob 中,我用 两层(TQuery 代替 TClientDataSet)能正确的存入数据,
用两层或三层的 Get_Blob 都能正确读出并显示。但我用 三层(即上面的语句)也能写入
数据库中,且读出时运行到 aStream.SAveToFile('c:/bb.bmp') 也能正确的写到
bb.bmp 中,用 画笔 能够打开并显示,但运行到 BitMap.LoadFromStream 时,
出 Stream Read Error .
比较 aa.bmp(源)与bb.bmp(从数据库中取出并存入),发现bb.bmp比aa.bmp
少了不少字节,且内容明显不同。
各位大侠能否帮我解释一下? (从画笔来看,aa.bmp 与 bb.bmp 简直一模一样).
另外还发现一个奇怪的事,那就是无论我把 DataSetProvider 的 poFetchBlobsOnDemand
如何设,ClientDataSet 的 FetchOnDemond,PacketRecord 如何设,且不用 FetchBlobs
我都能取到 blob 数据(好象跟书上讲得不太一样哟)。
在三层中到底该如何存取 blob 数据 ?