通常是这样的,多层结构应该差别不大吧
读出数据:
var
sm: TStream;
begin
with ADOQuery1 do
begin
sm := CreateBlobStream(FieldByName('sample'), bmRead);
end;
OleContainer1.LoadFromStream(sm);
sm.Free;
end;
写入数据:
var
sm: TStringStream;
begin
sm := TStringStream.Create('');
OleContainer1.CreateObjectFromFile('C:\sample.doc', true);
OleContainer1.SaveToStream(sm);
sm.Position := 0;
with ADOQuery1 do
begin
FieldByName('sample').AsString := sm.DataString;
ExecSQL;
end;
sm.Free;
end;
读出数据:
var
sm: TStream;
begin
with ADOQuery1 do
begin
sm := CreateBlobStream(FieldByName('sample'), bmRead);
end;
OleContainer1.LoadFromStream(sm);
sm.Free;
end;
写入数据:
var
sm: TStringStream;
begin
sm := TStringStream.Create('');
OleContainer1.CreateObjectFromFile('C:\sample.doc', true);
OleContainer1.SaveToStream(sm);
sm.Position := 0;
with ADOQuery1 do
begin
FieldByName('sample').AsString := sm.DataString;
ExecSQL;
end;
sm.Free;
end;
解决方案 »
- 浏览照片时遇到的错误提示jpeg error #42,应该怎么处理?
- 通过XML读取数据的问题
- 如何取得所有输入法且使函数以数组的形式返回?
- FastReport中的字段提示名如何改成中文
- 请问使用Delphi 7的dbExpress连接SQLServer2000,最后软件打包需要捎带上那些DLL和其他文件?
- 有什么好的治胃病的方法吗?
- 如何控制DBChart实现的柱图 不同Series显示的相同字段在同一组(一起显示)
- www.playicq.com怎么上不去了??
- 倒霉透顶,散分!
- 如何使用ADO实现类似于CDS的InternalCacle类型的字段?
- 公司为规范管理,决定将所有机器名全设定好后不允许更改。哪位知道有什么办法可以实现嘛?(Win98)
- 新手学DELPHI,看什么书好?
procedure TCtrlCDM.VariantToStream(const Data: OleVariant;
Stream: TStream);
var
p: Pointer;
begin
p := VarArrayLock(Data);
try
Stream.Write(p^, VarArrayHighBound(Data,1) + 1); //assuming low bound = 0
finally
VarArrayUnlock(Data);
end;
end;//客户端,将TStream转化为OleVariant
function StreamToVariant(Stream: TStream): OleVariant;
var
p: Pointer;
begin
Result := VarArrayCreate([0, Stream.Size - 1], varByte);
p := VarArrayLock(Result);
try
Stream.Position := 0; //start from beginning of stream
Stream.Read(p^, Stream.Size);
finally
VarArrayUnlock(Result);
end;
end;以图片来举例: 客户端
msflow:=TMemoryStream.Create;
mgflow.Picture.Bitmap.SaveToStream(msflow);
ovflow:=StreamToVariant(msflow); 传递ovflow:OleVariant 服务器
smflow:=TMemoryStream.Create;
VariantToStream(pflow,smflow);//转化为TMemoryStream
smflow.Position:=0;
ADODB.SQL.Clear;
ADODB.SQL.Add('insert into table (图片) values(:pflow)');
ADODB.Parameters.ParamByName('pflow').LoadFromStream(smflow,ftBlob);
ADODB.ExecSQL; 读方法反向编写即可。
-------------------------------------------------------------------重点提示:三层结构中的Blob/image的读写不是大问题,最重要的是客户端 与服务器段的变量传递。