PDA

View Full Version : سوال: نمایش تصویری که به صورت باینری در دیتابیس ذخیره شده و نمایش ان در پیکچرباکس در ویندوز فرم



maryam65
دوشنبه 05 آبان 1393, 11:18 صبح
من تصویری را به صورت باینری ذخیره نمودم و می خوام تصویر را از دیتابیس بخوانم و دریک پیکچر باکس نمایش دهم ،حال سوالی که هست این است من کدم خطای زیر را می دهد
و نوع تصویر در دیتابیس varbinary max می باشد
کد اینه :
private static byte[] GetImage()
{
byte[] result = null;


const string query = "SELECT Pic FROM Ctb WHERE NationalCodeSh=@NCoSh";


using (SqlConnection conn = new SqlConnection("Data Source=(local);Initial Catalog=ِDatabasename;Integrated Security=true"))
{
SqlCommand cmd = new SqlCommand(query, conn);
// cmd.Parameters.AddWithValue("@NCoSh",);


conn.Open();


SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
result = (byte[])dr["Pic"];
//if(dr.Read())
//{


//}
}
return result;
}


private void button1_Click(object sender, EventArgs e)
{
byte[] result = GetImage();


MemoryStream stream = new MemoryStream(result, 172, result.Length - 172);


pictureBox1.Image = Image.FromStream(stream);
}



لطفا من را راهنمایی کنید که این مورد خواند از دیتابیس چه راه حلی دارد ، اکثر سایت ها روش ذخیره در یک فایل و خواندن از ان را گفتند که دیتابیس نگهدارنده رشته ای است که مسیر ذخیره سازی عکس را نشان می دهد ، اما من به دنبال نمایش تصویری هستم که دردیتابیس به صورت باینری ذخیره شده است.
ممنون

pedram.11
دوشنبه 05 آبان 1393, 12:34 عصر
سلام ببخشید شما ارور رو نفرمودید...
درضمن 172 برا چیه؟!

یونس ابراهیمی
دوشنبه 05 آبان 1393, 13:32 عصر
سلام
این آموزش (http://www.w3-farsi.com/%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D9%88-%D8%A8%D8%A7%D8%B2%DB%8C%D8%A7%D8%A8%DB%8C-%D8%B9%DA%A9%D8%B3-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3/)رو ببینید

jir_jir_jir
دوشنبه 05 آبان 1393, 13:58 عصر
کد زیر برای تبدیل تصویر به آرایه ای از بایت ها


1

2

byte[] b = System.IO.File.ReadAllBytes(openFileDialog1.FileNa me);







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


1
2
3
4
5
6
7
8

MySqlConnection Con = new MySqlConnection(myconstring);
string Query = "INSERT INTO tbl_image(Image) VALUES(@MyFile)";
MySqlCommand Com = new MySqlCommand(Query,Con);
Com.Parameters.AddWithValue("@MyFile", b);
Con.Open();
Com.ExecuteNonQuery();
Con.Close();








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


1
2
3
4
5
6
7
8
9
10
11
12
13

DataSet Ds = new DataSet();
MySqlConnection Con = new MySqlConnection(myconstring);
string Query = "SELECT Image FROM tbl_image";
MySqlDataAdapter Da = new MySqlDataAdapter(Query, Con);
Con.Open();
Da.SelectCommand.ExecuteNonQuery();
Con.Close();
Da.Fill(Ds, "tbl_image");
byte[] b = (byte[])Ds.Tables["tbl_image"].Rows[0]["Image"];
System.IO.MemoryStream ms = new System.IO.MemoryStream(b);
Image img = Image.FromStream(ms);
pictureBox1.Image = img;

maryam65
دوشنبه 05 آبان 1393, 14:57 عصر
زنده باشید ، ممنون از راهنمایی تک تک شما
172 رو تغییر داده بودم یادم رفته که تغییر رو برگردونم به این عدد ها هم شک کرده بودم

maryam65
دوشنبه 05 آبان 1393, 15:22 عصر
The conversion of the varchar value '5589632147' overflowed an int column.
این خطا رو داده وقتی راه حل اخر رو رفتم، من نوع دادم در دیتابیس varbinary max هست و می خوام تصویری را بازگرداندکه برابر با یک شماره @code باشد




DataSet Ds = new DataSet();
SqlConnection Con = new SqlConnection("Data Source=(local);Initial Catalog=DB ;Integrated Security=true");
string Query = "SELECT Pic FROM Ctb WHERE NationalCodeSh=1236547766";
SqlDataAdapter Da = new SqlDataAdapter(Query, Con);
Con.Open();
//da.Parameters.AddWithValue("@na", this.tbxnac.Text);
Da.SelectCommand.ExecuteNonQuery();
Con.Close();
Da.Fill(Ds, "Ctb");
byte[] b = (byte[])Ds.Tables["Ctb"].Rows[0]["Pic"];
System.IO.MemoryStream ms = new System.IO.MemoryStream(b);
Image img = Image.FromStream(ms);
pictureBox1.Image = img;
Con.Close();

mortezasar
دوشنبه 05 آبان 1393, 15:43 عصر
من اطلاعات کاربرم رو و عکسش رو از بانک میگیرم میریزم تو گرید ویو اما بعد اگه بخوام ویرایش کنم از این کد برای نمایش عکس استفاده می کنم کافیه یکم کد رو تغییر بدی

MemoryStream ms = new MemoryStream((byte[])gvper[8,gvper.CurrentRow.Index].Value);
pb.Image = Image.FromStream(ms);

maryam65
دوشنبه 05 آبان 1393, 16:27 عصر
دوستان دقت کنید که نوع داده ای که من در دیتابیس ذخیره نمودم Varbinary max هست و نه image این دو نوع با هم فرق دارن ، من تونستم باینری تصویر را ذخیره کنم اما نمی تونم ان را بخوانم و نمایش بدم، نوع image با varbinary max فرق داره

kh-emami
دوشنبه 05 آبان 1393, 21:37 عصر
من یه سوال دارم تو همین مورد هست اگه جواب بدین ممنون میشم البته میدونم مبتدیانه است ولی میپرسم......
فرض بگیرید این دوستمون نخواد عکس که نوعش باینری هست رو بفرسته یا بقولی عکس نداشته باشه اون وقت چه جوری میشه مقدار Null بفرستی تو دیتابیس ??????? byte[] b=null???????? یعنی تو فیلد عکس تو دیتابیسش مقدار باینری برا اونایی که عکس دارن و مقدار null برا اونایی که عکس ندارن................
امیدوارم منظورمو رسونده باشم.
با تشکر از دوستان.

jir_jir_jir
دوشنبه 05 آبان 1393, 22:59 عصر
کدی که من برای شما گذاشتن فیلد با فرمت blob باید باشه