关于三层中保存图片的问题(各位兄弟姐妹帮帮忙,给好意见者一定给分)

haoco 2003-03-31 08:33:27
我们现在做的系统要实现这样的功能:
在客户端将选择的图片传回应用服务器来生成一个SQL语句来更新到数据库,但我发现传过去的数据会丢失,大家帮我解决。
...全文
37 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
renzhm 2003-04-01
  • 打赏
  • 举报
回复
使用OleVariant变量传输

做两个方法:

//服务器端,将OleVariant转化为TStream
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、文件的数据库读写操作。

dancedog 2003-04-01
  • 打赏
  • 举报
回复


TBlobField *pField=(TBlobField*)Common->ClientDataSets[0]->FieldByName("照片");
TClientBlobStream *Stream=new TClientBlobStream(pField,bmRead);
Stream->Seek(0,soFromBeginning);
TJPEGImage *pBitmap = new TJPEGImage();
pBitmap->LoadFromStream(Stream);
Image1->Picture->Assign(pBitmap);
delete pBitmap;
delete Stream;
}

Common->ClientDataSets[0]->Edit();
TBlobField *pField=(TBlobField*)Common->ClientDataSets[0]->FieldByName("照片");
TClientBlobStream *Stream=new TClientBlobStream(pField,bmWrite);
Stream->Seek(0,soFromBeginning);
TJPEGImage *pBitmap = new TJPEGImage();
pBitmap->Assign(Image1->Picture->Graphic);
pBitmap->SaveToStream(Stream);
delete pBitmap;
delete Stream;
Common->ClientDataSets[0]->ApplyUpdates(-1);


haoco 2003-04-01
  • 打赏
  • 举报
回复
我就是要用SQL语句实现的方法!
TOMWLD 2003-03-31
  • 打赏
  • 举报
回复
用sql 语句我也无法做到,但用clientdataset可以
var
StrTypeName: string;
TypeID: integer;
BlobStream: TFileStream;

with dmGSPReport.cdsReport do
begin
if Active then
Active := False;
CommandText := 'SELECT * FROM GSPReport WHERE Type=2';
Active := True;
Append;

FieldValues['Name'] := FormReportEdit.edtName.Text;
FieldValues['Type'] := 2;
FieldValues['FatherID'] := TypeID;
FieldValues['Memo'] := FormReportEdit.Memo1.Lines.Text;
BlobStream := TFileStream.Create(FormReportEdit.edtFile.Text,
fmOpenRead);

(FieldByName('TemplateFormat') as
TBlobField).LoadFromStream(BlobStream);
FieldValues['Ext'] := RightStr(FormReportEdit.edtFile.Text, 3);

Post;
ApplyUpdates(0);
end;
end;

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧