سلام عزیزان

این پست نحوه ذخیره تصویر و بازیابی اون بدون دیتاگرید ویو رو براتون آموزش میدم

ببنید این برنامه میتونه بانک اطلاعاتی تصاویر باشه

البته در صورتیکه تصاویر داراری امنیت و محرمانه بوده 2 راه اینجا میشه مطرح کرد اول اینکه دیتابیس مورد نظر رو رمزگذاری کنیم که و این پروژه همین کار رو انجام دادم

و دومین کار اینه که میتونیم داده هایی که تودیتابیس ذخیره میشن رو به حالت رمزنگاری تبدیل کرده و سپس ذخیره کرد 

اما همین روش اول نیز امنیت تصاویر را تا حدودی تامین میکنه

برای شروع با اکسس یه دیتابیس بسازید و اسمش رو مثلا Dbpic بزاریم و یه جدول با نام tblpic  تعیین کنید و 3 فیلد بهش اضافه کنید فیلد اول بنام آی دی و فیلد دوم فیلد ذخیره تصویر با نوع object و فیلد سوم که از این فیلد برای شناسایی تصاویر استفاده میکنیم فیلد اسم تصاویر هست..

 

خب وقتی دیتابیس ساخته شد داخل فرم تو سی شارپ یه picbox بزارید و برای جلوگیری از حرکت اون رو قفل کنید و حالت عکس رو روی استرچ بزارید

خب 4 تا باتن میزاریم یکی برای اتخاب تصویر -دومی برای ذخیره تصویر توی دیتابیس و 2تا برای نمایش عکس یکی با نام و دیگری با شماره ردیف

کد زیر برای انتخاب تصویر هست

            OpenFileDialog op = new OpenFileDialog();
            if (op.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = op.SafeFileName;
                pictureBox1.ImageLocation = op.FileName;
            }

 

برای ذخیره تصویر هم میبایست یه متد تبیل تصویر به بایت مینویسیم

 public static byte[] ImageToByte(Image img)
        {
            ImageConverter converter = new ImageConverter();
            return (byte[])converter.ConvertTo(img, typeof(byte[]));
        }

و توی باتن ذخیره به این شکل ازش استفاده میکنیم

 

 private void Btnsavepic_Click(object sender, EventArgs e)
        {
            filename = Path.GetFileName(textBox1.Text);
            OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dbpic.accdb");
            string query = "Insert Into tblpic (savepic,picname) Values (@save,@name)";
            OleDbCommand com = new OleDbCommand(query, con);
            com.Parameters.AddWithValue("@save", ImageToByte(pictureBox1.Image));
            com.Parameters.AddWithValue("@name",filename);
            con.Open();
            com.ExecuteNonQuery();
            con.Close();
            MessageBox.Show("Save Success!");
        }

 

 

و برای نمایش تصویر از این کد استفاده میکنیم تفاوت نمایش تصویر بوسیله آی دی و یا نام تصویر در انتخاب نام فیلد جدول هست

 

 OleDbConnection co
nn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dbpic.accdb");
            OleDbCommand SQLCommand = new OleDbCommand();
            conn.Open();
            string getpwd = textBox1.Text.ToString();
            string query2 = "select * from tblpic WHERE picname= '" + getpwd + "'";
            Console.Write(query2);
            OleDbCommand s = new OleDbCommand(query2, conn);
            OleDbDataReader bReader = s.ExecuteReader();
            if (textBox1.Text == "")
            {
                MessageBox.Show("Please Enter the Image name to retrive!!");
            }

 

 

 

خیلی پیچیده نیست و دیدم برای چنین برنامه ای 4 برابر این کدنویسی شده که برای بهینه سازی و تجاری کردن برنامه مانند استفاده از بک گراند ورکر و استفاده از async لازم هست

در انتها سورس رو برای استفاده میذارم دانلــــــــــــــود

 

 

همه کد ها 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Data.OleDb;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace pic_save
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string filename = null;
        OleDbConnection con;
        OleDbCommand cmd;


        private void Btnsavepic_Click(object sender, EventArgs e)
        {
            filename = Path.GetFileName(textBox1.Text);
            OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dbpic.accdb;Jet OLEDB:DATABASE password=test++");
            string query = "Insert Into tblpic (savepic,picname) Values (@save,@name)";
            OleDbCommand com = new OleDbCommand(query, con);
            com.Parameters.AddWithValue("@save", ImageToByte(pictureBox1.Image));
            com.Parameters.AddWithValue("@name",filename);
            con.Open();
            com.ExecuteNonQuery();
            con.Close();
            MessageBox.Show("Save Success!");
        }

        public static byte[] ImageToByte(Image img)
        {
            ImageConverter converter = new ImageConverter();
            return (byte[])converter.ConvertTo(img, typeof(byte[]));
        }

        private void Btnselect_Click(object sender, EventArgs e)
        {
            OpenFileDialog op = new OpenFileDialog();
            if (op.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = op.SafeFileName;
                pictureBox1.ImageLocation = op.FileName;
            }
        }

        private void Btngetpic_Click(object sender, EventArgs e)
        {
           
            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dbpic.accdb;Jet OLEDB:DATABASE password=test++");
            OleDbCommand SQLCommand = new OleDbCommand();
            conn.Open();
            string getpwd = textBox1.Text.ToString();
            string query2 = "select * from tblpic WHERE picname= '" + getpwd + "'";
            Console.Write(query2);
            OleDbCommand s = new OleDbCommand(query2, conn);
            OleDbDataReader bReader = s.ExecuteReader();
            if (textBox1.Text == "")
            {
                MessageBox.Show("Please Enter the Image name to retrive!!");
            }

            else if (bReader.Read())
            {
                byte[] b = new byte[0];
                b = (Byte[])(bReader["savepic"]);
                MemoryStream ms = new MemoryStream(b);
                pictureBox1.Image = Image.FromStream(ms);
                //pictureBox1.Image = Convert.ToSByte(dr["Url"].ToString());

            }


            else
            {
                MessageBox.Show("Please Enter Valid Image name!!!");
            }


            conn.Close();
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dbpic.accdb;Jet OLEDB:DATABASE password=test++");

            con.Open();

            cmd = new OleDbCommand("Select * From tblpic where ID=" + textBox1.Text, con);

            OleDbDataAdapter da = new OleDbDataAdapter(cmd);

            DataSet ds = new DataSet();

            da.Fill(ds);

            if (ds.Tables[0].Rows.Count > 0)

            {

                MemoryStream ms = new MemoryStream((byte[])ds.Tables[0].Rows[0]["savepic"]);

                pictureBox1.Image = new Bitmap(ms);

            }

        }

        private void PictureBox2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}