PDA

View Full Version : سوال: خواندن عکس از بانک اطلاعاتی



mirbehnam2
پنج شنبه 23 مرداد 1393, 13:43 عصر
با سلام خدمت تمام دوستان محترم
string command = @"select img from [Table] where id=6";
byte[] df=null;
SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\B eHnAM\Documents\hello.mdf;Integrated Security=True;Connect Timeout=30");
conn.Open();
SqlCommand sqlcmd = new SqlCommand(command, conn);
SqlDataReader reader = sqlcmd.ExecuteReader();
while (reader.Read())
{
df = (byte[])reader["img"];
}
reader.Close();
MemoryStream ms = new MemoryStream(df);
pictureBox2.Image = Image.FromStream(ms);
sqlcmd.ExecuteNonQuery();
conn.Close();

من با این کد تصویرو از بانک اطلاعاتیم می خونم
اما با این قسمتش مشکل دارم و نمی دونم چرا از حلقه while استفاده شده و چجوری به ارایه بایت تبدیل می کنه
لطفا یکی کامل نحوه عملکرد این قسمتو
while (reader.Read())
{
df = (byte[])reader["img"];
}
برام توضیح بده (کتابی توضیح بدید می خواهم کامل بدونم)
ممنون می شم

parvizwpf
پنج شنبه 23 مرداد 1393, 16:09 عصر
http://www.codeproject.com/Articles/25956/Sending-Receiving-PictureBox-Image-in-C-To-From-Mi

mirbehnam2
پنج شنبه 23 مرداد 1393, 16:40 عصر
ممنون از شما دوست من اما هدف من درک این تکه کد بود اگه می تونید منو روشن کنید ممنون

plus
پنج شنبه 23 مرداد 1393, 16:51 عصر
با توجه به Query و اینکه قراره یک رکورد انتخاب باشه نیازی به while نیست، حداکثر قراره یک رکورد انتخاب بشه بنابراین میتونید با شرط

if (reader.Read()) {
...
}

بجای while، از انتخاب شدن رکورد مورد نظر، قبل از دریافت داده از reader مطمئن بشین.
بخش داخل شرط، به این صورت هست که شی reader، که وظیفه اش خوندن داده های انتخاب شده هست، با استفاده از عملگر []، مقدار فیلد مورد نظر رو به صورت شی object برمیگردونه. بنابرین،

reader["img"]

مقدار فیلد img رو برمیگردونه ولی به صورت شی object.کاری که در این کد انجام شده این هست که به اصلاح مقدار برگردونده شده cast شده چونکه برای ایجاد شی عکس نیاز به آرایه ای از بایت هست (و در حقیقت هم داده های ما از نوع []byte هستن نه object).برای آشنایی با boxing،casting و unboxing میتونید به msdn یا کتاب های آموزشی #C مراجعه کنید.
http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx
http://msdn.microsoft.com/en-us/library/ms173105.aspx

mirbehnam2
پنج شنبه 23 مرداد 1393, 17:37 عصر
یعنی عکس به صورت ابجکت از بانک خارج می شه که ما به سیستم می گیم این ابجکت ارایه ای از بایت هاست ؟
کاربرد read چیه
چرا می گیم
if(reader.read())
تا حدودی با مباحثی که گفتید اشنا هستم

plus
پنج شنبه 23 مرداد 1393, 18:04 عصر
خیر، عکس بر اساس ساختار داده بانک در بانک ذخیره شده، واسطی که برای ارتباط NET. و بانک وجود داره، داده رو به نوع معادلش در #C تبدیل میکنه، ولی عملگر [] که مثل یک متد پیاده سازی میشه یک نوع خروجی بیشتر نمیتونه داشته باشه، بنابراین داده مورد نظر بوسیله این عملگر، توسط نوع object برگردونه میشه.اگه به صورت Generic پیاده سازی میشد احتمالا نیاز به این کار نبود.
شما میتونید با متد reader.GetFieldType نوع داده مورد نظر رو هم داشته باشید.علاوه بر اون datareader، متدهای دیگه ای رو برای دریافت داده داره میتونید بررسی کنید.مثلا بجای استفاده از عملگر [] میتونید از متد GetBytes برای دریافت داده ها به صورت []byte استفاده کنید...

علت بررسی ()reader.read این هست که، اولا برای دریافت یک رکورد از خروجی باید با استفاده از متد Read، عمل خوندن یک رکورد انجام بشه، ثانیا ممکنه هیچ رکورد با Query مشخص شده وجود نداشته باشه (یا همه رکورد ها خونده شده باشن)، در این حالت متد Read نمیتونه رکوردی رو بخونه و مقدار false رو برمیگردونه. با شرطی که میگذاریم، تنها موقعی به دریافت اطلاعات از Reader میپردازیم که رکورد خونده شده باشه و مقدار برگشتی trueباشه.
توجه کنید که با هر بار فراخوانی Readیک رکورد (در صورت وجود) خونده میشه. البته در مثال شما در صورتی که ستون id یکتا باشه، بیشتر از یک رکورد برای توسط Select انتخاب نمیشه برای همین هست که در این مثال فقط یک بار با if اقدام به خوندن میکنید و نه با while و به هر تعدادی که رکورد هست.

mirbehnam2
پنج شنبه 23 مرداد 1393, 18:50 عصر
ممنون اقای plus همنطوری می دونید هیچ جا توی سایت های ایرانی مثل شما کامل توضیح ندادن من اگه مطلبو از ریز تا درشتش ندونم اصلا اعصابم خورد می شه
مطلبی که شما گفتید تا حدودی خیلی از مبهم های ذهنمو برطرف کرد
حالا یک سوال من برای اینکه بتونم c# رو ریز به ریز یاد بگیرم باید از چه منابعی استفاده کنم از msdn خیلی نمی تونم استفاده کنم چون در مورد بعضی چیزا کامل توضیح نداده
اگه کتابی هست معرفی کنید

plus
پنج شنبه 23 مرداد 1393, 19:30 عصر
شما اگه دنبال یادگیری واقعی هستی به نظر من سایت های ایرانی رو بیخیال شو D:
MSDN به نظر من منبع کاملی هست، البته، بعضی از چیزهایی که در MSDN پیدا نمیشه رو در سایت های مثل stackoverflow میشه پیدا کرد...
ولی اگه شما نتونستین از MSDN کمک بگیرید به نظرم دو تا دلیل میتونه موثر باشه، یکی تسلطتون به زبان انگلیسی هست که اگه خوب نیست قطعا برای موفقیت در زمینه نرم افزار باید بهترش کنید و دلیل دیگه اینکه ممکنه شم ایا هر Developer دیگه ای لازم داره به یک حدی از اطلاعات و یک تصویر کلی از #C رسیده باشه تا بتونه از MSDN استفاده کنه.اگه اینطور باشه میتونید از کتاب های آموزشی استفاده کنید که روند یادگیری مناسب تری دارن تا به اون حد برسید.
کتاب مشخصی رو سراغ ندارم، ولی به هرحال اگه زبانتون خوبه کتاب های زبان اصلی وگرنه ترجمه شون رو دنبال کنید.کتاب هایی که در داخل تالیف شدن فکر نکنم زیاد جالب باشن.

s.zamani
یک شنبه 26 مرداد 1393, 01:19 صبح
از مطالب فارسی چیز زیادی بدست نمیارید. پیشنهاد می کنم که به خوندن کتابهای انگلیسی (http://ebook-dl.com/computer/programming/c-sharp/) روی بیارید.