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

## hassan_kahrizy

بسمه تعالی
با سلام
می خواستم تصاویر مورد نظز کاربرم را وارد باانک اطلاعاتی بکنم به نظر شما از چه بانک اطلاعاتی استفاده کنم که بهروری بیشتر داشته باشه
آیا باید همه در یک بانک ذخیره بشه و یا می شه بانک های جدید نیز توسط برنامه ایجاد کرد
اگر سورسی در این زمینه داشته باشید ممنون می شم
با تشکر

----------


## dot_net_lover2

دوست عزیز ساختن جدول به ازای هر مجموعه کار غیر منتقی است ، بهتر است برای این کار به یک Design ایده آل برای یک جدول برسی.
واسه دخیره سازی عکس از کد زیر استفاده کن با این تفاوت که با Sql connection کار کنه ، چون همانطور که در تاپیک میبینی با ODBC مشکل داره
http://www.barnamenevis.org/sh...ad.php?t=26331

----------


## sinpin

> اگر درست منظورت را فهمیده باشم باید از پایگاه داده paradox استفاده کنی.


ببخشید ولی از کجا به ابن نتیجه رسیدید !
پاراداکس که expire شده دیگه

----------


## sinpin

> سلام
> 
> 1) تفاوت بانک OLE DB (SQL Provider) با بانکهایی که خود SQL Server میسازه؟
> 2) من میخوام از یه DB استفاده کنم که فقط Clientی باشه و با دستورات SQL کار کنه... آیا هست؟
> 
> ممنون میشم..


1- سئوال اول مبهمه ! اگه منظور نوع کانکشن است با توجه به جواب دوم از oledbconnection استفاده کنید
2- از access استفاده کنید

----------


## sinpin

*dim cmd as new sqlclient.slqcommand**(cmd.parameters.add("@serialnum",239*

----------


## sinpin

> یعنی میگین..
> برای استفاده از Access از دستورات SQL استفاده کنم؟؟.. مثلا دستورات واکشی و غیره شبیه اند؟


1- بله
2- دستورات واکشی ؟ اگه منظور دستورات select , ... باید بگم که بله و sql یعنی :  standard query language

----------


## Happy_davood

سلام
یه برنامه نوشتم که باید یک سری تصویر رو هم در بانک اطلاعاتی قرار بده . بانک هم از نوع MS Access هست . در طرف بانک فیلد تصویر رو از نوع OLE Object انتخاب کردم ولی وقتی می خوام پارامتر مربوط به این فیلد رو وارد Query کنم نمی دونم باید از چه نوعی باشه .

this.OleDB_Command.Parameters.Add("@Pic", System.Data.OleDb.OleDbType.?????);



ممنون از همه

----------


## Happy_davood

خوب این هم روش بدی نیست و البته بهتر هست که به جای آدرس تصویر اون رو داخل پوشه برنامه زد و با یه چیز دیگه مثلاً نام کاربری یا ID اون تصویر در بانک ذخیره کرد . در اینصورت تداخل بین اسامی هم رخ نمی ده .

ولی ار همه اینها گذشته این روش مناسب نیست . چون امکان پاک شدن تصاویر و یا مشاهده اون توسط سایر کاربران وجود داره . از طرفی من قرار هست بانک رو جابجا کنم و این اصلاً خوب نیست که در هر جابجایی علاوه بر فایل ام دی بی تصاویر رو هم جابجا کنم .
پس باید در همون بانک ذخیره کنم . الان اگه می تونید به مشکل من جواب بدید !

----------


## morteza_zeus

اگه عکس رو تو بانک ذخیره نکنی برای چاپ اون عکس با Crystal Report  هم مشکل پیدا میکنی

----------


## dot_net_lover2

من با OLE که کار کردم جواب نداد ولی SQL Connection و SQL DB کامل جواب داد با وجود اینکه در هر دو روش به یک شکل کد زده شده و فقط نوع Connection فرق داشته.

ولی اگر مقدور پیشنهاد میکنم که از SQL DB و SQL Connection استفاده کن.

----------


## Happy_davood

خوب ممنون از همه .
من نوع پارامتر رو VarBinary انتخاب کردم . تصویر رو هم بصورت آرایه ای از بایت اضافه کردم به پارامتر و جواب داد .

باز هم ممنونم .

----------


## hdv212

برای ذخیره ی عکس در دیتابیس باید اول عکستو از طریق برنامه به آرایه ای از بایت ببری، اینطوری :
//Define this Function for convert Image To byte array
protected  byte[] ReadBitmap2ByteArray(string fileName)
{
	using(Bitmap image = new Bitmap(fileName))
	{
		MemoryStream stream = new MemoryStream();
		image.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
		return stream.ToArray();
	}
}

بعد باید عمل Insert رو انجام بدی، اینطوری :

//Define this function for Save Image To Database
protected  void StoreBlob2DataBase(byte[] content)
{
	SqlConnection con = sqlConnection1;
	con.Open();
	try
	{
		// insert new entry into table
		SqlCommand insert = new SqlCommand(
			"insert into tableName (ImageField) values (@image)",con);
		SqlParameter imageParameter = 
			insert.Parameters.Add("@image", SqlDbType.Binary);
		imageParameter.Value = content;
		imageParameter.Size  = content.Length;
		insert.ExecuteNonQuery();		
	}
	finally
	{
		con.Close();
	}
}

موفق باشید

----------


## choobin84

> .
> .
> .
> بعد باید عمل Insert رو انجام بدی، اینطوری :
> 
> .
> .
> .
> موفق باشید


برای بازیابی چیکار باید کرد؟مثلا توی یه picBox  نشونش بده

----------


## hdv212

راههای زیادی وجود داره ولی اول باید برعکس عمل قبلی رو انجام بدی، یعنی از آرایه ای از بایت ببری به Image، اینطوری :

CurrencyManager cm =(CurrencyManager)BindingContext[dt];
	DataRowView drv = (DataRowView)	cm.Current;
	byte[] content = (byte[])drv["fieldName"];
	MemoryStream stream = new MemoryStream(content);
	Bitmap image = new Bitmap(stream);
	pictureBox1.Image = image;

دقت کن در خط اول، متغیر dt از نوع DataTable هست که دیتاگریدت بهش بایند شده.

----------


## poya011

کد مربوط به باز کردن عکس



> openFileDialog1.ShowDialog();
> textBox1.Text = openFileDialog1.FileName;
> pictureBox1.Image = Bitmap.FromFile(openFileDialog1.FileName);


کد مربوط به ذخیره در اکسس

MemoryStream s ;
s = newMemoryStream();
pictureBox1.Image.Save(s,System.Drawing.Imaging.ImageFormat.Bmp);
DataRow dr = ds.Tables[0].NewRow();
dr["name"] = "dskkdsjkdsj";
dr["pic"] = s.ToArray();
ds.Tables[0].Rows.Add(dr);
da.Update(ds);
 

کد مربوط به باز کردن عکس از پایگاه اکسس

object o = ds.Tables[0].Rows[0]["pic"];
MemoryStream s;
s = newMemoryStream( (byte[])(o));
pictureBox2.Image = Bitmap.FromStream(s);

هرکی مشکل داشت بگید تا رفع کنم با تشکر از استاد گلم آقای مرجوی

----------


## poya011

به در خواست دوستان برنامه را در سایت گذاشتم در ضمن در پاسخ به نوع نوع فیلد باید از نوع ole object باشد 
دانلود فایل 
http://www.savefile.com/files/770773
لطفا نظر هم بدین چون همینطوری این را کشف نکردم حداقل 2ماه کار کردم

----------


## choobin84

> سلام
> فیلد عکس در دیتابیس باید از چه نوع تعریف بشه


در SQL از نوع باینری و از نوع image  می توانید ذخیره کنید. در اکسس فکر می کنم از نوع OLEObject باشه

----------


## fakhredin

مرسی
آیا در SQL هم از همین روش باید استفاده کنم
اگه فرق می کنه لطفا یه مثال کوچولو بزارید

----------


## dot_net_lover2

string cnStr = "workstation id=ComputerName;packet size=4096;integrated security=SSPI;initial catalog=DBName;persist security info=False";
  SqlConnection  cn;

 
    MemoryStream ms = new MemoryStream();
    pictureBox1.Image.Save(ms,pictureBox1.Image.RawFor  mat);
    byte[] arrImage = ms.GetBuffer();
    ms.Close();
    
    cn = new SqlConnection(cnStr);
    SqlCommand command = new SqlCommand("INSERT Into pictures(pic) Values(@Picture)", cn);
    command.Parameters.Add(new SqlParameter("@Picture",SqlDbType.Image)).Value = arrImage;
    cn.Open();
    command.ExecuteNonQuery();
    cn.Close();

----------


## iranrose63

تایپ فیلدت رو از نوع(varbinary(MAX قرار بده برای ذخیره تصویر میتونی از کد زیر استفاده کنی 

if (picturefilename != "")
{
     FileStream stream = new FileStream(picturefilename, FileMode.Open, FileAccess.Read);
    BinaryReader reader = new BinaryReader(stream);
    byte[] photo = reader.ReadBytes((int)stream.Length);
    reader.Close();
    stream.Close();
    sqlCommand1.Parameters.Add("@picture", SqlDbType.VarBinary, photo.Length).Value = photo;
}
 else
    sqlCommand1.Parameters.Add("@picture", SqlDbType.VarBinary).Value = SqlBinary.Null;

و برای خواندن اطلاعات و نشون دادن اون تو یه picturebox از کد زیر :

sqlCommand1.CommandText = "select picture from table";
dr = sqlCommand1.ExecuteReader(CommandBehavior.Sequenti  alAccess);
if (dr.HasRows)
 {
    dr.Read();
   if (!dr.IsDBNull(0))
    {
         SqlBytes bytes = dr.GetSqlBytes(0);
         picturebox.Image = Image.FromStream(bytes.Stream);
    }
     else
          picturebox.Image = null;
}

----------


## hdv212

این کد رو میتونی در رویداد dataGridView_selectedindexChanged بنویسی :
DataTable dt = ds_GozareshParvande1.Tables["Gozaresh_Parvande"];

DataRow newrow = dt.Rows[dataGridView1.CurrentCell.RowIndex];
if (newrow["pic"] != System.DBNull.Value)
{
	byte[] content = (byte[])newrow["pic"];
	MemoryStream stream = new MemoryStream(content);
	Bitmap image = new Bitmap(stream);
	pictureBox_madadjoo.Image = image;
}
else
	pictureBox_madadjoo.Image = Image.FromFile("null.jpg");

----------


## smt_414

با سلام خدمت دوستان عزیز و تشکر مخصوص از دو دوست عزیزمون iranrose63 و hdv212
خود من برای ذخیره عکس در پایگاه داده و بازیابی اون و نمایش در یک pictureBox با کمک مطالب موجود در این تایپیک و صرف وقت چند ساعته تونستم این کار رو انجام بدم
و خواستم کد اون رو اینجا قرار بدم که دوستانی که مثله من تازه شروع به کار کردن و احتیاج به توضیحات تکمیلی و بالاخص کد کامل برنامه دارن بتونن از این مطلب استفاده کنن.
البته جا داره دوباره بر این موضوع تاکید داشته باشم که این کد برگرفته از مطالب دوستان در همین تایپیک می باشد و دوباره ازشون کماله تشکر رو دارم.  :تشویق: 
کد های بخش اضافه کردن عکس:
لازم به توضیح که برای تعیین نوع فیلد photo در پایگاه داده من هر دو نوع image و varbinary max
رو امتحان کردم و ظاهرا مثله هم جواب دادن
 using System;
using System.ComponentModel;
using System.Data;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
using System.Drawing;
namespace BlobSQLCETest
{
    public partial class Form1 : Form
    {
        private  System.Windows.Forms.PictureBox PictureBox1;
        public Form1() 
        {
            InitializeComponent();
        }
   
        private void AddEmployee(string photoFilePath, string connectionString)
        {
            byte[] photo = GetPhoto(photoFilePath);
            {
                SqlConnection objConnection = new SqlConnection("Data Source=taba;Initial Catalog=webdata;Integrated Security=True;");
                SqlCommand command = new SqlCommand("INSERT INTO Table2 (Photo) " + "Values(@Photo)", objConnection);
                command.Parameters.Add("@Photo", SqlDbType.Image, photo.Length).Value = photo;
                objConnection.Open();
                command.ExecuteNonQuery();
            }
        }
        private byte[] GetPhoto(string filePath)
        {
            FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            BinaryReader reader = new BinaryReader(stream);
            byte[] photo = reader.ReadBytes((int)stream.Length);
            reader.Close();
            stream.Close();
            return photo;
        }
        private void b_insert_Click(object sender, EventArgs e)
        {
            AddEmployee(@"C:\photo1.jpg", @"Data Source='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\webdata.mdf'");
        



کدهای بخش بازیابی و رویت عکس
    private void showphoto()
        {
            SqlConnection objConnection = new SqlConnection("Data Source=taba;Initial Catalog=webdata;Integrated Security=True;");   
            DataSet objDataSet = new DataSet();
            SqlDataAdapter objDataAdapter = new SqlDataAdapter();
            objDataAdapter.SelectCommand = new SqlCommand();
            objDataAdapter.SelectCommand.CommandText = "SELECT photo FROM Table2";
            objDataAdapter.SelectCommand.CommandType = CommandType.Text;
            objDataAdapter.SelectCommand.Connection = objConnection;
            objDataAdapter.Fill(objDataSet, "Table2");
            DataView objDataView = new DataView(objDataSet.Tables["Table2"]);
            objConnection.Open();
            byte[] arrPicture = ((byte[])(objDataSet.Tables[0].Rows[0][0] )); 
            MemoryStream ms = new MemoryStream(arrPicture);
            pictureBox1.Image = Image.FromStream(ms);
            PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
            PictureBox1.BorderStyle = BorderStyle.Fixed3D;
            PictureBox1.BringToFront();
        }                
        private void b_show_Click(object sender, EventArgs e)
        {
            showphoto();
        }

        
    }


امیدوارم این مطب برای دوستان مفید واقع شه.

----------


## alirzn

اینو ببین به دردت میخوره؟

----------


## iranrose63

> من میخوام که یه عکس تو اسکنر را از طریق برنامم اسکن کنم و تو بانک اطلاعاتی sql 
> ذخیره کنم


در مورد اسکن یه سر به لینک زیر بزن شاید بدردت بخوره 
http://www.codeproject.com/dotnet/wi...tingdotnet.asp

در مورد ذخیره عکس در db هم می تونی از لینک زیر استفاده کنی
https://barnamenevis.org/showthread.php?t=74432

----------


## moji_0282

فکر کنم بدرت بخوره البته من تست نکردم

----------


## FManStar

این هم لینک pdf آموزش. امیدوارم به درد بخوره
http://fmanstar.tripod.com/programing/saveImToDB.htm

----------


## dr_csharp

دوستان من میخوام Image رو تو SQL بصورت باینری ذخیره کنم بعد دوباره بخونمش و تو فرمم نشونش بدم . ممنون میشم راهنمایی کنید . ممنون میشم که یه راهکارم واسه ذخیره عکس وقتی زیاده بدین . منظور اینکه اصلا ذخیره تو DataBase درسته ؟ چون یه بحث دیگه ای که هست نمیخوام کاربری که داره از سیستم استفاده میکنه به عکسا دسترسی داشته باشه ( اینو گفتم که نگین مسیر عکس تو DB ذخیره کنم و خود عکسارو تو یه فلدر رو Hard )
ممنون  :لبخند:

----------


## programmable

در پست اول تاپیک زیر یک نمونه کد ذخیره در دیتابیس هست . هر چند این کد مربوط به وب اپلیکشن هست ولی روال ذخیره با ویندوز اپلیکیشن فرقی نمی کنه .

https://barnamenevis.org/showthread.php?t=64042

----------


## hassan razavi

در لینک زیر یک نمونه برنامه بسیار عالی با نامه "ذخیره و بازیابی عکس و چاپ آن " هست که تمام سوالاتون رو جواب میده :

https://barnamenevis.org/showth...t=64210&page=4

----------


## dr_csharp

سلام این تکه کد من وظیفش اینه که عکس را بصورت باینری تو SQL ذخیره کنه . ولی یه خطا میده :
خطا : string or binary data would be truncated



MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] arrImage = ms.GetBuffer();
ms.Close();
SqlConnection con=new SqlConnection("server=(local);trusted_connection=y  es;database=pubs;");
string strSQL = "INSERT INTO TBLImage (ID,Name,Picture) VALUES (@ID,@Name,@Picture)";
SqlCommand  cmd = new SqlCommand(strSQL, con);              
cmd.Parameters.Add(new SqlParameter("@Name", SqlDbType.Char, 50)).Value = textBox2.Text;
cmd.Parameters.Add(new SqlParameter("@Picture", SqlDbType.Binary)).Value = arrImage;
cmd.Parameters.Add(new SqlParameter("@ID", SqlDbType.Char, 50)).Value = textBox3.Text;
con.Open();
cmd.ExecuteNonQuery();
con.Close();

----------


## whitehat

ببینید لینک زیر کمکی می کنه
https://barnamenevis.org/showthread.php?t=63067

----------


## choobin84

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

----------


## seyedmostafa

در خط نهم برنامه تان باید از نوع varbinary استفاده کنید نه از نوع binary

----------


## hassan razavi

علی جان کدی رو که در لینک زیر نوشتم برا ذخیره و بازیابی هر نوع فایلی هست. (فایل رو بصورت باینری در بانک میریزه و می خونه) فقط کافیه هنگام بازیابی و ذخیره فایل بر روی هارد ، پسوند مورد نظر رو بهش بدید.
https://barnamenevis.org/showth...t=87164&page=2

----------


## alirzn

من هدفم اینه که عکس و فیلم رو فقط ادرسشون رو درون database ذخیره کنم. مثلا یک رکورد که مشخصات یک خانه است ممکنه چندین عکس و فیلم داشته باشه؟ حالا چطور میتونم از طریق برنامه این عکس ها و فیلم ها رو با picture viewer  ویندوز و windows media player همه رو با هم باز کنم؟


> علی جان کدی رو که در لینک زیر نوشتم برا ذخیره و بازیابی هر نوع فایلی هست. (فایل رو بصورت باینری در بانک میریزه و می خونه) فقط کافیه هنگام بازیابی و ذخیره فایل بر روی هارد ، پسوند مورد نظر رو بهش بدید.
> https://barnamenevis.org/showth...t=87164&page=2

----------


## beh_develop

دوست عزیز براتون یه نمونه برنامه کوچیک جهت Load  و Save کردن عکس به SQL Server رو ضمیمه کردم.  اول از همه در قسمت Load فرم Connection String رو ست کنین و نام جدولی که می خواین استفاده کنین در Query های این برنامه تنظیم کنین :

[attach]
13134
[/attach]

----------


## ibd_iran

در بانک اطلاعاتی یک فیلد از نوع OLE Object درست کردم که عکس در خود دخیره می کند 
برای این کار یک متغییر از نو ع  Object در C#‎ استفاده کرده ام بعد در موقع خودن این فیلد دچار مشکل هستم 
 
 pictureBox1.Image = ds.background    

background
متغییر از نوع Object است در این خط error می دهد 
برای convert به عکس از چه متدی باید استفاده کرد که این عکس را نمایش بده.
در background خود عکس دخیره است که از بانک خونده می شود

----------


## smt_414

سلام
اگه درست سوالتون رو متوجه شده باشم 
در مورد ذخیره عکس در پایگاه داده معمولا اون رو به بایت تبدیل می کنن و سپس ذخیرش میکنن
نوع فیلد رو Image و یا باینری می گیرن

کد ذخیره کردن 
         //تبدیل  عکس به بایت
            if (file_photo_patch != "")
            {
                Byte[] bytes = File.ReadAllBytes(@file_photo_patch);
                objCommand_information.Parameters.Add("@Photo", SqlDbType.Image).Value = bytes;
            }
            else
            {
                objCommand_information.Parameters.Add("@Photo", SqlDbType.Image).Value = DBNull.Value;
            }

و برای بازیابی اون و نمایش در یک picbox
       //نمایش عکس
        void show_photo()
        {
            if (datagridview1.CurrentRow.Cells[13].Value != DBNull.Value )
            {
                byte[] arrPicture = ((byte[])(this.datagridview1.CurrentRow.Cells[13].Value));
                MemoryStream ms = new MemoryStream(arrPicture);
                pictureBox1.Image = Image.FromStream(ms);
            }
        }


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

----------


## raminsalemi

:چشمک: با سلام دوست عزیز از کد زیر استفاده کن
CurrencyManager cm = (CurrencyManager)BindingContext[dt];
DataRowView drv = (DataRowView)cm.Current;
byte[] content = (byte[])drv["pimage"];
MemoryStream stream = newMemoryStream(content);
Bitmap image = new Bitmap(stream);
pictureBox1.Image = image;

----------


## raminsalemi

دوست عزیز برای ذخیره عکس در بانک با ید1-عکس با فرمت Bmpباشه 2- با یه کنترل openfiledialogeعکس روانتخاب کن و کد زیر رو برای ذخیرش بنویس البته این یک مثاله که من برای برنامه خودم نوشتم تو می تونی عوضش کنی :گیج: 
if (FullPath != null)
{



SqlConnection con = new SqlConnection("server=localhost;UID=sa;password=;database=pictur  e");
con.Open();

SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = @"insert into TableP values (@pimage)";


cmd.Parameters.Add(@"pimage", SqlDbType.Image, 1000000);
cmd.Prepare();
byte[] imageImageData = null;
byte[] imagebytes = null;
FileStream fs = newFileStream(FullPath, FileMode.Open, FileAccess.Read);
BinaryReader br = newBinaryReader(fs);
imagebytes = br.ReadBytes(Convert.ToInt32(fs.Length));
imageImageData = imagebytes;


cmd.Parameters[@"pimage"].Value = imagebytes;
cmd.ExecuteNonQuery();
con.Close();


}

----------


## Mrs.Net

چجوری میتونم تو یک کوئری تکستی اینکارو انجام بدم؟
byte[] imgs;
string query=string.format("insert into table1 (id, image) values ({0}, {1})",2,imgs);
اما این خطا میگیره :(

----------


## hosseini_87

می خوام عکسی رو  که از sql server جستجو کردم تو یه picture box نشون بدم. برای اینکار
کد زیر رو می نویسم   buffer1 = (byte[])(objdataset.Tables["tbl_caramuz"].Rows[objcm.Position]["pic"]);
 MemoryStream objstream = new MemoryStream(buffer1);
 PictureBox objbox =PictureBox1;
   objbox.Image = Image.FromStream(objstream);
   objbox = null;
   objstream.Close();
               اما error زیر رو میده
Unable to cast object of type ‘system.DBNull’ to type ‘system.Byte[]’

----------

