# Native Code > برنامه نویسی در Delphi > بانک های اطلاعاتی در Delphi >  قراردادن عکس دربانک SQL ازطریق برنامه دلفی

## amehrabi

من یک بانک SQL دارم که روی server قرار دارد و کاربران از طریق برنامه دلفی که بر روی کلاینتها نصب می شود به آن دسترسی دارند . یکی از جدولهای بانک من یک فیلد از نوع Image دارد . چگونه می توانم از طریق برنامه در این فیلد عکس قرار دهم .

----------


## m-khorsandi

درود


procedure TForm1.Button2Click(Sender: TObject);
Var
  MemStream: TMemoryStream;
begin
  OpenDlg.Execute;
  Image2.Picture.LoadFromFile(OpenDlg.FileName);
  FileStream := TMemoryStream.Create;
  FileStream.LoadFromFile(OpenDlg.FileName);
  ADOTable1.Append;
  TBlobField(ADOTable1.FieldByName('FaxData')).LoadF  romStream(FileStream);
  ADOTable1.Post;
end;

----------


## Naficy

procedure TForm1.Button2Click(Sender: TObject);
Var
  FileStream: TMemoryStream;
begin
  if OpenDlg.Execute then begin
    FileStream := TMemoryStream.Create;
    try
      FileStream.LoadFromFile(OpenDlg.FileName);
      ADOTable1.Append;
      TBlobField(ADOTable1.FieldByName('FaxData')).LoadF  romStream(FileStream);
      ADOTable1.Post;
    finally
      FileStream.Free;
    end;
  end;
end;

تصحیح چند خطای جزیی و چند تصحیح ساختاری  :چشمک:  
همچنین واقعا بهتره (از نظر حافظه مصرفی و سرعت) که از TFileStream به جای TMemoryStream استفاده کنید. (وگرنه "تمام" فایل احتمالا حجیم شما یکبار به درون حافظه خوانده شده و بعد حافظه آزاد می شود)

----------


## amehrabi

از راهنماییهای شما دوستان عزیز بسیار ممنونم .

----------


## ehsan2000

:تشویق:   :تشویق:   :تشویق:

----------


## bangal

naficy جان کد بازیافت  از sql رو هم محبت کن و بده

----------


## Valadi

نمونه سورس این تاپیک در همین سایت هست 
سرچ کن

----------


## Auobauob

سلام من تازه دلفی یاد گرفتم ولی هر چه دنبال TBlobField میگردم پیدا نمیکنم.میشه راهنمایم کنید

----------


## Mahmood_M

> سلام من تازه دلفی یاد گرفتم ولی هر چه دنبال TBlobField میگردم پیدا نمیکنم.میشه راهنمایم کنید


TBlobField در یونیت Data.DB قرار داره که باید نام این یونیت رو به قسمت Uses اضافه کنید
اگر از نسخه های قدیمی دلفی استفاده می کنید به جای "Data.DB" فقط "DB" رو به Uses اضافه کنید

----------


## hadisalahi2

توصیه اکید دارم تصاویر رو داخل بانک اطلاعاتی قرار ندید و فقط آدرس اون رو در بانک ذخیره کنید
من خودم یک بار این تجربه رو داشتم و واقعا دردسر داشتم
و به شما هم توصیه میکنم تصاویر رو به جای ذخیره مستقیم در بانک در هارد ذخیره کنید و فقط آدرسش رو در انک ذخیره کنید

یا حق

----------


## m-khorsandi

تجربه های موفقی از ذخیره سازی دیتاهای حجیم داخل بانک وجود دارد، ضمن اینکه دقت داشته باشید که نگهداری اطلاعات 
به صورت مستقیم روی دیسک نیاز به بررسی زیادی در سطح سیستم عامل، شبکه، دسترسی ها، رمزنگاری فایل ها و 
انتقال اطلاعات به کلاینت و... دارد و البته میتونه نتیجه خیلی خوبی هم داشته باشه.

راه کارهایی مثل FilreStream رو ببینید.

و در کنار ذخیره سازی روی دیسک، ذخیره سازی داخل یک دیتابیس جداگانه یا FileGroupهای مجزا و دیسک جداگانه و سریع هم میتونه راه کار مناسبی باشه.

----------


## hadisalahi2

> راه کارهایی مثل FilreStream رو ببینید.


این راهکار خوبه اما تا اونجا که من اطلاع دارم بازم بر روی دیسک اطلاعات رو ذخیره میکنه.




> نگهداری اطلاعات 
> به صورت مستقیم روی دیسک نیاز به بررسی زیادی در سطح سیستم عامل، شبکه، دسترسی ها، رمزنگاری فایل ها و 
> انتقال اطلاعات به کلاینت و... دارد


خیلی هم بررسی زیادی نمیخواد 
ولی به سرعت و سادگی پیاده سازیش می ارزه
اما همون FILEsTREAM راه کار مناسبیه

----------


## hamid-nic

> راه کارهایی مثل FilreStream رو ببینید.
> 
> و در کنار ذخیره سازی روی دیسک، ذخیره سازی داخل یک دیتابیس جداگانه یا  FileGroupهای مجزا و دیسک جداگانه و سریع هم میتونه راه کار مناسبی باشه.


از همین روش FileGroup مجزا در دیتابیس انجام دادم بدون مشکل داره کار میکنه و ذخیره و بازیابی تصاویر با رکورد زیاد داخل دیتابیس انجام میشه .

----------


## m-khorsandi

> این راهکار خوبه اما تا اونجا که من اطلاع دارم بازم بر روی دیسک اطلاعات رو ذخیره میکنه.
> 
> 
> 
> خیلی هم بررسی زیادی نمیخواد 
> ولی به سرعت و سادگی پیاده سازیش می ارزه
> اما همون FILEsTREAM راه کار مناسبیه




مطمئنا به بررسی زیادی نیاز دارد.
وقتی که 400 تا کاربر از نرم افزار استفاده میکنند و تعداد فایل ها بعد از چند ماه به 200000 تا میرسه و فقط هم
با عکس سر و کار نداری و فیلم و ... هم هست. سخت افزار، امنیت فایلها، نوع دسترسی و سناریویی که برای تهیه نسخه پشتیبان باید در نظر بگیری حتما و حتما نیاز به بررسی داره.

----------


## ابوالفضل عباسی

سلام
با استفاده از روش Stream ذخیره سازی کن:
برای ذخیره سازی:
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;

----------


## hadisalahi2

> با استفاده از روش Stream ذخیره سازی کن:


البته منظرو من از fileStream اون قابلیتی هستش که از sql Server 20008 به بعد به این نرم افزار اضاضه شد.

----------


## ابوالفضل عباسی

آهان خب من اشتباه فهمیدم.شرمنده
خب با file stream خوب برنامه sql این کار رو انجام بدی بهتر هست.چون اینطوری کد نویسی نداره.

----------


## hadisalahi2

> چون اینطوری کد نویسی نداره.


چرا عزیزم اونجا هم کد نویسی داره
اما عملیات ذخیره و بازیابی رو خودش انجام میده

----------

