PDA

View Full Version : مبتدی: مشکل در نمایش عکس



piter11
یک شنبه 30 آذر 1393, 21:01 عصر
من وقتی میخوام عکسی که در بانک به طورت باینری ذخیره کنم نمایش بدم داخل پیکچر باکس با ارور زیر مواجه میشم

Parameter is not valid.
اینم عکسش
126771
اینم کد واکشیم منمون میشم بگید مشکل از کجاست
com.CommandText = "select id,name,family,card,date,image from tblinformation Where name='" + u.name + "'";
// com2.CommandText = "select image from tblinformation Where name='" + u.name + "'";



con.Open();
SqlDataReader dr = com.ExecuteReader();
byte[] myarray = null;
if (dr.HasRows == true)
{
dr.Read();

myarray = (byte[])dr["image"];


label2.Text = u.name;

label8.Text = dr.GetValue(0).ToString(); //perseneli

label4.Text = dr.GetValue(2).ToString(); //family

label6.Text = dr.GetValue(3).ToString(); //card
label10.Text = dr.GetValue(4).ToString(); // date






}
dr.Close();
System.IO.MemoryStream mymemory = new System.IO.MemoryStream(myarray);
pictureBox2.Image = Image.FromStream(mymemory);
com.ExecuteNonQuery();
con.Close();

حسین.کاظمی
سه شنبه 02 دی 1393, 09:58 صبح
سلام
دوست عزیز از متد زیر استفاده کن ببین درست میشه

private void pic_reader()
{
try
{
OleDbConnection con = new OleDbConnection(ConnectionString);
con.Open();
OleDbCommand com = new OleDbCommand("select PIC from tbl_info_personel where KodPersonel= @id_per", con);
com.Parameters.AddWithValue("@id_per", this.dataGridView1.CurrentRow.Cells[0].Value);
byte[] myarray = null;
OleDbDataReader DataR = com.ExecuteReader();
if (DataR.HasRows)
{
while (DataR.Read())
{
myarray = (byte[])DataR["PIC"];
}
}
DataR.Close();
System.IO.MemoryStream mymemory = new MemoryStream(myarray);
this.pictureBox1.Image = Image.FromStream(mymemory);
com.ExecuteNonQuery();
con.Close();



}
catch
{
this.pictureBox1.Image = null;
}
}

piter11
سه شنبه 02 دی 1393, 17:17 عصر
نه متاسفانه میره رو حالت نال

حسین.کاظمی
سه شنبه 02 دی 1393, 17:26 عصر
نوع فیلد عکست توی بانک چی هست؟؟؟؟
بعدش شما میخایید بعد از عملیات ذخیره بلافاصله عکس رو نشون بده؟؟

piter11
سه شنبه 02 دی 1393, 17:43 عصر
نوع فیلد عکست توی بانک چی هست؟؟؟؟
بعدش شما میخایید بعد از عملیات ذخیره بلافاصله عکس رو نشون بده؟؟

نوعکش image میخوام آره توی یک picturebox نشونش بده ذخیره میشه ولی نمایش نمیده

حسین.کاظمی
سه شنبه 02 دی 1393, 18:14 عصر
دوست عزیز تو شرطت بجای رشته از نوع عددی استفاده کن
مثل کد پرسنلی

piter11
چهارشنبه 03 دی 1393, 01:14 صبح
من این کارو کردم اول جواب داد ولی دیگه دوباره همون ارور لعنتی میاد
پروژه آماده که کار کنه کسی داره

Share & Learn
چهارشنبه 03 دی 1393, 03:31 صبح
سلام
این کد تست شده و کار می کنه، اگر کار نکرد حتما مشکل از جای دیگه هست و نیازه جزئیات بیشتری در مورد بانک و کدتون در اختیارمون بذارید:


con.Open();
SqlCommand cmd = new SqlCommand("select id,name,family,card,date,image from tblinformation Where name=@name", con);
cmd.Parameters.AddWithValue("@name", u.name);

byte[] imageArray = null;

SqlDataReader dr = cmd.ExecuteReader();

if (dr.HasRows)
{
while (dr.Read())
{
imageArray = (byte[])dr["image"];
}
}
dr.Close();
System.IO.MemoryStream mymemory = new System.IO.MemoryStream(imageArray);
pictureBox2.Image = Image.FromStream(mymemory);
con.Close();

piter11
چهارشنبه 03 دی 1393, 20:51 عصر
تغییری نمیکنه اصلا

حسین.کاظمی
چهارشنبه 03 دی 1393, 21:03 عصر
سلام
دوست عزیز مگه مشکل شما حل نشد؟؟؟
خب نوع فیلد مربوط به ذخیره عکستو عوض کن ببین درست میشه؟؟؟

حسین.کاظمی
چهارشنبه 03 دی 1393, 21:16 عصر
این کد هم تست کن ببین

con.Open();
SqlCommand cmd = new SqlCommand("select id,name,family,card,date,image from tblinformation Where name=@name", con);
cmd.Parameters.AddWithValue("@name", u.name);

byte[] imageArray = null;

SqlDataReader dr = cmd.ExecuteReader();

if (dr.HasRows)
{
while (dr.Read())
{
imageArray = (byte[])dr["image"];
}
}
dr.Close();
System.IO.MemoryStream mymemory = new System.IO.MemoryStream(imageArray);
pictureBox2.Image = Image.FromStream(mymemory);
cmd.ExecuteNonQuery();
con.Close();

reza9025
چهارشنبه 03 دی 1393, 23:52 عصر
سلام.مهندس از اونجایی که گفته Parameter مشکل داره.
بنظر من چون Image.FromStream بارامتر از نوع System.IO.Stream میگیره و شما به اون System.IO.MemoryStream باس دادید به همین دلیل این خطا رو میگیره. دو خط کد زیر رو ویرایش کن:



System.IO.MemoryStream mymemory = new System.IO.MemoryStream(imageArray);

pictureBox2.Image = Image.FromStream(mymemory);



تغییر بده به این کد:



System.IO.MemoryStream mymemory = new System.IO.MemoryStream(imageArray);
System.IO.Stream St = mymemory;
pictureBox2.Image = Image.FromStream(St);


نتیجه رو اعلام کن. یا اگه خطا داد تصویر خطا رو بزار...

piter11
پنج شنبه 04 دی 1393, 19:43 عصر
دوباره همون ارور پارامتر میده اینو واقعا اعصابمو خرد کرد بیخیالش شدم میخوام عکس رو داخل پوشه ویندوز ذخیره کنم و آدرس عکسشو تو فیلد ذخیره کنم موقع واکشی هم اشاره به آدرس عکس کنم میتونید راهنمایی کنید با سپاس

mojtabamalaekeh
پنج شنبه 04 دی 1393, 21:53 عصر
دوباره همون ارور پارامتر میده اینو واقعا اعصابمو خرد کرد بیخیالش شدم میخوام عکس رو داخل پوشه ویندوز ذخیره کنم و آدرس عکسشو تو فیلد ذخیره کنم موقع واکشی هم اشاره به آدرس عکس کنم میتونید راهنمایی کنید با سپاس

من با نوع داده varbinary و image امتحان کردم هیچ مشکلی نیست جز اینکه زمان بارگذاری یه عکس کوچولو بالا بود: 500ms البته سخت افزار من هم کنده.
درمورد ذخیره آدرس توی بانک و بارگذاری عکس از روی هارد هم میتونیم راهنماییت کنیم اما برا حل این مسئله من یه سؤال دارم:
مطمئنی اون رکوردی که میخونی فیلد عکسش درست ذخیره شده؟ (با چه کدی ذخیره کردی؟)
من یه آرایه با مقادیر الکی خواستم load کنم دقیقا همین پیغام خطایی که عکس گذاشتی رو میده!

if (dr.Read())
{
TName.Text = dr["fName"].ToString();
//System.IO.MemoryStream ms = new System.IO.MemoryStream((byte[])dr["fImage"]);
System.IO.MemoryStream ms = new System.IO.MemoryStream(new byte[] { 200, 100 });
PBImage.Image = Image.FromStream(ms);//an error like your error occurred here
}

حسین.کاظمی
پنج شنبه 04 دی 1393, 23:01 عصر
سلام
اگه بخایی از طریق آدرس عکسو نشون بدی باید آدرس عکس ثابت باشه و اگه در آینده بخایی برنامه اتو تحت شبکه اجرا کنی باید بشینی دوباره هرچندتا عکس داری را دوباره آدرسشو ذخیره کنی در کل درد سر داره ولی نحوه اش به شکل زیر است
فرم اول برای انتخاب عکس و ذخیره آدرس آن در بانک
مثلا یک پیکچر باکس داری بهمراه یک دکمه برای بارگذاری عکس
خوب بعد از اینکه عکستو باز کردی باید آدرسشو توی یک تکست باکسی،لیبلی،متغیری و.. بریزی تا بتونی اونو درون بانک اطلاعاتیت ذخیره کنی
پس اولین قدمت تعریف یک متغییر از نوع string
string AddressImage_Personel;



خب بعدش برای بدست آوردن آدرس عکس میتونی کدهای زیر را برای دکمه بارگذاری عکس بنویسی
System.Windows.Forms.OpenFileDialog open = new System.Windows.Forms.OpenFileDialog();
open.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF";
open.Title = "انتخاب عکس مخاطب";
open.InitialDirectory = Application.StartupPath + "\\Pictuer";
if (open.ShowDialog() == DialogResult.OK)
{
AddressImage_Personel = open.FileName;
picpersonel.Image = Image.FromFile(open.FileName);
picpersonel.Load(open.FileName);
img = Image.FromFile(open.FileName);

خب الان میتونی اون متغییر(آدرس عکس انتخاب شده) را با استفاده از دستور insert درون بانک اطلاعاتیت ذخیره کنی

فرم دوم برای نمایش عکس (ابزارهای این فرم دیتا گرید،پیکچرباکس)
خب الان نوبت بازخوانی از بانک و نمایش عکس میرسه که میتونی از کدهای زیر استفاده کنی
البته من یه متد private در فرمم ساختم و با استفاده از دیتا گرید اون عکس مربوط به هر شخصی را با کلیک بر سطر دیتا گرید به نمایش در میارم


private void Pic_Per()
{
pictureBox1.ImageLocation = dataGridView1.CurrentRow.Cells[].Value.ToString();
}




موفق باشی

piter11
جمعه 05 دی 1393, 00:03 صبح
این دو تا چین؟ کجا باید تعریفش کرد
picpersonel
img
در اینجا
img = Image.FromFile(open.FileName);

حسین.کاظمی
جمعه 05 دی 1393, 00:17 صبح
آخ شرمندم
بهمراه همون متغییر string اینم تعریف کن

picpersonelهم اسم پیکچر باکس عکس است
Image img;

piter11
جمعه 05 دی 1393, 00:44 صبح
picpersonel.Image = Image.FromFile(open.FileName);
این هم picpersonel بگید از کجا اومد مرسی

حسین.کاظمی
جمعه 05 دی 1393, 00:51 صبح
عزیز picpersonel اسم کنترل pictureBox ام است

piter11
جمعه 05 دی 1393, 01:44 صبح
خیلی ممنون فقط یه سوال دیگه من بخوام از واکشی انجام بدم آدرسو عکسو نمایشش بدم فقط تو یک پیکچرباکس به چه صورت میشه؟ من کدی که نوشتم اینجوریه واسه سلکتش ولی اون قسمت picturebox.imagelocation=dr.getvalue(5).tostring() ;
مشکل داره
SqlConnection con = new SqlConnection();
con.ConnectionString = WindowsFormsApplication1.Properties.Settings.Defau lt.con;

SqlCommand cmd = new SqlCommand("select id,name,family,card,date,image from tblinformation Where name='"+u.name+"'", con);

con.Open();
SqlDataReader dr = cmd.ExecuteReader();

if (dr.HasRows)
{
while (dr.Read())
{

pictureBox2.ImageLocation = dr.GetValue(5).ToString();
label2.Text = u.name;
textBox1.Text = dr.GetValue(0).ToString();
label8.Text = dr.GetValue(0).ToString(); //perseneli

label4.Text = dr.GetValue(2).ToString(); //family

label6.Text = dr.GetValue(3).ToString(); //card
label10.Text = dr.GetValue(4).ToString(); // date
}
}

dr.Close();

con.Close();

حسین.کاظمی
جمعه 05 دی 1393, 02:17 صبح
سلام این کدتو اصلاح کن (قرمز رنگ) دوتا اندیس 0 داری
SqlConnection con = new SqlConnection();
con.ConnectionString = WindowsFormsApplication1.Properties.Settings.Defau lt.con;

SqlCommand cmd = new SqlCommand("select id,name,family,card,date,image from tblinformation Where name='"+u.name+"'", con);

con.Open();
SqlDataReader dr = cmd.ExecuteReader();

if (dr.HasRows)
{
while (dr.Read())
{

pictureBox2.ImageLocation = dr.GetValue(5).ToString();
label2.Text = u.name;
textBox1.Text = dr.GetValue(0).ToString();

label8.Text = dr.GetValue(0).ToString(); //perseneli


label4.Text = dr.GetValue(2).ToString(); //family

label6.Text = dr.GetValue(3).ToString(); //card
label10.Text = dr.GetValue(4).ToString(); // date
}
}

dr.Close();

con.Close();

piter11
جمعه 05 دی 1393, 08:54 صبح
سوالی داشتم نوع فیلد عکس رو باید در بانگ چی بزاری؟ من nvarchar گذاشتم بعدش این آدرس ذخیره میشه تو فیلد برای هر عکسی System.Drawing.Bitmap این آدرس نباید باشه ! چی کار باید کنم دقیقا

.................................................. ..
کد باز کردن عکس رو به شکل زیر ساده تغییرش دادم
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF";
open.Title = "انتخاب عکس مخاطب";
if (open.ShowDialog() == DialogResult.OK)
{
pictureBox1.ImageLocation = open.FileName;
textBox1.Text = pictureBox1.ImageLocation;


}
مسیر عکس درست نشون میده ولی موقع اجرا تو
com.exutenonquery() این پیغام میده
String or binary data would be truncated.
The statement has been terminated.
.................................................. .
این مشکلمم حل شد بخاطر طول زیاد عکس بود دیگه زدم رو ntext واسه محکم کاری :لبخند:

mojtabamalaekeh
جمعه 05 دی 1393, 19:08 عصر
این مشکلمم حل شد بخاطر طول زیاد عکس بود دیگه زدم رو ntext واسه محکم کاری :لبخند:

وقتی طول رشته مشخص نیست و میخواین از حداکثر امکانات ذخیره سازی استفاده کنید باید از نوع داده (nvarchar(MAX استفاده کنید.
نوع داده ntext قرار بوده از SQL Server حذف بشه. بعضی عملگرها و توابع کار با رشته هم روش قابل اعمال نیستن.