PDA

View Full Version : سوال: بهترین روش برای انتخاب فیلد عکس در دیتابیس چیه؟



vahidth
پنج شنبه 16 آذر 1391, 09:00 صبح
سلام دوستان
من میخوام یه پروژه عکس ایجاد کنم به نظر شما فیلد عکس رو در دیتابیس از چه نوعی قرار بدم
من یک فیلد برای عکس و یک فیلد هم برای نام یک فیلد برای نام خانوادگی و یک فیلد هم برای ای دی در نظر گرفتم
و دوتا دکمه رو فرم گذاشتم یکی بنام Browse و یکی بنام insert کد دکمه Browse رو اینجوری نوشتم
این از کد Browse
string s = Environment.CurrentDirectory;
string strbk;
openFileDialog1.Filter = "JPEG (*.JPG) | *.jpg|" + "Bitmap Files (*.bmp) | *.bmp";

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strbk = openFileDialog1.FileName;
pictureBox1.Image = System.Drawing.Bitmap.FromFile(strbk);
}

Environment.CurrentDirectory = s;




اینم از کد Insert
try
{


DialogResult result;

result = MessageBox.Show(" آيا عکس انتخاب شده را ثبت مي کنيد؟ ", "ذخيره عکس", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

if (result == DialogResult.Yes)
{
FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
byte[] ar = new byte[fs.Length];
fs.Read(ar, 0, (int)fs.Length);
fs.Close();

string comstr_update = @"INSERT INTO Table1 (Id,name,family,pic) VALUES (@Id,@Name,@Family,@pic)";


cnn.Open();

SqlCommand cmd1 = new SqlCommand(comstr_update, cnn);


cmd1.Parameters.AddWithValue("@Id", textBox1.Text);
cmd1.Parameters.AddWithValue("@name", textBox2.Text);
cmd1.Parameters.AddWithValue("@family", textBox3.Text);
cmd1.Parameters.AddWithValue("@pic", ar);

cmd1.ExecuteNonQuery();

Form1_Load(null, null);

cnn.Close();



}

}
catch (Exception)
{
MessageBox.Show(" هيچ عکسي انتخاب نشده ", "پيغام", MessageBoxButtons.OK, MessageBoxIcon.Stop);

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

Mahmoud.Afrad
پنج شنبه 16 آذر 1391, 09:25 صبح
ذخیره مشکلی نداره. دستور سلکتی که دیتاگرید رو پر میکنی(در فرم لود) باید تغییر بدی و فقط فیلدهایی که نیاز داری رو سلکت کنی.
یعنی :

select id,name,family from [TableName]

در رویداد مناسب از دیتاگرید ، id سطر انتخابی رو به دست بیار و عکسو از دیتابیس سلکت کن و بریز داخل پیکچرباکس.


راه دیگه که نیازی به سلکت مجدد از دیتابیس نداره اینه که در لود فرم بعد از بایند اطلاعات به گرید، ستون pic رو مخفی کنی و در رویداد مناسب از گرید ، فیلد pic از سطر انتخابی رو به پیکچرباکس نسبت بدی.

private void Form1_Load(object sender, EventArgs e)
{
// ...

dataGridView1.Columns["pic"].Visible = false;
}


private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
Stream stream = new MemoryStream(dataGridView1.Rows[e.RowIndex].Cells["pic"].Value as byte[]);
pictureBox1.Image = Image.FromStream(stream);
}

vahidth
پنج شنبه 16 آذر 1391, 10:04 صبح
داداش کد شما رو به این شکل تغییر دادم و در ست هم شد ولی من میخوام فیلد عکس هم در دیتا گرید بیاد ولی بصورت یه کدی چیزی بنویسه
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
textBox1.Text = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
textBox2.Text = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();
textBox3.Text = dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString();
Stream stream = new MemoryStream(dataGridView1.Rows[e.RowIndex].Cells["pic"].Value as byte[]);
pictureBox1.Image = Image.FromStream(stream);
}
دستور فرم لود رو هم اینجوری نوشتم
private void Form1_Load(object sender, EventArgs e)
{


string str = @"select * from Table1";

da = new SqlDataAdapter(str, cnn);

ds = new DataSet();

da.Fill(ds, "Table1");

dv = new DataView(ds.Tables["Table1"]);

dataGridView1.DataSource = dv;
dataGridView1.AutoGenerateColumns = true;

dataGridView1.Columns["pic"].Visible = false;

}

برنامه اجرا میشه ولی یه مشکل داره
این عکس رو ببینید
96153

96148

ordebehesht
پنج شنبه 16 آذر 1391, 10:57 صبح
دوست من در مورد فیلد اونطوری که خود ماکروسافت گفته فرمت varbinarry(max) انتخواب کنین چرا که image و قرار حذف کنه یه سرچ یزنی میتونی پیدا کنی نحوه کار باهاشو

vahidth
پنج شنبه 16 آذر 1391, 11:05 صبح
دوست من در مورد فیلد اونطوری که خود ماکروسافت گفته فرمت varbinarry(max) انتخواب کنین چرا که image و قرار حذف کنه یه سرچ یزنی میتونی پیدا کنی نحوه کار باهاشو
مرسی داداش اگه از فیلد varbinarry max استفاده کنم مشکلی پیش میاد یعنی باید کد ها رو عوض کنم؟

vahidth
پنج شنبه 16 آذر 1391, 11:36 صبح
داداش کد شما رو به این شکل تغییر دادم و در ست هم شد ولی من میخوام فیلد عکس هم در دیتا گرید بیاد ولی بصورت یه کدی چیزی بنویسه
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
textBox1.Text = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
textBox2.Text = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();
textBox3.Text = dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString();
Stream stream = new MemoryStream(dataGridView1.Rows[e.RowIndex].Cells["pic"].Value as byte[]);
pictureBox1.Image = Image.FromStream(stream);
}
دستور فرم لود رو هم اینجوری نوشتم
private void Form1_Load(object sender, EventArgs e)
{


string str = @"select * from Table1";

da = new SqlDataAdapter(str, cnn);

ds = new DataSet();

da.Fill(ds, "Table1");

dv = new DataView(ds.Tables["Table1"]);

dataGridView1.DataSource = dv;
dataGridView1.AutoGenerateColumns = true;

dataGridView1.Columns["pic"].Visible = false;

}

برنامه اجرا میشه ولی یه مشکل داره
این عکس رو ببینید
96153

96148
یعنی کسی نمیدونه مشکل من از کجاست؟...

mhq1368
پنج شنبه 16 آذر 1391, 12:31 عصر
دوست عزیز باید فیلد عکستون رو از نوع varbinary(max)بزارین

در ضمن این خطایی هم که میگیره میگه که یه دیتابیس با همین نام وجود داره


96154

zarrinnegar
پنج شنبه 16 آذر 1391, 12:33 عصر
یعنی چی در گرید بیاد و یه کدی چیزی بنویسه؟
چی بنویسه؟
اسم فایل رو بنویسه بجای عکس ؟

mhq1368
پنج شنبه 16 آذر 1391, 16:55 عصر
اینم پروژه ولی مثل قبل بلید تغییرات روش انجام بدین

96169


string strSQL;
//نام جدول رو براساس پروژتون تغییر بدین
strSQL = "SELECT * FROM tblpic ";
da = new SqlDataAdapter(strSQL, cnn);
ds = new DataSet();
//نام جدول رو براساس پروژتون تغییر بدین
da.Fill(ds, "tblpic");
//نام جدول و نام فیلد رو براساس پروژتون تغییر بدین
byte[] arrPic = (byte[])(ds.Tables["tblpic"].Rows[0]["picbin"]);
MemoryStream ms = new MemoryStream(arrPic);
pictureBox1.Image = Image.FromStream(ms);
این کد رو تو رویداد موس سلول کلیک قرار بدین

vahidth
پنج شنبه 16 آذر 1391, 17:08 عصر
داداش کد ها رو اینجا میزارم
کد ذخیره در بانک
try
{
string strSQL;
strSQL = @"INSERT INTO afrad (Id,name,family,pic) VALUES (@Id,@Name,@Family,@pic)";
MemoryStream ms = new MemoryStream();
byte[] arrPic = null;
pb1.Image.Save(ms, pb1.Image.RawFormat);
arrPic = ms.GetBuffer();
ms.Close();

SqlCommand com = new SqlCommand(strSQL, cnn);
cnn.Open();
com.Parameters.Add("@pic", SqlDbType.VarBinary).Value = arrPic;
com.Parameters.Add("@id", Int32.Parse(textBox1.Text));
com.Parameters.Add("@name", textBox2.Text);
com.Parameters.Add("@family", textBox3.Text);
com.ExecuteNonQuery();
cnn.Close();
Form1_Load(null, null);
}

catch (SqlException ex)
{
if (ex.Number == 2627)//درصورتی که کد کالا تکراری بود
{
MessageBox.Show(" این کد قبلا ثبت شده ", "ثبت اطلاعات");
textBox1.Focus();
}
}
finally
{
if (cnn.State != ConnectionState.Closed)
{
cnn.Close();
}
}

اما یه مشکلی که هست اینه که وقتی من عکس وارد نمیکنم و فقط فیلد ای دی رو وارد میکنم ارور میده
در ضمن فیلد ای دی من از نوع primery است
96170
داداش کد ویرایش و جستجو و حذف رو چطوری بنویسم

mhq1368
پنج شنبه 16 آذر 1391, 17:23 عصر
باید عکس رو هم وارد کنید حالا کد مربوط به نمایش عکس رو از تاپیک شماره 10 استفاده کنید

vahidth
پنج شنبه 16 آذر 1391, 18:40 عصر
داداش من میخوام فقط اطلاعات تکست باکس رو در دیتا گرید بریزم و بعضی موقعه ها هم عکس رو اپلود کنم این کد رو چه جوری بنویسم

vahidth
پنج شنبه 16 آذر 1391, 20:00 عصر
کسی نیست منو کمک کنه
وقتی یع عکس رو وارد نمیکنم ارور میده
من میخوام گاهی اوقات با عکس و گاهی اوقات بدون عکس در دیتابیس ذخیره بشه

mhq1368
پنج شنبه 16 آذر 1391, 20:03 عصر
ببین دوست عزیز

شما اگه میخواین عکس رو فراخونی کنید توی pictuerbox باید همون کد پست 10 رو درون رویداد cellmouseclick گرید بریزید

درمورد سوال دیگتون هم باید بگم که کد insert درست بود مشکلی نداشت

vahidth
پنج شنبه 16 آذر 1391, 20:16 عصر
کد رو در رویداد گرید وارد کردم ولی وقتی اطلاعات رو کلیک میکنم از دیتا گرید عکس ها نمیاد قبلا با این کد عکس ها می اومد
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
textBox1.Text = dataGridView1.Rows[e.RowIndex].Cells["id"].Value.ToString();
textBox2.Text = dataGridView1.Rows[e.RowIndex].Cells["name"].Value.ToString();
textBox3.Text = dataGridView1.Rows[e.RowIndex].Cells["family"].Value.ToString();

Stream stream = new MemoryStream(dataGridView1.Rows[e.RowIndex].Cells["pic"].Value as byte[]);
pictureBox1.Image = Image.FromStream(stream);
}

vahidth
پنج شنبه 16 آذر 1391, 20:51 عصر
چطوری میتونم کدی بنویسم اگه کاربر عکسی انتخاب نکرد یه عکس پیش فرض براش درج بشه؟

mhq1368
پنج شنبه 16 آذر 1391, 22:22 عصر
فایل های دیتابیس رو به sql اتچ کن


96191


فایل های دیتابیس
http://s2.picofile.com/file/7576413331/Projects.rar.html


در همین حد بلد بودم شرمنده اگه کمکت نکرد

vahidth
پنج شنبه 16 آذر 1391, 22:35 عصر
شما سرور ما هستی داداش دشمنت شرمنده نوکرتم
داداش دیتابیس رو به پروژه اضافه کنم

vahidth
پنج شنبه 16 آذر 1391, 22:50 عصر
نمیدونم چرا وقتی فایل ها رو اتچ میکنم ارور میده من اینجوری اتچ میکنم
کلیک راست روی پروژه و انتخاب و انتخاب add-existhing item و در اونجا گزینه دیتابیس رو انتخاب میکنم بعد از وارد کردن دیتابیس ارور میده

mhq1368
جمعه 17 آذر 1391, 13:11 عصر
نه دوست عزیز

من گفتم به خود sql نه به ویژوال استودیو

به این صورت

sql رو بازکنید بعداز لوگین روی دیتابیس راست کلیک کنید بعد اتچ رو بزنید