PDA

View Full Version : سوال: نحوه لود عکس در سی شارپ ودرج در جدول چگونه است؟



samser
چهارشنبه 20 دی 1391, 16:20 عصر
بازم سلام دوستان

من میخوام عکس های پروژه مو تو پیکچر باکس لود کنم و بعدش عکس پیکچر باکسمو تو بانک دخیره کنم...ممنون میشم راهنمایی کنید...
(عکس فرم رو ضمیمه کردم).98124

khokhan
چهارشنبه 20 دی 1391, 16:54 عصر
void openFile()
{
try
{

OpenFileDialog dlgOpen = new OpenFileDialog();
dlgOpen.Filter =
"Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF";
dlgOpen.Title = "انتخاب تصویر";
if (dlgOpen.ShowDialog() == DialogResult.OK)
{
Bitmap image = new Bitmap(dlgOpen.FileName);
Bitmap result = new Bitmap(145, 145);
using (Graphics g = Graphics.FromImage((Image)result))
g.DrawImage(image, 0, 0, 145, 145);
image.Dispose();
pictureBox1.Image = result;
button3.Visible = false;
}
}
catch (SystemException ex)
{
MessageBox.Show(ex.Message);
}
}

khokhan
چهارشنبه 20 دی 1391, 17:01 عصر
اینم واسه ذخیره


MemoryStream ms = new MemoryStream();
try
{
pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);

}
catch { }
byte[] arrPic = ms.GetBuffer();
ms.Close();
OleDbCommand ocm = new OleDbCommand();

ocm.CommandText = "insert into student (name,family,ncode,faname,bdate,bplace,phone,adres s,photo) values (@name,@family,@ncode,@faname,@bdate,@bplace,@phon e,@adress,@photo)";
ocm.Parameters.Clear();
ocm.Parameters.AddWithValue("@name", textBox1.Text);
ocm.Parameters.AddWithValue("@family", textBox2.Text);
ocm.Parameters.AddWithValue("@ncode", textBox3.Text);
ocm.Parameters.AddWithValue("@faname", textBox4.Text);
ocm.Parameters.AddWithValue("@bdate", textBox5.Text);
ocm.Parameters.AddWithValue("@bplace", textBox6.Text);
ocm.Parameters.AddWithValue("@phone", textBox7.Text);
ocm.Parameters.AddWithValue("@adress", textBox8.Text);
ocm.Parameters.Add("@photo", OleDbType.Binary).Value = arrPic;

ocm.Connection = null;
ocm.Connection = ocn;

ocn.Open();
ocm.ExecuteNonQuery();
ocn.Close();

ocm.Dispose();

MessageBox.Show("شخص مورد نظر با موفقیت اضافه شد", "Ok", MessageBoxButtons.OK, MessageBoxIcon.Information);

s_main fm = (s_main)Application.OpenForms["Main"];
fm.blEdit = true;
this.Close();

}

dt.Dispose();
oda.Dispose();
ocn.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}

samser
چهارشنبه 20 دی 1391, 19:52 عصر
ممنونم قسمت اول توضیحاتتون خواستمو برآورده کرد...راستش من تو برنامه م از کلاس زیر واسه درج اطلاعات تو جدول استفاده کردم...اگه میشه طبق کلاس زیر برام کد ذخیره رو بزارین...و اگه جسارت نیست یه کوچولو توضیح بدین مرسی....


using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace Can
{
class modul1
{
public static string connectionString =
"Data Source=sas;Initial Catalog=Canary;Integrated Security=True";
public static void SetData(string sqlStr)
{
SqlConnection mConnection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand(sqlStr, mConnection);
command.CommandType = CommandType.Text;
command.CommandText = sqlStr;
mConnection.Open();
try
{
command.ExecuteNonQuery();
}
catch (SqlException myerror)
{
MessageBox.Show("Error Conectin to Database:" + myerror.Message);

}
finally
{
mConnection.Close();
mConnection.Dispose();
}

}
public static DataTable GetData(string sqlCommand)
{
SqlConnection mConnection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand(sqlCommand, mConnection);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = command;
DataTable table = new DataTable();

try
{
adapter.Fill(table);
}
catch (SqlException myerror)
{
MessageBox.Show("Error Conectin to Database:" + myerror.Message);

}
finally
{

mConnection.Dispose();
}
return table;
}
}
}

khokhan
چهارشنبه 20 دی 1391, 21:51 عصر
سلام

اینطوری راه به جایی نمی بری

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

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

samser
چهارشنبه 20 دی 1391, 21:56 عصر
خب یه سوال من میتونم هم از این ماژول استفاده کنم هم از کد یعنی با هم....بعدش من بجز عکس کلی دیتای دیگه دارم واسه ذخیره اونا مشکلی ندارم با همین ماژول انجام میشه...
اسم جدولم employ هستش...و فیلد imagb فقط میخوام دستور درج رو جدا بنویسم واسه همین...ممنون میشم بازم لطف کنی بیشتر توضیح بدی تا همین جا هم ممنونم ازت...

khokhan
چهارشنبه 20 دی 1391, 22:12 عصر
اینطوری


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;
namespace WindowsFormsApplication5
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//private void up()
//{
OpenFileDialog open = new OpenFileDialog();
open.InitialDirectory = @":D\";
open.Filter = "Imagefile(*.jpeg;*.gif;*.bmp;)|*.jpeg;*.gif;*.bmp";
if (open.ShowDialog() == DialogResult.OK)
{
string imagename;
imagename = open.FileName;
Bitmap bmp = new Bitmap(imagename);
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Image = (Image)bmp;
private void up()
{
if (imagename != "")
{
FileStream fs = new FileStream(@imagename, FileMode.Open, FileAccess.Read);
byte[] picbyte = new byte[fs.Length];
fs.Read(picbyte, 0, System.Convert.ToInt32(fs.Length));
fs.Close();
SqlConnection con = new SqlConnection("Data Source=DOMMARAJ-70D924\\SQLEXPRESS;Initial Catalog=kiran;Integrated Security=True");
con.Open();
string querystring;
querystring = "insert into image(pic) values('"+picbyte+"')";
SqlCommand cmd = new SqlCommand(querystring, con);
SqlParameter img = new SqlParameter("@pic", SqlDbType.Image);
img.Value = picbyte;
cmd.Parameters.Add(img);
cmd.ExecuteNonQuery();
}
con.Close();
}
}
}


private void button2_Click(object sender, EventArgs e)
{
this.up();
}
}
}

khokhan
چهارشنبه 20 دی 1391, 22:20 عصر
یعنی چه ؟

اطلاعات دیگه با تصویر فرق می کنن عزیز هر چیزی رو نمی شه با یک متد عمل کرد

در کل اگه بخواهیم با تصویر کار کنیم 2 راه بیشتر نداریم

تصویر در جایی غیر از دیتابیس ذخیره می شه وما تو برنامه از طریق مسیر دادن احضارش می کنیم

راه دوم همونی که گفتم بصورت باینری واز طریق کانورت توی دیتابیس ذخیره می کنیم

samser
چهارشنبه 20 دی 1391, 22:27 عصر
خب همین متوجه هستم اما نمیدونم چه جوری بنویسم....ببین من میخوام عکس رو از پیک باکس بگیرم...و تو فیلد image دخیره کنم...جنس فیلدم از نوع image هستش...شما همین فرمی که ضمیمه کردم ببین با توجه به این و اسم جدولم که employ هست....خب اینجوری من باید متغیرهای زیادی رو جنریت کنم...که کل سیستمم بهم میخوره...

khokhan
چهارشنبه 20 دی 1391, 22:39 عصر
مشکلی نیست:لبخند:
شما می تونین در کنار اطلاعاتی که می خواین تو دیتابیس ذخیره کنین عکس رو هم هم زمان ارسال کنین منتها با یه متد خاص

لازم نیست تمام برنامه رو به هم بریزین

اینطوری


MemoryStream ms = new MemoryStream();
try
{
pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);

}
catch { }
byte[] arrPic = ms.GetBuffer();
ms.Close();
OleDbCommand ocm = new OleDbCommand();

ocm.CommandText = "insert into student (name,family,ncode,faname,bdate,bplace,phone,adres s,photo) values (@name,@family,@ncode,@faname,@bdate,@bplace,@phon e,@adress,@photo)";
ocm.Parameters.Clear();
ocm.Parameters.AddWithValue("@name", textBox1.Text);
ocm.Parameters.AddWithValue("@family", textBox2.Text);
ocm.Parameters.AddWithValue("@ncode", textBox3.Text);
ocm.Parameters.AddWithValue("@faname", textBox4.Text);
ocm.Parameters.AddWithValue("@bdate", textBox5.Text);
ocm.Parameters.AddWithValue("@bplace", textBox6.Text);
ocm.Parameters.AddWithValue("@phone", textBox7.Text);
ocm.Parameters.AddWithValue("@adress", textBox8.Text);
ocm.Parameters.Add("@photo", OleDbType.Binary).Value = arrPic;

ocm.Connection = null;
ocm.Connection = ocn;

khokhan
چهارشنبه 20 دی 1391, 22:50 عصر
در رویداد کلیک باتن سیو بنویسن :


private void buttonSave_Click(object sender, EventArgs e)
{
//get image:
Image img = Image.FromFile(fileName);
//get byte array from image:
byte[] byteImg = ImageToByteArray(img);
//here do the insertion into dataBase!
//but remember, your field in DB must be type to byte array
//example:
using (SqlConnection sqlConn = new SqlConnection("connString"))
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = @"INSERT INTO MyTable VALUES (@id, @image, @name)";
cmd.Connection = sqlConn;
sqlConn.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}


پائینش هم یه استریم به این شکل تعریف کنین



public byte[] ImageToByteArray(Image img)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.ToArray();
}

البته یادتون نره

using System.IO;

samser
چهارشنبه 20 دی 1391, 23:08 عصر
ممنون دوست من ...من به نتیجه نرسیدم...لطف کردی که کمک کردی...واسه لود عکس مشکل حل شد واسه درج نه...شما کد جدول student یه پروژه رو واسم آپ کردی اما من فقط گفتم عکس پیک باکس و فیلد ایمج در جدول ایمپلوی...

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

khokhan
چهارشنبه 20 دی 1391, 23:41 عصر
اینم یه نمونه

samser
چهارشنبه 20 دی 1391, 23:51 عصر
ممونم الآن خسته م فردا چک میکنم کامنت میذارم متشکرم از لطفتون...