ورود

View Full Version : تشخیص null بودن یک فیلد از database که از نوع image



saber4166
جمعه 04 مرداد 1387, 11:51 صبح
سلام فیلد تیبل من از نوع image است و به صورت bainery تصویر رو ذخیره کردم
برای انکه تشخیص دهم این فیلد null میباشد یا خیر چه باید کنم
کدی که برای دریافت image از بانک نوشت


byte[] arrPic1 = (byte[])(Form4.dtpic.Rows[0]["pic1"]);

MemoryStream ms1 = newMemoryStream(arrPic1);
if (ms1 != null)
{
pictureBox1.Image = Image.FromStream(ms1);
}
else
{
pictureBox1.Image = null;
}

ولی این کد برای فیلد های null همیشه error میزنه کمکم کنید

علیرضا مداح
جمعه 04 مرداد 1387, 11:55 صبح
سلام دوست عزیز ،
برای مقادیری که از دیتابیس دریافت مینمایید باید از DBNull.Value جهت چک کردن null بودن آن استفاده نمایید ،/

saber4166
جمعه 04 مرداد 1387, 12:03 عصر
اما در قسمت if اول ms1 != DBNull.Value رو که مینویسم
error زیر رو مده
Operator '!=' cannot be applied to operands of type 'System.IO.MemoryStream' and 'System.DBNull'

علیرضا مداح
جمعه 04 مرداد 1387, 12:06 عصر
باید آرایه arrPic1 را با DBNull.Value مقایسه نمایید ،

Xcalivorse
جمعه 04 مرداد 1387, 12:06 عصر
بعد از کد زیر طول آرایه ات رو چک کن.

byte[] arrPic1 = (byte[])(Form4.dtpic.Rows[0]["pic1"]);

علیرضا مداح
جمعه 04 مرداد 1387, 12:18 عصر
byte[] arrPic1 = (byte[])(Form4.dtpic.Rows[0]["pic1"]);

دوست عزیز این کد صحیح نیست ، به دلیل اینکه اگر مقدار DBNull.Value در دیتابیس ذخیره شده باشد ، با این Exception مواجه خواهید شد :


InvalidCastException : Unable to cast object of type 'System.DBNull' to type 'System.Byte[]'.

مگر اینکه ابتدا از null نبودن آن اطمینان حاصل کنید :


if (dtpic.Rows[0]["pic1"] != DBNull.Value)
{
//Do Something
}

در ضمن هنگامیکه که آرایه شما null باشد ، نمیتوانید به پروپرتی های آن از جمله Length دسترسی داشته باشید و با Exception زیر مواجه خواهید شد :


NullReferenceException : Object reference not set to an instance of an object.

Zaparo
جمعه 04 مرداد 1387, 14:36 عصر
از <Nullable<T هم میتونید استفاده کنید T میشه نوع داده یا اینکه در #C از ? استفاده کنید

top7news
جمعه 04 مرداد 1387, 14:46 عصر
فکر کنم از data reader هم بتونی استفاده کنی .

علیرضا مداح
جمعه 04 مرداد 1387, 15:11 عصر
بله ، همیشه راههای متفاوتی وجود دارد ، به طور مثال در صورت استفاده از DataTable میتوانید از متد IsNull مربوط به DataRow بهره بگیرید ، اگر هم برنامه شما با IDataReader کار میکند ، متد IsDBNull مربوط به این شیء شما را به هدف مورد نظر میرساند ،

saber4166
جمعه 04 مرداد 1387, 19:50 عصر
بازم error میده نمیدونم مشکلش چیه

Xcalivorse
جمعه 04 مرداد 1387, 19:56 عصر
به نظر من بهتره فعلا از Try Catch استفاده کنید. مشکلتون رو حل میکنه.

saber4166
جمعه 04 مرداد 1387, 22:36 عصر
تا حالا کار نکردم چه طور میتونم ازاش استفاده کنم دوست من Xcalivorse

Xcalivorse
شنبه 05 مرداد 1387, 11:46 صبح
دستوراتی رو که فکر می کنید احتمالا خطا میده رو در داخل بلاکهای Try Catch بنویسید. به عنوان مثال دستوارت خودتون رو میتونید به شکل زیر بنویسید :



try
{
byte[] arrPic1 = (byte[])(Form4.dtpic.Rows[0]["pic1"]);
MemoryStream ms1 = newMemoryStream(arrPic1);
if (ms1 != null)
{
pictureBox1.Image = Image.FromStream(ms1);
}
else
{
pictureBox1.Image = null;
}
}
catch
{
MessageBox.Show("No Picture");
}


در این حالت اگر دستورات شما به طور صحیح اجرا شد که هیچی وگرنه دستوراتی که در بلاک Catch نوشتیم فعال میشود. در مثال بالا اگر دستورات به هر دلیلی (مثلا Null بودن فیلد Image) خطا بدن اجرای برنامه متوقف نمی شود و فقط دستورات قسمت Catch اجرا می شود. (در اینجا یک پیغام با محتوای No Picture نمایش داده میشود)