在三層開發中, 如何將一個圖片從客戶端傳入應用層, 並寫入數據庫???


應用層是調用存儲過程寫入數據庫(sql2000)
如:
表為: t1 字段 photo 類型 image

存儲過程sp_Add: create sp_Add @photo image as insert t1 values(@photo)
應用層接口過程:
procedure Tpho.InputPho(???: ???);
var
  aproc: TAdoStoredProc;
begin
  aproc.create(self);
  aproc.ProcedureName := 'sp_Add;1'
  aproc.Parameters.Refresh;
  aproc.Parameters[1].Value := Pho;
  aproc.ExecProc;
end;
客戶端: 用conn: TSocketConnection 連接, 選中的圖片已加入image1:TImage 中
procedure TForm1.BitBtn1Click(Sender: TObject);//向庫中插入一紀錄
begin
  conn.Appserver.InputPho(???);
end;

請問: 上面代碼中 出現(???)的 地方該怎樣寫 才能將圖像寫入庫中?

23 个解决方案

#1


采用文件流,遠程控制也是這么做的.

#2


關注

#3


TPho 是遠程數據模板。
關鍵是參數應選什么類型!

#4


關注,但傳圖片是不是可取

#5


to : Liusp(夜深千帳燈) 
不知道, 但我必須傳, 你友好的解決方案嗎 ?請賜教!

#6


實驗了一下,可以,和在C/S模式下沒有太大的區別,就是直接用遠程數據模塊就可以了。我用DCOM試的,其他的應該也一樣可以。


#7


哦,我沒有用存儲過程,直接給BLOB字段賦值然后傳了。

#8


//procedure Tpho.InputPho(???: ???);
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;


#9


test

#10


TEST TEST

#11


用數據流實現,我同意

#12


數據庫只保存圖片文件在本地的路徑,不知道這種方案是否可行?

#13


寫一個dcom,用流傳輸,比較簡單!

#14


應該跟CS下沒有什么很大的區別,用流操作就可以,不過你要控制流量。

#15


to:lwm8246(lwm8246) 
謝謝!等我測試一下!

#16


to:lwm8246(lwm8246) 
StringToVariantArray(S); 函數在哪兒定義的?好像不在Variants中

#17


DSIntf

#18


現在可以傳了, 但是圖片大小有限制,是不是VarArray 限制了元素個數?
還有:請問怎么給分?我找不到地方!

#19


其實還可以用IPicture來進行傳輸,

用SetOlePicture
和GetOlePicture方法進行

#20


大小有限制嗎?
如果願意用BLOB字段直接傳,很大的都沒有問題,我試的時候把一個28M的.PDF文件傳過去了。圖片也一樣。

#21


to:qiubolecn
IPicture 類型在哪里定義?

#22


up

#23



  
做過一個這樣的例子.步驟如下:
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/三層結構條件下測試過

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com