在三层开发中, 如何将一个图片从客户端传入应用层, 并写入数据库??? TPho 是远程数据模板。关键是参数应选什么类型! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to : Liusp(夜深千帐灯) 不知道, 但我必须传, 你友好的解决方案吗 ?请赐教! 实验了一下,可以,和在C/S模式下没有太大的区别,就是直接用远程数据模块就可以了。我用DCOM试的,其他的应该也一样可以。 哦,我没有用存储过程,直接给BLOB字段赋值然后传了。 //procedure Tpho.InputPho(???: ???);procedure Tpho.InputPho(Pho:olevariant)varaproc: TAdoStoredProc;beginaproc.create(self);aproc.ProcedureName := 'sp_Add;1'aproc.Parameters.Refresh;aproc.Parameters[0].Value := Pho;aproc.ExecProc;end;//**********************************************//Client function StringToVariantArray(const S: string): OleVariant;var P: Pointer;begin Result := NULL; if Length(S) > 0 then begin Result := VarArrayCreate([0, Length(S) - 1], varByte); P := VarArrayLock(Result); try Move(S[1], P^, Length(S)); finally VarArrayUnlock(Result); end; end;end;客户端: 用conn: TSocketConnection 连接, 选中的图片已加入image1:TImage 中procedure TForm1.BitBtn1Click(Sender: TObject);//向库中插入一纪录var v:olevariant; MS:TMemoryStream; s:string;begin MS := TMemoryStrea.Create(); Image1.Picture.Bitmap.SaveToStream(MS); SetLength(S,MS.Size); Move(MS.Memory^,Pointer(S)^,MS.Size) MS.Free(); V := StringToVariantArray(S); conn.Appserver.InputPho(V);end; 写一个dcom,用流传输,比较简单! to:lwm8246(lwm8246) 谢谢!等我测试一下! to:lwm8246(lwm8246) StringToVariantArray(S); 函数在哪儿定义的?好像不在Variants中 现在可以传了, 但是图片大小有限制,是不是VarArray 限制了元素个数?还有:请问怎么给分?我找不到地方! 其实还可以用IPicture来进行传输,用SetOlePicture和GetOlePicture方法进行 大小有限制吗?如果愿意用BLOB字段直接传,很大的都没有问题,我试的时候把一个28M的.PDF文件传过去了。图片也一样。 to:qiubolecnIPicture 类型在哪里定义? 做过一个这样的例子.步骤如下:1.将服务器端对应datasetprovider的options的fetchblobondemand选项设为true,因为false情况下,客户端的clientdataset是不取blob数据的.或者在 false情况下用clientdataset的fetchblob方法取得数据库中的数据.2.源程序如下(win2000/delphi/ocracle)procedure writetoblobfield;vartfStream:TFileStream;tbStream:TBlobStream;nbufsize:integer;pbuf:PChar;beginWith clientdataset1 dobeginif Active = false thenActive := true;Append;trytfStream:=TFileStream.Create(FilePath,fmOpenRead);nbufsize:=tfStream.Size +1;pbuf:=AllocMem(nbufsize);tfStream.Read(pbuf^,nbufsize);tbStream:=TBlobStream.Create((fieldbyname('TestImage') as TBlobField),bmWrite);tbStream.Seek(0,SoFromBeginning);tbStream.Write(pbuf^,nbufsize);finallytfStream.Free ;tbStream.Free ;post;FreeMem(pbuf,nbufsize);Active:=False;end;end;end;procedure savetoclient;varfilebody:tstream;tempfile:tmemostream;begintryfilebody:=clientdataset.createblobstream(Tblobfield,bmread);filebody.position:=0;tempfile:=tmemostream.create;tempfile.loadfromstream(filebody);tempfile.savetostream(文件名);finallytempfile.free;filebody.frdd;end;end; 该程序在win2000/oracle/三层结构条件下测试过 fastreport 这样的分组合计怎么做 一个关于控件调整size的问题。。sorry...没分了 急,简单问题。在线等待... 关于多层数据库的事务问题! 以前搞VB,想换语言,不知BCB开发效率高还是DELPHI开发效率高。 怎么没有人会用线程来解决进度条的显示。非高手莫入!!!!!!!!!!!!! 谁能知道他这个文本的加密算法? 请帮帮我,我在做项目,但是有个问题啊!!! delphi功能强大吗? 如何將數據寫入文件的指定位置? 虚拟键盘摁键 屏幕的闪烁??
不知道, 但我必须传, 你友好的解决方案吗 ?请赐教!
procedure Tpho.InputPho(Pho:olevariant)
var
aproc: TAdoStoredProc;
begin
aproc.create(self);
aproc.ProcedureName := 'sp_Add;1'
aproc.Parameters.Refresh;
aproc.Parameters[0].Value := Pho;
aproc.ExecProc;
end;//**********************************************
//Client
function StringToVariantArray(const S: string): OleVariant;
var
P: Pointer;
begin
Result := NULL;
if Length(S) > 0 then
begin
Result := VarArrayCreate([0, Length(S) - 1], varByte);
P := VarArrayLock(Result);
try
Move(S[1], P^, Length(S));
finally
VarArrayUnlock(Result);
end;
end;
end;
客户端: 用conn: TSocketConnection 连接, 选中的图片已加入image1:TImage 中
procedure TForm1.BitBtn1Click(Sender: TObject);//向库中插入一纪录
var
v:olevariant;
MS:TMemoryStream;
s:string;
begin
MS := TMemoryStrea.Create();
Image1.Picture.Bitmap.SaveToStream(MS);
SetLength(S,MS.Size);
Move(MS.Memory^,Pointer(S)^,MS.Size)
MS.Free();
V := StringToVariantArray(S);
conn.Appserver.InputPho(V);
end;
谢谢!等我测试一下!
StringToVariantArray(S); 函数在哪儿定义的?好像不在Variants中
还有:请问怎么给分?我找不到地方!
和GetOlePicture方法进行
如果愿意用BLOB字段直接传,很大的都没有问题,我试的时候把一个28M的.PDF文件传过去了。图片也一样。
IPicture 类型在哪里定义?
做过一个这样的例子.步骤如下:
1.将服务器端对应datasetprovider的options的fetchblobondemand选项设为true,因为false情况下,客户端的clientdataset是不取blob数据的.或者在 false情况下用clientdataset的fetchblob方法取得数据库中的数据.
2.源程序如下(win2000/delphi/ocracle)
procedure writetoblobfield;
var
tfStream:TFileStream;
tbStream:TBlobStream;
nbufsize:integer;
pbuf:PChar;
begin
With clientdataset1 do
begin
if Active = false then
Active := true;
Append;
try
tfStream:=TFileStream.Create(FilePath,fmOpenRead);
nbufsize:=tfStream.Size +1;
pbuf:=AllocMem(nbufsize);
tfStream.Read(pbuf^,nbufsize);
tbStream:=TBlobStream.Create((fieldbyname('TestImage') as TBlobField),bmWrite);
tbStream.Seek(0,SoFromBeginning);
tbStream.Write(pbuf^,nbufsize);
finally
tfStream.Free ;
tbStream.Free ;
post;
FreeMem(pbuf,nbufsize);
Active:=False;
end;
end;
end;procedure savetoclient;
var
filebody:tstream;
tempfile:tmemostream;
begin
try
filebody:=clientdataset.createblobstream(Tblobfield,bmread);
filebody.position:=0;
tempfile:=tmemostream.create;
tempfile.loadfromstream(filebody);
tempfile.savetostream(文件名);
finally
tempfile.free;
filebody.frdd;
end;
end;
该程序在win2000/oracle/三层结构条件下测试过