PDA

View Full Version : ذخیره و بازیابی عکس



sh_m
چهارشنبه 06 آبان 1383, 12:07 عصر
سلام
من میخوام تعداد بسیار زیادی عکس را در بانک sql ذخیره کرده و توسط یک برنامه درvb.net آنها را بازیابی کنم.برای این منظور چه راهی را پیشنهاد میکنید که با توجه به تعداد زیاد عکسها سرعت کارخیلی پایین نیاید؟
با تشکر فراوان.

AminSobati
چهارشنبه 06 آبان 1383, 13:52 عصر
دوست عزیزم،
SQL Server برای کار با حجم های بسیار بالای اطلاعات طراحی شده، مشروط بر اینکه ساختار و طراحی دیتابیس و جداول ما صحیح باشه.
برای ذخیره اطلاعات باینری(مثلا تصاویر، فایلهای صوتی و ...)، از جنس Image برای فیلد استفاده کنین.
فایلی که براتون Attach کردم، یک مثال از نحوه Insert کردن فایلهای باینری به SQL Server هستش.
فقط به خاطر داشته باشین، زمانی که از جدول حاوی اطلاعات باینری SELECT انجام میدین، تا جای ممکن از WHERE به شکلی استفاده کنین که رکوردهای کمتری برگرده. چون اگر فیلد Image در SELECT شما وجود داشته باشه و تعداد رکوردهای زیادی رو یکباره SELECT کنین، تمام اطلاعات موجود در اون فیلد باید به حافظه Load بشن که در نتیجه هم Query کندتر آماده میشه و هم حافظه زیادی اشغال میکنه.
موفق باشید،
امین ثباتی MCSD

AminSobati
شنبه 09 آبان 1383, 01:57 صبح
دوست عزیزم،
برای این کار شما باید بعد از ساختن connection و recordset، یک آبجکت stream بسازید و توسط این آبجکت، فایل تصویر رو بخونین و به recordset اضافه کنین:


Dim stm As New Stream
stm.Type = adTypeBinary
stm.Open
stm.LoadFromFile "c:\MyPic.bmp"
rs.AddNew
rs.Fields("Column1").Value = stm.Read
rs.Update
stm.Close

با فرض بر اینکه rs از جنس recordset باشه و column1 همون فیلدیه قرار تصویر داخلش قرار بگیره.
موفق باشین

sh_m
دوشنبه 18 آبان 1383, 09:32 صبح
سلام آقای ثباتی
من در VB.Net کد شما را امتحان کردم ولی نوع Fileinfo و Stream رو نمیشناسه و جزو انواع تعریف شده موجود در VB.Net نیست .آیا باید خدمون اینها رو تعریف کنیم؟ چه جوری؟؟؟؟؟؟؟؟؟؟
در ضمن داخل StoreProcedure ذکر شده چه کدی نوشته شده؟(در SQL )
خلاصه که من خیلی به این موضوع احتیاج دارم و کارم حسابی گیره.تو رو خدا کمکم کنین.
من میدونم شما در این زمینه حتما تجربه زیادی دارید. پس خواهش میکنم بیشتر توضیح بدین (خط به خط) البته با عرض پوزش.
پیش امام رضا حتما دعاتون میکنم.
منتظرم .

AminSobati
دوشنبه 18 آبان 1383, 13:29 عصر
دوست عزیزم،
در قبل از جایی که تعریف کلاس Form شروع میشه، اینها رو Import کنین:

Imports System.Data.SqlClient
Imports System.IO
Imports System.Configuration
Imports System.Data.SqlDbType
در این مثال فرض شده که شما یک جدول دارید با این ساختار:

CREATE TABLE MyImages (
FName VarChar(100),
FType VarChar(10),
Img Image,
FSize Int)

و پروسیجر هم چیزی مثل این:

CREATE PROC Images_ins
@FileName VarChar(100),
@FileType VarChar(10),
@Image Image,
@FileSize Int
AS
INSERT MyImages(FName, FType, Img, FSize)
VALUES (@FileName, @FileType, @Image, @FileSize)

ضمنا در قسمت With cmd.Parameters، در انتهای دومین Add بعد از مثبت، یک _ قرار بدین یا اینکه سطر پایین رو هم بیارین بالا.
موفق باشید (التماس دعا :) )

sh_m
سه شنبه 19 آبان 1383, 12:22 عصر
سلام آقای ثباتی
واقعا ازتون متشکرم
بالاخره جواب گرفتم . فقط یه اشکالی هست.وقتی برنامه را اجرا میکنم از ConnectionString اشکال می گیره در حالی که در کد برنامه این را ذکر کرده ام:
System.Configuration.ConfigurationSettings.AppSett ings
ولی بازم خطا میده.البته موقعی که ConnectionString رو خودم به صورت دستی مستقیما وارد کردم درست شد ولی فکر میکنم این راه ایده آلی نیست.پس لطف کنین بگین که باید ConfigurationSettings را چطور تنظیم کنم؟(اصلا کار ConfigurationSettings چیه؟)
در ضمن برای بازیابی عکس ها از بانک یه راهنمایی کوچیک میخوام.
یه سوال دیگه :
برای ذخیره یک فایل html شامل هرچی از قبیل متن و جدول باید از چه نوع فیلدی در sql استفاده کرد و کد ورود اطلاعات را چگونه باید بنویسیم . شرمنده که اینقدر مزاحمتون میشم .اگه دوست داشتین لطفا جواب بدین .تا الانش هم خیلی مزاحمتون شدم .
:oops: :oops: شرمندم

AminSobati
سه شنبه 19 آبان 1383, 13:10 عصر
دوست عزیزم،
استفاده از ConfigurationSettings الزامی نیست. این مثال فرض کرده که شما یک فایل App.config به برنامتون Add کردین و مشخصات Connection رو از این طریق میخونین. فایل App.config برای این استفاده میشه که شما بعضی از مشخصات رو به صورت External در این فایل نگهداری کنین تا حتی بعد از Compile شدن برنامه هم بتونین اون مشخصات رو تغییر بدین. لذا اگر خودتون Connection رو تعریف کنین، کار اشتباهی انجام ندادین.
برای بازیابی عکسها، اگر میخواهید اونها رو از دیتابیس به فایل ببرید، دقیقا روش عکس رو عمل کنین. یعنی از:

imgStream.Read()
fi.OpenWrite()
استفاده کنین. ولی اگر در داخل Form باید نمایش بدین، به فایلی که فرستادم رجوع کنین.
برای بردن اسناد Word یا HTML هم از روش قبل میشه استفاده کرد و فیلدتون میتونه از جنس Image باشه.

موفق باشید

sh_m
سه شنبه 19 آبان 1383, 23:03 عصر
با سلامی دوباره خدمت استاد خوبم آقای ثباتی عزیز
همچنین عرض تشکر فراوان
با عرض پوزش مجدد میخواستم بپرسم برای بازیابی و نمایش فایلهای html و word باید از چه componentی استفاده کنم و چگونه؟
آیا برای ذخیره متونی که حاوی جدول می باشند و تعداد خطوط زیادی دارند (اسناد مرتب شده) در بانک sql راه بهتری نسبت به استفاده از فیلد image سراغ ندارید؟
بهترین راه رو میخوام چون قراره یک بانک حجیم طراحی کنم .
آیا ذخیره با استفاده از فیلد image دقیقا به همان صورتی است که عکس ها رو ذخیره کردیم؟ (با راهنمایی های بی دریغ شما :) ).؟
متشکرم . :flower:

AminSobati
چهارشنبه 20 آبان 1383, 00:13 صبح
دوست عزیزم،
برای بازیابی فایلهای ذخیره شده در فیلدهایی از جنس Image، همونطور که قبلا ذکر کردم به روش بلعکس عمل کنین. یعنی هر کاری موقع Insert در دیتابیس انجام دادین، حالا تفریبا معکوسش باید عمل بشه.
ولی برای نمایش HTM و DOC، بعد از اینکه اونها رو از دیتابیس فراخوانی کردین و روی هارددیسک به عنوان یک فایل Save کردین، میتونین از آبجکت Internet Explorer برای HTM و از آبجکت Word برای DOC استفاده کنین.
اگر نمیخواین فایلها رو به داخل دیتابیس ببرید، میتونین آدرس فیزیکیه فایلها رو فقط در دیتابیس ذخیره کنین و با خواندن اون آدرس، به محل فایل روی هارد دیسک پی ببرین. مثلا: C:\MyFiles\Pics\Image01.bmp
با این روش دیتابیستون حجیم نمیشه ولی باید به محل فیزیکیه فایلها دست نزنید یا اگر تغییر دادین، دیتابیس رو هم تغییر بدین. ضمنا تعیین سطح دسترسی دیگه روی Folder باید صورت بگیره نه در SQL Server.


آیا ذخیره با استفاده از فیلد image دقیقا به همان صورتی است که عکس ها رو ذخیره کردیم؟
بله، برای Insert در فیلد از جنس Image به همون روش عمل کنین.
موفق باشید..

ENG_Torshani
یک شنبه 06 دی 1388, 20:15 عصر
دوستان عزیز شما با رکوردست این کار را انجام میدهد با TSQL چجوری میشه انجام داد

AminSobati
یک شنبه 06 دی 1388, 23:52 عصر
برای ورود عکس به دیتابیس از SQL Server 2005 به بالا میتونین از OpenRowSet استفاده کنین. مثالش در همین تالار هست