# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  پاياني بر مبحث ذخيره، بازيابي و به روزرساني عكس در پايگاه داده

## احمد سامعی

سلام
من يك نمونه برنامه نوشتم كه تقريباً هر كاري كه لازم در ارتباط با عكس و پايگاه داده صورت بگيره توش هست و بعضي جاها تو كد به فارسي توضيح دادم

برنامه با VS 2008 هست
اما از فريم فرك دو استفاده كردم تا بقيه هم بتونند نحوه كار ببينند
پايگاه داده اكسس 2003
كارايي برنامه
1. باز كردن عكس دلخواه
2. تغيير سايز عكس
3. ذخيره در بانك
4. بازيابي و نمايش
5. به روز رساني عكسهاي ذخيره شده با سايز جديد
6. قابليت حذف
اميدوارم اين كمكي باشه بر سوالات دوستان در اين مورد

اما چند مورد:
در اين مثال بانك Access هست و  فرمت فيلد عكس داخل بانك هم از نوع OLE Object  هست. براي SQL Server هم از نوع( VARBINERY(MAX  مي شه استفاده كرد.

مايکروسافت قويا هشدار داده است که ديگر از نوع داده IMAGE استفاده نکنيد و به جاي آن از نوع دادة (VARBINERY(MAX استفاده کنيد؛ بايد بدانيد که نوع دادة IMAGE فقط براي سازگاري با SQL Server 2000 هنوز در SQL Server 2005 وجود دارد و در نگارش بعدي SQL Server ، ديگر اين نوع داده پشتيباني نخواهد شد.

كدهاي ذخيره سازي:
private void btSave_Click(object sender, EventArgs e)
        {
            try
            {
                MemoryStream ms = new MemoryStream();
                imageBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                byte[] bytes = ms.GetBuffer();
                oleDbCommand1.Parameters.Clear();
                oleDbCommand1.Parameters.Add("@Id", OleDbType.BSTR).Value = ++count;
                oleDbCommand1.Parameters.Add("@Pic", OleDbType.Binary).Value = bytes;
                oleDbCommand1.CommandText = "insert into Pic (id, pic) values(@Id, @pic)";
                oleDbCommand1.ExecuteNonQuery();
                tbTotal.Text = count.ToString(); 
                index = count;
                flag = true;
                MessageBox.Show("Saved successful");
            }
            catch (Exception ex) { MessageBox.Show(ex.ToString()); }
        }
كدهاي بازيابي و نمايش:
private void btShow_Click(object sender, EventArgs e)
        {
            if (tbNumber.Text != string.Empty)
            {
                if (count >= Int32.Parse(tbNumber.Text))
                {
                    Show(Int32.Parse(tbNumber.Text));
                }
                else MessageBox.Show("شماره عكس مورد نظر بيشتر از تعداد عكس موجود در فايل اطلاعاتي است، امكان نمايش نيست");
            } else MessageBox.Show("شماره عكس مورد نظر براي نمايش را انتخاب كنيد");
        }
        private void Show(int indexID)
        {
                    try
                    {
                        GC.Collect();//اين متد براي تخليه منابع سيستم فراخواني مي شود
                        oleDbCommand1.CommandText = "SELECT pic FROM Pic WHERE id=" + indexID + "";
                        OleDbDataReader myReader = oleDbCommand1.ExecuteReader();
                        if (myReader.Read())
                        {
                            MemoryStream ms = new MemoryStream((byte[])(myReader.GetValue(0)));
                            imageBox1.Image = Image.FromStream(ms);
                        }
                       myReader.Close(); index = indexID;
                       flag = true; lbInfo.Text = "Original Size: " + imageBox1.Image.Size;
                    }
                    catch (Exception ex) { MessageBox.Show(ex.ToString()); }
        }
همونطور كه مي بينيد از MemoryStream براي اين كار استفاده شده

در ضمن به عمد از ImageBox خود دات نت استفاده نكردم و يك ImageBox سفارشي استفاده كردم كه قابليت هاي خوبي براي كار با عكس داره كه دوستان مي تونند سورس و توضيحات لازم اين كنترل از اين لينك دريافت كنند.
(به دليل محدوديت در حجم فايل هاي پيوستي من سه قسمت گذاشتم براي اجراي برنامه بعد از دانلود هر سه فايل بايد براي فقط اجراي نسخه اجرايي پوشه DataBase در مسير برناه قرار بديد و براي استفاده از سورس لازم Dll هاي داخل فايل Demo به پوشه  Debug اضافه كنيد همچنين به  ToolBox ويژوال استديدو خودتون)

سوالي اگر بود در خدمتم

----------


## احمد سامعی

فايل پايگاه داده برنامه

----------


## danial82

نمیدونم چرا وقتی همین پروژه رو تبدیل به SQL میکنم به اشکال بر میخورم
میتوانی همینو با SQL  بنویسی

----------


## mahdi_7610

من مقاله شما را خوندم و مقاله خوبی بود .

اما شما اونا با vs2008 نوشتید که من 2005 دارم . و نتونستم کامل برنامه را اجرا کنم .

فقط تونستم با باز کردن Form1.cs دستورات اونا مشاهده کنم .

به نظر میاد به صورت ویزار دیتابیس را وارد کردید .  

در ضمن تبدیل کدهای برنامه شما به sql وقت زیادی را میگیره .

اگه بتونید با vs2005 بنویسید و از دیتابیس sql sarver استفاده کنید بهتر و مفید تر می بود .

موقع اجرا کردن exe برنامه هم چند تا اررو داده می شه .

در ضمن باعث شدید تاپیک من بسته بشه  :ناراحت: 

مرسی

----------


## احمد سامعی

منون از دقتتون دوستان

1. در اينجا فقط قصد نشون دادن نحوه ذخيره و بازيابي و غيره بود و بانك اصلاً مهم نيست كه با كد ايجاد شده باشه يا ويزارد براي راحتي ديدن جدول از اكسس استفاده كردم  اما سعي مي كنم نسخه SQL Server رو هم بزارم
2. تبديل كدهايي كه از اكسس استفاده مي كنن با كدهاي SQL Server فقط تو كلاس هاي ADO.Net هست يعني اينجا ما از OleDB استفاده كرديم با SQL Server از كلاس هاي SQL در ADO استفاده مي شه كه يك دقيقه لازم داره تا عوض بشه
3. نمي دونم چرا نتونستيد اجرا كنيد احتمالاً پوشه فايل اكسس كه پست دوم هست درست در مسير فايل اجرايي نگذاشتيد(خود فايل اكسس نبايد در كنار فايل exe  قرار بگيره بايد به همون صورت پوشه بعد از اكسترك قرار بگيره )
4. من چون مي دونستم همه VS2008 ندارن با دانت دو نوشتم و باز هم چون همه آفيس 2007 ندارند با فرمت 2003 ذخيره كردم تا مشكلي نباشه اما همونطور يكي از دوستان اشاره كردند چون كدها فقط در يك فايل اونهايي كه از 2005 استفاده مي كنند براحتي مي تونند همون فايل باز كنند و كدها رو ببيند
(من چون رو سيستم 2008 هست نمي تونم نسخه 2005 آماده كنم و بفرستم  شرمنده)
باز هم درخدمتم

----------


## علیرضا مداح

سلام دوست عزیز، 
از نمونه کدی که در این خصوص قرار دادید، سپاسگزارم،
اما نمی توان روش مذکور را تنها روش ممکن و پایانی بر این مقوله دانست، 
همیشه برای رسیدن به یک هدف، روش های گوناگونی وجود دارد که باید از میان آن ها، بهترین روش را که بیشترین سازگاری را با شرایط پروژه داشته باشد، برگزید و باید به راه حل ها به عنوان Guideline نگاه کرد،
پیشنهاد می کنم ابتدا مقاله زیر:
Storing Images and BLOB Files in SQL Server
و سپس مطلب زیر را که در خصوص نوع داده/ویژگی جدید FILESTREAM که به SQL Server 2008 اضافه شده است، می باشد:
The FILESTREAM DataType in SQL SERVER 2008
و بعد پست زیر که چگونگی بهره گیری از این ویژگی توسط LINQ را تشریح می کند را مطالعه نمایید:
Visual Studio 2008 SP1: LINQ to SQL and FILESTREAM 
ویدئوی آموزنده ی زیر را نیز مشاهده نمایید:
Channel 9 - SQL Server 2008 – FILESTREAM, WPF and HTTP
،/

----------


## احمد سامعی

> از نمونه کدی که در این خصوص قرار دادید، سپاسگزارم،


من هم بيشتر سپاسگذارم به خاطر توجه عنايت شما استاد بزرگوار





> اما نمی توان روش مذکور را تنها روش ممکن و پایانی بر این مقوله دانست، 
> همیشه برای رسیدن به یک هدف، روش های گوناگونی وجود دارد که باید از میان آن ها، بهترین روش را که بیشترین سازگاری را با شرایط پروژه داشته باشد، برگزید و باید به راه حل ها به عنوان Guideline نگاه کرد،


صد البته كه حرف شما درست و صحيح و اين كد دقيقاً يك Guideline هست، من قصد جسارت نداشتم، 
در واقع در هر علمي نمي توان پاياني براي چيزي دانست مخصوصاً علوم كامپيوتر كه صدها هزار نفر در هر روز در حال توسعه اين علم هستند. :تشویق: 
 شايد آخر شب (يعني سرصبح ساعت4:30) من عجله كردم واسه انتخاب عنوان منظور من هم همون يك شروع براي اين كار بود (چون ديدم دوستان زياد سوال دارن اين برنامه رو به عنوان يك راهنماي كلي قرار دادم در ضمن معمولاً چون اكثر برنامه نويس هاي ما در ايران مثل خودم از دنيا يك چند فاضي عقب هستيم به كار همه مي آيد چون هنوز ملت با برنامه هاي كهنه و نسخه هاي 2000 و ماقبل كار مي كنند و برنامه مي نويسند آفيس و SQL Server 2008 اومده هنوز با 98 كار مي كنند :قهقهه: )
ببخشيد استاد پر حرفي كردم شما عنوان پست به هرچيزي كه بهتر تغيير بدين

در ضمن يك سوال فرعي من VS 2008 تازگي گرفتم اما SQL Server 2005 داره ؟ چرا 2008 نداره ؟ آيا نسخه هاي مختلفي هست ؟ ( چون به شدت معتقد به آپديت بودن در اين مسايل هستم ولي تو شهرستان همين هم كه گيرم اومده خيليه :لبخند گشاده!: )

----------


## debugger

این ارور چیه موقع باز کردن سورس برنامه میاد

Error 1 Unexpected error reading metadata from file 'c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Sys  tem.Web.dll' -- 'Not enough storage is available to complete this operation. ' Save Picture to DB

----------


## s.alipour

با سلام
چرا هيچ كس به فكر ما مبتدي ها نيست؟ در رابطه با ذخيره عكس در اكسس خيلي جستجو كردم. اطلاعات مفيدي وجود داره اما هيچكدام آنها به زبان برنامه نويسي اكسس نيستن. يا تو vb.net نوشته شدن يا تو vb6 يا C#‎ و ...
خواهش مي كنم درمورد چگونگي ذخيره و نمايش عكس در فرم توسط زبان برنامه نويسي اكسس مرا راهنمائي كنيد.
با تشكر

----------


## 84shadmehr84

سلام
من تو کد با موضوع "پاياني بر مبحث ذخيره، بازيابي و به روزرساني عكس در پايگاه داد" به مشکل خوردم  و شدیدا به این کد نیاز دارم، امیدوارم کمکم کنید:
مشکلات:
- ImageBox 
- FromStream
- iFormControls
من کد بالا رو به برنامم که به زبان سی شارپ اضافه می کنم ولی خطاهای بالا رو میده

----------


## ghasem110deh

سلام
واسه من فرم رو باز نمیکنه ... مثل وقتی که از کامپوننت های dev یا چیز دیگه ای استفاده میشه ولی رو سیستم دیگری نیست !
بالا هم مینویسه imageBox not fuond ... اشکال چیه ؟

من بانکم اکسسه ... الان عکس ریختم ولی نمیتونم عکس رو picturebox نمایش بدم ! (نمیخوام از دیتاگرید ویو استفاده کنم)

----------


## learningtv.i

دوستان می توانند برای ذخیره و بازیابی تصویر در بانک اطلاعاتی مثلا SQL Server با روش LINQ از آموزش اینجانب به صورت فیلم آموزشی استفاده کنند.

خیلی ساده تر از حالت استفاده از ADo.net هست.امتحانش کنید.

----------

