View Full Version : سوال: نحوه كار با فيلد Image مربوط به SQL در دلفي
  
mehdi_moosavi
سه شنبه 12 آبان 1394, 16:53 عصر
وقت دوستان بخير
اين كد براي تغيير يك فيلد String هست كه از مقدار يك فيلد ديگه خونده ميشه:
  NET.Append;
  NETM1.AsString:=NETNAME.AsString;
  NET.Post;
حالا اگه نوع اين دو فيلد Image باشه كد بايد چطور نوشته بشه؟
لطفا راهنمايي كنيد
با تشكر
ابوالفضل عباسی
سه شنبه 12 آبان 1394, 18:14 عصر
بانکت sql هست؟اگر Access هست از این کدها استفاده کن
برای ذخیره سازی:
var  Field: TBlobField;
  Stream: TStream;
begin
  if ADOQuery.Active and (Image.Picture.Graphic <> nil) then
  begin
    ADOQuery.Insert;
    Field := TBlobField(ADOQuery.FieldByName('ImageData')); // ensure it ís a blob
    Stream := ADOQuery.CreateBlobStream(Field, bmWrite);
    try
      Image1.Picture.Graphic.SaveToStream(Stream);
    finally
      Stream.Free;
      ADOQuery.Post;
    end;
  end;
end;    
برای خواندش:
var  Field: TBlobField;
  Stream: TStream;
  Jpg: TJPEGImage;
begin
  if ADOQuery.Active then
  begin
    Field := TBlobField(ADOQuery.FieldByName('ImageData'));
    Stream := ADOQuery.CreateBlobStream(Field, bmRead);
    Jpg := TJPEGImage.Create;
    try
      Jpg.LoadFromStream(Stream);
      Image.Picture.Graphic := Jpg;
    finally
      Img.Free;
      Stream.Free;
    end;
  end;
end;
موفق باشی (درضمن اگر بانکت sql server هست بگو که یه کد دیگه بدم)
mehdi_moosavi
سه شنبه 12 آبان 1394, 19:42 عصر
تشکر دوست محترم
من که توی عنوان پست نوشتم SQL
یوسف زالی
سه شنبه 12 آبان 1394, 22:07 عصر
فرقی نمی کنه، در هر دو دی بی ام اس نوع داده blob هست، اگر مبدا و مقصد هر دو روی یک instance هستند بهتره از کوئری برای آپدیت استفاده بشه، این طوری نیازی به دو بار رفت و آمد دیتا اون هم از نوع blob از سرور به کلاینت نیست.
ابوالفضل عباسی
چهارشنبه 13 آبان 1394, 09:46 صبح
دوست عزیز ببخشید من فکر کردم با فرمان sql که توی کوئری استفاده میشه گفتی.:بامزه:
خب این هم فرمان برای بانک sql server:
ذخیره سازی:
var  ms:tmemorystream;
Begin  
  ms:=tmemorystream.create;
  ms.position:=0;
  image1.picture.bitmap.savetostream(ms);
  ms.position:=0;
  with yourfield as tblobfield do
    loadfromstream(ms);
  freeandnil(ms);
end; 
برای خواندن:
var  ms:tmemorystream;
Begin  
  ms:=tmemorystream.create;
  ms.position:=0;
  with yourfield as tblobfield do
    savetostream(ms);
  ms.position:=0;
  image1.picture.bitmap.loadfromstream(ms);
  freeandnil(ms);
end; 
این کارت رو راه می اندازه ولی به کد زیر هم یه نگاهی بکن اون هم جواب کارت رو میده:(ولی کمی طولانیه:لبخند:)
uses jpeg, pngimage;
type
 TitTYPES=(itJPG,itPNG,itBMP);
procedure TForm1.Button1Click(Sender: TObject);
var
 jp:TJpegimage;
 g:TGraphic;
begin
  jp:=TJpegimage.Create;
  try
    ads.Close;
    jp.LoadFromFile('C:\Bilder1\PIC.jpg');
    ads.SQL.Text := 'Insert into IMGBlob (ID,Blob,typ) Values (:ID,:BLOB,:typ)';
    ads.Parameters[0].Value := 1;
    ads.Parameters[1].Assign(jp);
    ads.Parameters[2].Value := itJPG;
    ads.ExecSQL;
    ads.SQL.Text := 'Select * from IMGBlob where ID=:ID';
    ads.Parameters[0].Value := 1;
    ads.Open;
    try
      case TitTYPES(ads.FieldByName('typ').AsInteger) of
           itJPG: g:=TJpegimage.Create;
           itPNG: g:=TPNGImage.Create;
           itBMP: g:=TBitmap.Create;
      end;
    g.Assign(ads.FieldByName('Blob'));
    Image1.Picture.Assign(g);
    finally
      g.Free;
    end;
  finally
    jp.Free;
  end;
end;
موفق باشی:چشمک:(این ها رو توی یه BUTTON باید بذاری اگر خواستی بگو بصورت function هم دارم  برات بگذارم اون طوری حجم کد نویسی کمتره)
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.