Vahid_moghaddam
پنج شنبه 20 دی 1386, 12:03 عصر
درباره ذخیره و بازیابی این نوع فیلدها در این سایت خوشبختانه زیاد بحث شده و روشهای مختلفی هم ارائه شده است. در اینجا سعی می شود روش دیگری معرفی شود.
فرض کنید جدولی داریم (در SQL) که شامل فیلدهای
ID (int)
IMAGE (image)
NAME (char)
می باشد و نام جدول Blob است.
فرم مورد نظر در پروژه هم کامپوننتی دارد از نوع TADOQuery با نام AdoQuery1 که به دیتابیس جدول Blob متصل است. برای نمونه می خواهیم عکسی با فرمت BMP را در جدول ذخیره کنیم:
procedure InsertBlob();
var
bS : TADOBlobStream;
Fs:TFileStream;
begin
with AdoQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('Select [id],[image],[name] from blob');
Open;
Insert;
FieldByName('Name').Value:='test';
bS := TADOBlobStream.Create( tblobfield(adoquery1.Fields[1]),bmwrite);
try
bS.Seek(0, soFromBeginning);
fs := TFileStream.Create('c:\1.bmp',fmOpenRead or fmShareDenyWrite);
try
bS.CopyFrom(fs, fs.Size)
finally
fs.Free
end;
finally
bS.Free
end;
Post;
Close;
end;
end;
در کد بالا به فیلد ID مقداری اختصاص نیافته است. اما پرکردن این فیلد هم شبیه به فیلد Name است.
حال فرض کنید می خواهیم یک تصویر ذخیره شده در جدول را که دارای Id=9 می باشد، بازیابی کنیم و از آن مثلا در یک TImage با نام Image1 استفاده کنیم:
procedure ReadBLOB();
var
bS : TADOBlobStream;
begin
with Adoquery1 do
begin
Close;
SQL.Clear;
SQL.Add('select [id],[image],[name] from blob where id=9');
Open;
try
bS := TADOBlobStream.Create( tblobfield(adoquery1.Fields[1]), bmRead);
image1.Picture.Bitmap.LoadFromStream(bs);
finally
bS.Free
end;
close;
end;
end;
بدیهی است از این روش برای ذخیره فایلهای مختلف می توان استفاده کرد.
نکته: کلاس TADOBlobStream شامل متدهای SaveToStream و SaveToFile می باشد.
فرض کنید جدولی داریم (در SQL) که شامل فیلدهای
ID (int)
IMAGE (image)
NAME (char)
می باشد و نام جدول Blob است.
فرم مورد نظر در پروژه هم کامپوننتی دارد از نوع TADOQuery با نام AdoQuery1 که به دیتابیس جدول Blob متصل است. برای نمونه می خواهیم عکسی با فرمت BMP را در جدول ذخیره کنیم:
procedure InsertBlob();
var
bS : TADOBlobStream;
Fs:TFileStream;
begin
with AdoQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('Select [id],[image],[name] from blob');
Open;
Insert;
FieldByName('Name').Value:='test';
bS := TADOBlobStream.Create( tblobfield(adoquery1.Fields[1]),bmwrite);
try
bS.Seek(0, soFromBeginning);
fs := TFileStream.Create('c:\1.bmp',fmOpenRead or fmShareDenyWrite);
try
bS.CopyFrom(fs, fs.Size)
finally
fs.Free
end;
finally
bS.Free
end;
Post;
Close;
end;
end;
در کد بالا به فیلد ID مقداری اختصاص نیافته است. اما پرکردن این فیلد هم شبیه به فیلد Name است.
حال فرض کنید می خواهیم یک تصویر ذخیره شده در جدول را که دارای Id=9 می باشد، بازیابی کنیم و از آن مثلا در یک TImage با نام Image1 استفاده کنیم:
procedure ReadBLOB();
var
bS : TADOBlobStream;
begin
with Adoquery1 do
begin
Close;
SQL.Clear;
SQL.Add('select [id],[image],[name] from blob where id=9');
Open;
try
bS := TADOBlobStream.Create( tblobfield(adoquery1.Fields[1]), bmRead);
image1.Picture.Bitmap.LoadFromStream(bs);
finally
bS.Free
end;
close;
end;
end;
بدیهی است از این روش برای ذخیره فایلهای مختلف می توان استفاده کرد.
نکته: کلاس TADOBlobStream شامل متدهای SaveToStream و SaveToFile می باشد.