PDA

View Full Version : مقادیر Null از PictureBox در DataBase



فاطمه هاشمیان
جمعه 23 اردیبهشت 1384, 00:12 صبح
من میخوام عکس وارد DataBase کنم ام اگر کاربر عکسی را انتخاب نکرد من این رو در DataBase با چه کدی باید وارد کنم؟
من به این صورت وارد کردم اما با DBNull.Value مشکل داره هم در نوشتن به DataBase هم در خواندن از DataBase
مثلا" برای خواندن از DataBase این رو می نویسم

if(dataSet11.Table[0].picture.Equals(DBNull.Value) )
{
//Code for set image to pictureBox?
}
else if(!dataSet11.Table[0].picture.Equals(DBNull.Value ))
{
byte[] arrPicture = ((byte[]) (dataSet11.Table[0].picture_t));

MemoryStream ms = new MemoryStream(arrPicture);
PictureBox.Image = Image.FromStream(ms);
PictureBox.SizeMode = PictureBoxSizeMode.CenterImage;
PictureBox.BorderStyle = BorderStyle.Fixed3D;
PictureBox.BringToFront();
}
با تشکر

M.GhanaatPisheh
جمعه 23 اردیبهشت 1384, 00:39 صبح
کداتونو درست کنید تا اول بشه خوندش.

فاطمه هاشمیان
جمعه 23 اردیبهشت 1384, 00:44 صبح
بله حالا درست شد :oops:

فاطمه هاشمیان
جمعه 23 اردیبهشت 1384, 11:44 صبح
لطف کنید اگر میدونید جواب بدید :گیج:

omid_Ahmadi
جمعه 23 اردیبهشت 1384, 13:17 عصر
کد رو به صورت زیر اصلاح کنید:


if(dataSet11.Tables[0].Rows[1][3] == DBNull.Value)
{
//Code for set image to pictureBox?
MessageBox.Show("Empty");
}
else
{
byte[] arrPicture = ((byte[]) (dataSet11.Tables[0].Rows[1][3]));

MemoryStream ms = new MemoryStream(arrPicture);
pictureBox1.Image = Image.FromStream(ms);
pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
pictureBox1.BorderStyle = BorderStyle.Fixed3D;
pictureBox1.BringToFront();
}

:موفق:

M.GhanaatPisheh
جمعه 23 اردیبهشت 1384, 14:24 عصر
این کد رو ببینید اگر بازم مشکلی بود مطرح بفرمایید.
فکر می کنم همه اون چیزی باشه که می خواید.

فاطمه هاشمیان
شنبه 24 اردیبهشت 1384, 00:12 صبح
از توجه شما ممنونم :) این Sample رو من دارم اما من یه فرم دارم که برای Save شدنش وارد کردن عکس
اجباری نیست من نمیخوام اگه کاربر عکس وارد نکرد بهش پیغامی داده بشه


MessageBox.Show("Empty");

مشکل من DBNull.Value است من وقتی میخوام عکس رو در DataBase ذخیره کنم این کد رو مینویسم


if(PictureBox.Image != null)
{
MemoryStream ms = new MemoryStream();

PictureBox.Image.Save(ms, PictureBox.Image.RawFormat);

byte[] arrImage = ms.GetBuffer();

// Close the stream object to release the resource.
ms.Close();
row["picture"] = arrImage;
}
else
{
row["picture"] = DBNull.Value; //this code build error
}

با DBNull.Value مشکل داره من نمیدونم اگر PictureBox من null بود من با چه کدی در DataBase این رو وارد کنم که نه تو خواندن نه تو نوشتن اون مقدار null تو DataBase پیغام خطا بده؟

M.GhanaatPisheh
شنبه 24 اردیبهشت 1384, 00:25 صبح
یه سوال
توی Tableتون توی محیط SQL SERVER فیلد رو Allow Null گذاشتید مطمینا, آره؟

فاطمه هاشمیان
شنبه 24 اردیبهشت 1384, 00:47 صبح
َAccess است نه SQLServer
Required هم No است

فاطمه هاشمیان
شنبه 24 اردیبهشت 1384, 19:31 عصر
کسی نمیدونه؟
تو VB6 با Nothing جواب میداد من معادلش رو تو #C میخوام اما DBNull.Value جواب نمیده

فاطمه هاشمیان
دوشنبه 26 اردیبهشت 1384, 16:45 عصر
کسی نمیدونه؟ :گیج: :(

smt_414
یک شنبه 08 مهر 1386, 12:50 عصر
سلام
مثه اینکه این تایپیک به نتیجه خاصی نرسیده
آیا دوستان می تونن کمکی کنن
سوال اینه که چه شکلی می شه تو sql به جای عکس(متغیر از نوع image) مقدار null رو قرار داد ؟؟
:خجالت:

smt_414
دوشنبه 09 مهر 1386, 16:56 عصر
سلام
تایپیک هنوز به نتیجه ای نرسیده !:افسرده:
در این مدت کاری به ذهنم رسید به طور پیش فرض برای تمامی رکوردها عکس در نظر گرفته می شود (با حجم خیلی خیلی کم .قابل توجه دوستان حساس بر روی فضای پایگاه )
هر کاربری که عکس داشت اون رو تو پایگاه می ذاریم هر کس هم نداشت همون عکس پیش فرض
زمانی که خواستیم به فیلد عکس مخصوص خودش رو اضافه کنیم
به بخش ویرایش می ریم و این کار رو می کنیم (البته نمی دونم چه شکلی باید عکس رو پاک کرد)

البته این ایده به دلیل اینه که کسی جواب مناسبی نداده !

PC2st
دوشنبه 09 مهر 1386, 18:24 عصر
قاعدتا مشکلی نباید باشه، هیچ عکسی رو براش انتخاب نکنید و مقدارش رو null بگذارید، در دیتابیس هم عکسی ذخیره نمیشه.

hdv212
دوشنبه 09 مهر 1386, 20:27 عصر
اگه برای مقدار Null در فیلد Image نمیتونین از :

System.DBNull.Value
استفاده کنید، از این مقدار استفاده کنید :

System.Data.SqlTypes.SqlBinary.Null

smt_414
سه شنبه 10 مهر 1386, 10:22 صبح
سلام
من از کد شما تو برنامه استفاده کردم
من تابعی دارم که مقادیر رو برای ذخیره به اون می دم که عکس هم جز اوناست
شرطی گذاشتم که اگه پیکچر باکس خالی بود به جای متغیر بایت از کد شما استفاده کردم و اون رو به عنوان آرگومان به تابع دادم
اما ایرور زیر رو می ده
Cannot convert from 'system.data.sqltypes.sqlbinary' to 'byte[]'

PC2st
سه شنبه 10 مهر 1386, 16:38 عصر
Cannot convert from 'system.data.sqltypes.sqlbinary' to 'byte[]'
نوع فیلدی که در جدول وجود داره از نوع byte هست، اونرو به نوع binary تغییر بدید درست میشه.

smt_414
سه شنبه 10 مهر 1386, 19:56 عصر
سلام
hdv212 و PC2st.ir جان از توجهتون ممنونم
من برای ذخیره عکس اون رو تبدیل کردم به رشته و پس از اون به بایت با این کد

private static byte[] change_byte(string file_photo_patch)
{
//گرفتن آدرس عکس و تبدیل عکس به آرایه ای از بایت ها برای ذخیره در پایگاه
FileStream stream = new FileStream(file_photo_patch, FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(stream);
byte_photo = reader.ReadBytes((int)stream.Length);
reader.Close();
stream.Close();
return byte_photo;
}



نوع فیلدی که در جدول وجود داره از نوع byte هست، اونرو به نوع binary تغییر بدید درست میشه

حالا چه طور باید این کار رو بکنم ?

PC2st
سه شنبه 10 مهر 1386, 21:56 عصر
برای تبدیل یک عکس به آرایه ای از بایت، میتوانید به روش زیر عمل کنید:


Byte[] bytes = File.ReadAllBytes("MyPhoto.bmp");


برای اینکه یک فیلد بتواند یک عکس رو در خودش ذخیره کند، نوع آنرا بهتر است از نوع Image انتخاب کنید (اگر از SQL server 2005 استفاده میکنید، اسم این نوع همان Image خواهد بود برای ورژنهای دیگر اطلاعی ندارم!).

برای مثال، کدهای زیر یک رکورد رو به جدول Table1 اضافه میکنند، و جدول Table1 تنها دارای یک فیلد بنام MG و از نوع Image است:


Byte[] bytes = File.ReadAllBytes(@"E:\Windows\Zapotec.bmp");
SqlCommand cd = new SqlCommand("INSERT INTO Table1 VALUES(@mg)", cn);
cd.Parameters.Add("@mg", SqlDbType.Image).Value = bytes;
cn.Open();
cd.ExecuteNonQuery();
cn.Close();

cn شیئ SqlConnection است.
حالا اگر برای Value مقدار DbNull رو مشخص کنیم، عکسی ذخیره نمیشه، یعنی فیلد MG مقدارش Null خواهد بود:


cd.Parameters.Add("@mg", SqlDbType.Image).Value = DBNull.Value;

و در اینصورت، مقدار null (بجای عکس) در دیتابیس ذخیره میشه...