View Full Version : سوال: ذخيره عكس در بانك !!!
acilios
سه شنبه 22 بهمن 1387, 08:26 صبح
با سلام.
از مديران بخش به خاطر ايجاد تاپيك تكراري معضرت ميخوام ولي هر چي با كليد واژه Blobو... گشتم به نتيجه نرسيدم.
سوالم اين بود كه چطوري ميشه خودعكس رو توي SQL ذخيره كنم ؟
به شكل آدرس ذخيره كردم ولي جايي كه برنامه قراره كار كنه احتمال پاك شدن فايل زياده !!و اينكه حداكثر تعداد اعضا حدودا" 300 نفر هستش.
ممنون.
Batman
سه شنبه 22 بهمن 1387, 11:19 صبح
با سلام.
از مديران بخش به خاطر ايجاد تاپيك تكراري معضرت ميخوام ولي هر چي با كليد واژه Blobو... گشتم به نتيجه نرسيدم.
سوالم اين بود كه چطوري ميشه خودعكس رو توي SQL ذخيره كنم ؟
به شكل آدرس ذخيره كردم ولي جايي كه برنامه قراره كار كنه احتمال پاك شدن فايل زياده !!و اينكه حداكثر تعداد اعضا حدودا" 300 نفر هستش.
ممنون.
Information.Close;
Information.SQL.Clear;
Information.SQL.Add('insert into information(pic) Values(:pic)');
Information.Parameters.ParamByName('pic').LoadFrom File(Form2.OpenPictureDialog1.FileName,ftBlob);
موفق باشید
shervin farzin
سه شنبه 22 بهمن 1387, 12:59 عصر
سلام
http://barnamenevis.org/forum/showthread.php?t=124596
موفق باشيد.
acilios
چهارشنبه 23 بهمن 1387, 09:58 صبح
با سلام.
جناب BatMan كد زير يادتون رفته :
Information.ExecSQL;
پيروز و سربلند باشيد.
acilios
چهارشنبه 23 بهمن 1387, 21:50 عصر
سلامی دوباره.
یه مشکل تازه !!
وقتی کد زیر رو برای ثبت اجرا میکنم خطای "ADOquery Cannot Perform This Opration On a Closed Dataset"
میده.
Information.Close;
Information.SQL.Clear;
Information.SQL.Add('insert into users(code,pic) Values(:code,:pic)');
Information.Parameters.ParamByName('code').Value:= edit1.text;
Information.Parameters.ParamByName('pic').LoadFrom File(Form1.OpenPictureDialog1.FileName,ftBlob);
Information.ExecSQL;
مشکل از کجاست ؟
اگه میشه کد بالا رو به شکل AdoTable بدین چون من تا حالا ثبت با کوئری کار نکردم و با خطاهاش آشنا نیستم.
موفق باشید.
Modernidea
شنبه 26 بهمن 1387, 12:31 عصر
سلامی دوباره.
یه مشکل تازه !!
وقتی کد زیر رو برای ثبت اجرا میکنم خطای "ADOquery Cannot Perform This Opration On a Closed Dataset"
میده.
Information.Close;
Information.SQL.Clear;
Information.SQL.Add('insert into users(code,pic) Values(:code,:pic)');
Information.Parameters.ParamByName('code').Value:= edit1.text;
Information.Parameters.ParamByName('pic').LoadFrom File(Form1.OpenPictureDialog1.FileName,ftBlob);
Information.ExecSQL;
مشکل از کجاست ؟
اگه میشه کد بالا رو به شکل AdoTable بدین چون من تا حالا ثبت با کوئری کار نکردم و با خطاهاش آشنا نیستم.
موفق باشید.
سلام
شما بايد بعد از اين دستور :
Information.SQL.Add('insert into users(code,pic) Values(:code,:pic)');
ديتابيس را بايد در حالت ويرايش يا درج قرار بدي.
خسته نباشيد.
babak_delphi
شنبه 26 بهمن 1387, 20:45 عصر
تا جایی که من میدونم مقدار فیلد blob رو اینطور وارد نمیکنند
روش زیر را امتحان کنید :
var
Stream: TStream;
buf : TMemoryStream;
begin
Stream := ADOQuery.CreateBlobStream(ADOQuery.fieldbyname('My Field'), bmRead);
Stream.Seek(0,0);
buf:=TMemoryStream.Create;
Buf.CopyFrom(Stream,Stream.Size);
buf.SaveToFile('c:\Temp.bmp');
Stream.Free;
buf.Free;
end;
acilios
یک شنبه 27 بهمن 1387, 07:58 صبح
با سلام و تشکر از شما دوستان.
من همون کدهای قبلی رو توی یه پروژه دیگه کپی(!!!) کردم و بدون هیچ اخطاری اجرا و ذخیره شد هنوز هم نمیدونم اون پیغام خطا برای چی بود !
آقای babak_delphi من برای ذخیره عکس ها از روشی که بالا درج شده استفاده کردم و تا حالا هم مشکل خاصی نداشته به نظر شما روش مشکل داریه ؟
روشی که شما درج کردین چه مزیتی نسبت به روش من داره ؟
آیا روش خوبی(کارا) برای کم کردن حجم عکسی که ذخیره میکنم هست یه نه ؟ اگر بله لطفا" راهنمایی کنید.
باز هم از پاسخ دوستان ممنون.
shervin farzin
یک شنبه 27 بهمن 1387, 09:34 صبح
سلام
كدي كه در پست 2 ، Batman عزيز نوشتن درست مثل كدي كه آقاي Babak_Delphi نوشتن.
البته كدي كه آقاي Babak_Delphi نوشتن براي خوندن عكس از Database هست نه نوشتنش .
به هر حال هر دوست گرامي از نوع داده Blob استفاده كردن .
آیا روش خوبی(کارا) برای کم کردن حجم عکسی که ذخیره میکنم هست یه نه
هيچ كدوم از اين روشها ربطي به فشرده سازي Stream ورودي نداره . اگه قصد كم كردن حجم داده
ورودي رو داريد بايد از الگوريتمهاي فشرده سازي براي Stream استفاده كنيد .
هنوز هم نمیدونم اون پیغام خطا برای چی بود !
علت خطا اين بود كه زمان ساختن فيلد Blob ، همونطور كه در خط زير :
Information.Parameters.ParamByName('pic').LoadFrom File(Form1.OpenPictureDialog1.FileName,ftBlob);
از كد شما نوشته شده ، بايد الگوي فيلد رو از Dataset ميخونده ، در حالي كه Dataset در اون
لحظه يا خالي بوده يا شامل فيلدهايي بوده كه هيچ كدوم الگوي Blob رو نداشتن .
اگر هنوز اين خطا رو داريد كافيه قبل كد Insert ، يك select انجام بديد به نحوي كه در خروجي
اين select حتما فيلدي كه عكس رو قرار ذخيره كنه وجود داشته باشه .
موفق باشيد.
babak_delphi
یک شنبه 27 بهمن 1387, 20:27 عصر
برای نوشتن در دیتابیس هم با کمی تغییر میتونید از این روش استفاده کنید
مزیت این روش اینه که همه نوع داده ای رو میشه با اون نوشت و خوند
من از این برای خواندن و نوشتم فایل صوتی در دیتا بیس استفاده میکردم
البته همونطور که Shervin Farzin اشاره کردند این روشها ربطی به فشرده سازی ندارند
برای فشرده سازی روشهای دیگه ای وجود داره
مثلا میتونید ZLib رو در سایت جستجو کنید
موفق باشید
acilios
دوشنبه 28 بهمن 1387, 07:48 صبح
با سلام.
منظورم از فشرده سازی, استفاده از روش Stream نبود بلکه استفاده از روش هایی که babak_delphi به آن اشاره کردند بود.
با کلید Zlib جستجو کردم ولی مثل همیشه موارد یافت شده ربطی به Zlib نداشتند !!
اگه مثالی یا لینکی در رابطه با فشرده سازی عکس قرار بدین ممنون میشم.
یه سوال دیگه;جدولی دارم که توش سوابق افراد ذخیره میشه;به نظرتون از چه نوع فیلدی استفاده کنم ؟(nvarchar,nText,...)
shervin farzin
دوشنبه 28 بهمن 1387, 10:06 صبح
سلام
ابتدا Zlib رو در بخش Uses فرم اضافه كنيد . بعد از اون با استفاده از Function زير ميتونيد يك Stream ورودي رو فشرده كنيد :
Function Zip(Source:TMemoryStream):TMemoryStream;
var
ComprStream:TCompressionStream;
begin
Result:=TMemoryStream.Create;
comprStream:=TCompressionStream.Create(clFastest,R esult);
try
comprStream.CopyFrom(Source,Source.Size);
finally
comprStream.Free;
end;
end;
به كمك تابع زير هم يك Stream فشرده شده رو باز ميكنيد ( البته فقط Stream هايي كه با تابع Zip فشرده كرديد .)
Function UnZip(Source:TMemoryStream):TMemoryStream;
var
DeComprStream:TDecompressionStream;
Buffer: Array[0..4000] of char;
BufLen: Integer;
begin
Result:=TMemoryStream.Create;
DeComprStream:=TDecompressionStream.Create(Source) ;
try
BufLen:=DeComprStream.Read(Buffer,SizeOf(Buffer));
while BufLen>0 do
begin
Result.Write(Buffer,BufLen);
BufLen:=DeComprStream.Read(Buffer,SizeOf(Buffer));
end;
Result.Seek(0,soFromBeginning);
finally
DeComprStream.Free;
end;
end;
مثال :
var
Tmp:TMemoryStream;
begin
tmp:=TMemoryStream.Create;
try
// Zip File
tmp.LoadFromFile('C:\pic.jpg');
tmp:=Zip(tmp);
tmp.SaveToFile('C:\pic.zzip');
// Unzip File
tmp.LoadFromFile('C:\pic.zzip');
tmp:=UnZip(tmp);
tmp.SaveToFile('C:\pic.jpg');
finally
tmp.Free;
end;
موفق باشيد .
acilios
پنج شنبه 01 اسفند 1387, 07:58 صبح
با تشکر از پاسخ شما.
در این کد :
comprStream:=TCompressionStream.Create(clFastest,R esult);
پارامتر clfastest دارای مقادیر دیگه ای هم هست ؟:متفکر:چون توی برنامه های فشرده سازی مثل WinRAR قبل از فشرده کردن فایل شما می توانید حالت هایی را در نظر بگیرید;مثل:Fastest;Normal;Good;Best,...
موفق باشید.
acilios
جمعه 02 اسفند 1387, 16:35 عصر
سلام دوباره.
دوستان عزیز همان طور که شما راهنمایی کردین برای ثبت عکس از کد زیر استفاده کردم :
SQL.Add('insert into users(pic)'+'Values(:pic)');
Parameters.ParamByName('pic').LoadFromFile(Fmusers .OpenPictureDialog1.FileName,ftBlob);
ExecSQL;ولی برای ویرایش همان عکس ثبت شده از کد زیر استفاده کردم که با خطای زیر(عکس ضمیمه)روبرو شدم:
SQL.Add('insert into users(pic)'+'Values(:pic) where code ='''+Edit1.Text+'''');
Parameters.ParamByName('pic').LoadFromFile(Fmusers .OpenPictureDialog1.FileName,ftBlob);
ExecSQL;
shervin farzin
شنبه 03 اسفند 1387, 00:37 صبح
سلام
خطايي كه بهش اشاره كرديد مربوط به اين ميشه كه فايل عكس رو پيدا نكرده يا آدرسي كه وارد برنامه ميشه اشتباه .
پيشنهاد ميكنم قبل از استفاده از آدرس OpenPictureDialog ، اول اون رو Showmessage كنيد تا درستيش براي خودتون معلوم بشه .
نكته ديگه اين كه براي ويرايش كردن جدولتون بايد از دستور Update استفاده كنين نه اين كه Insert رو با Where تركيب كنيد !!
نكته بعد اين كه اگه نوع فيلد Code در جدولتون عددي هست ، نبايد مقدار Edit1.Text رو بين تگ قرار بدين.
پس كد ويرايش شما ميشه كد زير :
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('Update users set pic=:P1 where code = :p2');
Parameters.ParamByName('P1').LoadFromFile(OpenPict ureDialog1.FileName,ftBlob);
Parameters.ParamByName('P2').Value:=edit1.Text;
ExecSQL;
end;
موفق باشيد.
Batman
شنبه 03 اسفند 1387, 06:19 صبح
با سلام
جناب shervin farzin عزیز کدی که درباره فشرده سازی گذاشتید بعد از اینکه فایل رو unzip می کنم فایل خزاب میشه و دیگه باز نمیشه.
acilios
شنبه 03 اسفند 1387, 07:08 صبح
با سلام.
در مورد پیشنهادتون باید بگم که قبلا" این کار رو کردم;یعنی دیالوگ مسیر رو به درستی بر میگردونه(مقدار Opendialog.filename برابر با Null نیست ! ).
ابتدا از دستور آپدیت برای این کار استفاده کردم;ولی نه به این شکلی که شما بیان کردین.
در مورد نوع فیلد کد هم باید بگم از نوع "ان ور چر" هستش.
در پایان از شما ممنونم;کدی که دادین رو تست میکنم و نتیجشو ارسال میکنم(اینجا خبری از دلفی نیست).
موفق باشید.
shervin farzin
شنبه 03 اسفند 1387, 10:01 صبح
سلام
کدی که درباره فشرده سازی گذاشتید بعد از اینکه فایل رو unzip می کنم فایل خراب میشه و دیگه باز نمیشه.
يه سوال : فايل Zip رو به كمك همين كد Zip كه نوشتم توليد كرديد يا مثلا WinZip ساختيد ؟
اگه فايل Zip رو با همين Zip Function توليد كرديد پس لطفا كد Unzip كه نوشتيد روي سايت
بذارين چون من از همين دو تابع استفاده ميكنم و مشكلي به وجود نمياد .
موفق باشيد.
Batman
شنبه 03 اسفند 1387, 18:41 عصر
سلام
يه سوال : فايل Zip رو به كمك همين كد Zip كه نوشتم توليد كرديد يا مثلا WinZip ساختيد ؟
اگه فايل Zip رو با همين Zip Function توليد كرديد پس لطفا كد Unzip كه نوشتيد روي سايت
بذارين چون من از همين دو تابع استفاده ميكنم و مشكلي به وجود نمياد .
موفق باشيد.
من دقیقا کدهای شما رو کپی کردم.
بعد از اجرا حجم فایل unzip صفر میشه.
در ضمن مقدار فشرده سازی چقدره؟یعنی این بهتره یا winrar یا نرم افزارهای شبیه اینها؟
shervin farzin
یک شنبه 04 اسفند 1387, 00:09 صبح
سلام
مقدار فشرده سازی چقدره؟یعنی این بهتره یا winrar یا نرم افزارهای شبیه اینها؟
در حد 7 يا 8 فايلي كه من استفاده كردم مخصوصا در مورد عكسها يه ذره از WinZip بهتر بود .
ولي فقط در بعضي موارد از WinRAR بهتر عمل ميكرد .
در مورد الگوريتم فشرده سازي كه در Zlib Unit استفاده ميشه اطلاعي ندارم .
موفق باشيد.
behzadsaed
پنج شنبه 29 اسفند 1387, 00:16 صبح
سلام دوستان
روش اضافه کردن تصوير به بانک DBISAM چه جوريه ؟
peymanjon
یک شنبه 15 بهمن 1391, 10:55 صبح
http://barnamenevis.org/images/icons/icon12.png نقل قول: ذخيره عكس در بانك !!!
http://barnamenevis.org/images/misc/quote_icon.png نوشته شده توسط shervin farzin http://barnamenevis.org/images/buttons/viewpost-left.png (http://barnamenevis.org/showthread.php?p=682947#post682947)
سلام
يه سوال : فايل Zip رو به كمك همين كد Zip كه نوشتم توليد كرديد يا مثلا WinZip ساختيد ؟
اگه فايل Zip رو با همين Zip Function توليد كرديد پس لطفا كد Unzip كه نوشتيد روي سايت
بذارين چون من از همين دو تابع استفاده ميكنم و مشكلي به وجود نمياد .
موفق باشيد.
من دقیقا کدهای شما رو کپی کردم.
بعد از اجرا حجم فایل unzip صفر میشه.
منم این مشکل و دارم ، کسی هست که کد درست داشته باشه؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.