PDA

View Full Version : سوال: ذخیره عکس در بانک sql



YkA1363
پنج شنبه 16 تیر 1390, 20:10 عصر
سلام
یک ماه به جمع شما دوستان پیوستم و یک ماهه که دارم جستجو می کنم اما مشکلم حل نشد. یه برنامه برای دبیرخانه نوشتم و با این دستور اطلاعاتم رو داخل بانک sql2005 ذخیره می کنم:

var
str,id1,id2,id3,id4,id5:string;

begin
if tag=1 then
begin
str:= 'INSERT INTO [Database].[dbo].[QRecive]([Radif],[LetterDate],[LetterNo],[Title],[Attach], '+
'[RegisterDate],[BayganiDate],[TextFrom],[TextTo],[TextTabaghe],[TextVaziyat], '+
'[TextMahalBaygani],[PaperNo],[Link]) '+
'VALUES ('+Edit1.Text+','+QuotedStr(MaskEdit1.Text)+','+Qu otedStr(Edit2.Text)+','+
''+QuotedStr(Edit3.Text)+','+QuotedStr(Edit4.Text) +','+QuotedStr(MaskEdit2.Text)+', '+
''+QuotedStr(MaskEdit3.Text)+','+id1+','+id2+','+
''+id3+','+id4+','+id5+','+Edit5.Text+','+Edit6.Te xt+')';

. می خوام همراه این اطلاعات عکس نامه هم در همون رکورد ذخیره بشه. با توجه به راهنماییهای که در سایت دیدم خواستم از دستور زیر استفاده کنم که نشد از اساتید عزیز خواهشمندم جهت حل این مشکل راهنمایی لازم رو از بنده دریغ نکنند.
var
Stream:TStream;

begin
dm.QRecive.Edit;
dm.QRecive.Insert;
Stream := dm.QRecive.CreateBlobStream(dm.QReciveImage, bmWrite);
try
Image1.Picture.Graphic.SaveToStream(Stream);
finally
Stream.Free;
end;
end;

یوسف زالی
پنج شنبه 16 تیر 1390, 21:09 عصر
سلام.
دو تا پردازه برات میگذارم که خودم با اونا کار می کنم:


procedure LoadPictureFromField(ADOContainer: TCustomADODataSet; BlobField: TBlobField; Img: TImage);
var
Stream:TStream;
JPG: TJPEGImage;
JPG_Error: boolean;
begin
Stream := TStream.Create;
JPG := TJPEGImage.Create;
Stream := ADOContainer.CreateBlobStream(BlobField,bmRead);
if Stream.Size = 0 then
begin
Img.Picture.Assign(nil);
exit;
end;
JPG_Error := false;
try
JPG.LoadFromStream(Stream);
except
JPG_Error := true;
end;
if not JPG_Error then
begin
Stream.Destroy;
Img.Picture.Assign(JPG);
JPG.Destroy;
end
else
begin
Stream.Destroy;
JPG.Destroy;
Img.Picture.Assign(BlobField); // when old type exists in DB started by 0x424D
end;
end;
procedure SavePictureToField(ADOContainer: TADOStoredProc; Parameter: string; Img: TImage);
var
JPG : TJPEGImage;
MemoryStream : TMemoryStream;
begin
if Img.Picture.Graphic <> nil then
begin
// SetPictureMinimalToSave(Img, 100);
JPG := TJPEGImage.Create;
MemoryStream := TMemoryStream.Create;
JPG.Assign(Img.Picture.Graphic);
JPG.SaveToStream(MemoryStream);
ADOContainer.Parameters.paramByName(Parameter).Loa dFromStream(MemoryStream,ftVarBytes);
MemoryStream.Destroy;
JPG.Destroy;
end
else
ADOContainer.Parameters.paramByName(Parameter).Val ue := null;
end;


نحوه فراخوانی ساده ای هم دارند.
برای ذخیره:


SavePictureToField(SP, '@Field', Image);


برای بازیابی:


LoadPictureFromField(SP, SPField, Image);


این هم برای کم حجم کردن عکس قبل از ذخیره:


procedure SetPictureMinimalToSave(IMG: TImage; Quality: TJPEGQualityRange = 100);
var
JPG: TJPEGImage; {U30: decrease size of picture fit to Image and JPG}
BMP: TBitmap;
begin
BMP := TBitmap.Create;
JPG := TJPEGImage.Create;
BMP.Assign(IMG.Picture.Graphic);
IMG.Picture.Assign(BMP);
BMP.Width := IMG.Width;
BMP.Height := IMG.Height;
BMP.Canvas.StretchDraw(BMP.Canvas.ClipRect,IMG.Pic ture.Graphic);
JPG.Assign(BMP);
JPG.CompressionQuality := Quality;
JPG.Compress;
IMG.Picture.Assign(JPG);
BMP.Destroy;
JPG.Destroy;
end;

YkA1363
یک شنبه 19 تیر 1390, 22:07 عصر
procedure ها رو توی برنامم گذاشتم اما نتونستم نتیجه بگیرم لطف می کنید یک مثال برام بزارین ممنون می شم.:خجالت:

یوسف زالی
دوشنبه 20 تیر 1390, 18:19 عصر
ببینید مثلا یک SPبه نام SPExteraFieldsValueTBL دارید که فیلدی add شده به نام SPExteraFieldsValueTBLValueEFV از نوع BlobField داره.
برای بازیابی :
LoadPictureFromField(SPExteraFieldsValueTBL, SPExteraFieldsValueTBLValueEFV, Image1); // load to image1
و برای ذخیره مثلا در SP به نام SPExteraFieldsValueUpdate دارای یک پارامتر به نام @ValueEFV و از نوع ftVarBytes :
SavePictureToField(SPExteraFieldsValueUpdate, '@ValueEFV', Image1)// saving image1
خیلی سخت نیست.

YkA1363
دوشنبه 23 مرداد 1391, 21:59 عصر
ببینید مثلا یک SPبه نام SPExteraFieldsValueTBL دارید که فیلدی add شده به نام SPExteraFieldsValueTBLValueEFV از نوع BlobField داره.
برای بازیابی :
LoadPictureFromField(SPExteraFieldsValueTBL, SPExteraFieldsValueTBLValueEFV, Image1); // load to image1
و برای ذخیره مثلا در SP به نام SPExteraFieldsValueUpdate دارای یک پارامتر به نام @ValueEFV و از نوع ftVarBytes :
SavePictureToField(SPExteraFieldsValueUpdate, '@ValueEFV', Image1)// saving image1
خیلی سخت نیست.

سلام
برنامه دبیرخانه رو پارسال تحویل دادم اما عکسها رو توی بانک ذخیره نکردم.در حال حاضر روی یک برنامه دیگه دارم کار می کنم که چون روی شبکه قرار می گیره حتما باید عکسها داخل بانک ذخیره بشه.
یک سوال داشتم منظور از SP چیه من متوجه نشدم میشه لطف کنید راهنماییم کنید.می خوام عکسام توی بانک sql2000 ذخیره بشه از adoquery استفاده می کنم.ممنون

mohsen24000
دوشنبه 23 مرداد 1391, 23:59 عصر
sp مخفف Stored Procedure است که در این لینک بیشتر توضیح داده شده: http://en.wikipedia.org/wiki/Stored_procedure

fahimi
سه شنبه 24 مرداد 1391, 18:09 عصر
با سلام
بنظر من ذخیره عکس در تیبل با توجه اینکه SQL Server در فیلدهایی از نوع varbinary(max) بیش از 2GB را نمی‌توان ذخیره کند ،منطقی نمی باشد.
مایکروسافت برای حل مشکلات ذخیره فایل در SQL Server 2008 قابلیت جدیدی را ارائه داده کرده است به نام FileStream که در تاپیک http://barnamenevis.org/showthread.php?354812-FileStream-%D8%A7%D8%B3-%DA%A9%DB%8C%D9%88%D8%A7%D9%84-%D8%B3%D8%B1%D9%88%D8%B1-2008-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A2%D9%86-%D8%AF%D8%B1-%D8%AF%D9%84%D9%81%DB%8C بحث شده است