من یک بانک SQL دارم که روی server قرار دارد و کاربران از طریق برنامه دلفی که بر روی کلاینتها نصب می شود به آن دسترسی دارند . یکی از جدولهای بانک من یک فیلد از نوع Image دارد . چگونه می توانم از طریق برنامه در این فیلد عکس قرار دهم .
من یک بانک SQL دارم که روی server قرار دارد و کاربران از طریق برنامه دلفی که بر روی کلاینتها نصب می شود به آن دسترسی دارند . یکی از جدولهای بانک من یک فیلد از نوع Image دارد . چگونه می توانم از طریق برنامه در این فیلد عکس قرار دهم .
درود
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;
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 استفاده کنید. (وگرنه "تمام" فایل احتمالا حجیم شما یکبار به درون حافظه خوانده شده و بعد حافظه آزاد می شود)
از راهنماییهای شما دوستان عزیز بسیار ممنونم .
naficy جان کد بازیافت از sql رو هم محبت کن و بده
نمونه سورس این تاپیک در همین سایت هست
سرچ کن
سلام من تازه دلفی یاد گرفتم ولی هر چه دنبال TBlobField میگردم پیدا نمیکنم.میشه راهنمایم کنید
TBlobField در یونیت Data.DB قرار داره که باید نام این یونیت رو به قسمت Uses اضافه کنیدسلام من تازه دلفی یاد گرفتم ولی هر چه دنبال TBlobField میگردم پیدا نمیکنم.میشه راهنمایم کنید
اگر از نسخه های قدیمی دلفی استفاده می کنید به جای "Data.DB" فقط "DB" رو به Uses اضافه کنید
توصیه اکید دارم تصاویر رو داخل بانک اطلاعاتی قرار ندید و فقط آدرس اون رو در بانک ذخیره کنید
من خودم یک بار این تجربه رو داشتم و واقعا دردسر داشتم
و به شما هم توصیه میکنم تصاویر رو به جای ذخیره مستقیم در بانک در هارد ذخیره کنید و فقط آدرسش رو در انک ذخیره کنید
یا حق
تجربه های موفقی از ذخیره سازی دیتاهای حجیم داخل بانک وجود دارد، ضمن اینکه دقت داشته باشید که نگهداری اطلاعات
به صورت مستقیم روی دیسک نیاز به بررسی زیادی در سطح سیستم عامل، شبکه، دسترسی ها، رمزنگاری فایل ها و
انتقال اطلاعات به کلاینت و... دارد و البته میتونه نتیجه خیلی خوبی هم داشته باشه.
راه کارهایی مثل FilreStream رو ببینید.
و در کنار ذخیره سازی روی دیسک، ذخیره سازی داخل یک دیتابیس جداگانه یا FileGroupهای مجزا و دیسک جداگانه و سریع هم میتونه راه کار مناسبی باشه.
فلويد گواهي مي دهد به آنکه زيستن در هنگامهی استبداد، چه آسان روياها را واژگون مي کند، چه سهل بر چهرهی آزادی تيغ میکشد!
این راهکار خوبه اما تا اونجا که من اطلاع دارم بازم بر روی دیسک اطلاعات رو ذخیره میکنه.راه کارهایی مثل FilreStream رو ببینید.
خیلی هم بررسی زیادی نمیخوادنگهداری اطلاعات
به صورت مستقیم روی دیسک نیاز به بررسی زیادی در سطح سیستم عامل، شبکه، دسترسی ها، رمزنگاری فایل ها و
انتقال اطلاعات به کلاینت و... دارد
ولی به سرعت و سادگی پیاده سازیش می ارزه
اما همون FILEsTREAM راه کار مناسبیه
از همین روش FileGroup مجزا در دیتابیس انجام دادم بدون مشکل داره کار میکنه و ذخیره و بازیابی تصاویر با رکورد زیاد داخل دیتابیس انجام میشه .راه کارهایی مثل FilreStream رو ببینید.
و در کنار ذخیره سازی روی دیسک، ذخیره سازی داخل یک دیتابیس جداگانه یا FileGroupهای مجزا و دیسک جداگانه و سریع هم میتونه راه کار مناسبی باشه.
مطمئنا به بررسی زیادی نیاز دارد.
وقتی که 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;
البته منظرو من از fileStream اون قابلیتی هستش که از sql Server 20008 به بعد به این نرم افزار اضاضه شد.با استفاده از روش Stream ذخیره سازی کن:
آهان خب من اشتباه فهمیدم.شرمنده
خب با file stream خوب برنامه sql این کار رو انجام بدی بهتر هست.چون اینطوری کد نویسی نداره.
چرا عزیزم اونجا هم کد نویسی دارهچون اینطوری کد نویسی نداره.
اما عملیات ذخیره و بازیابی رو خودش انجام میده