PDA

View Full Version : پیش بینی امکان null یا DBnull



Mrs.Net
دوشنبه 28 آبان 1386, 16:15 عصر
بعضی وقتها حاصل یک فیلد null میشه و گاهی dbnull
آیا حالتی وجود داره که هردو حالت برای یک درخواست اتفاق بیافته؟
مثلا وقتی یک select معمولی میکنیم ممکنه dbnull بشه و null نمیشه (درسته؟)
ولی وقتی از max استفاده میکنیم یا نول میشه یا یک مقدار (درسته؟)
خوب حالا همه حالتهارو بگید که کدوم ممکنه اتفاق بیافته تا فقط اون مورد کنترل بشه
خیلی ممنون

SabaSabouhi
سه شنبه 29 آبان 1386, 09:59 صبح
بعضی وقتها حاصل یک فیلد null میشه و گاهی dbnull
آیا حالتی وجود داره که هردو حالت برای یک درخواست اتفاق بیافته؟
مثلا وقتی یک select معمولی میکنیم ممکنه dbnull بشه و null نمیشه (درسته؟)
ولی وقتی از max استفاده میکنیم یا نول میشه یا یک مقدار (درسته؟)
خوب حالا همه حالتهارو بگید که کدوم ممکنه اتفاق بیافته تا فقط اون مورد کنترل بشه
خیلی ممنون

با سلام
NULL حاصل یک Query مى‌تونه باشه اما تو برنامه‌اى که شما مى‌نویسین این مقدار همیشه به صورت DBNull خودش رو نشون مى‌ده و نه NULL ( فرقى نداره که Select معمولى داشته باشین و یا از توابعى مثل Max استفاده کنید).
براى کار بى‌اشکال باید یکى از دو روش ریز رو انجام بدین.
1. خروجى رو تو متغیرى از جنس object بریزید و بعد از کنترل DBNull نبودن از اون استفاده کنید.
2. با استفاده از فرمان‌هاى SQL امکان وجود NULL رو از بین ببرید مثلاً



MyCommand.CommandText = "SELECT ISNULL( Max( Value), 0) FROM MyTable"



صبا صبوحى

Mrs.Net
شنبه 03 آذر 1386, 20:06 عصر
NULL حاصل یک Query مى‌تونه باشه اما تو برنامه‌اى که شما مى‌نویسین این مقدار همیشه به صورت DBNull خودش رو نشون مى‌ده اما اینجوری نبود و برای همون پیداکردن بیشترین مقدار یک فیلد اگر اصلا رکوردی نباشد مقدار null برمیگرده و با شرط dbnull فهمیده نمیشه

SabaSabouhi
یک شنبه 04 آذر 1386, 12:04 عصر
اما اینجوری نبود و برای همون پیداکردن بیشترین مقدار یک فیلد اگر اصلا رکوردی نباشد مقدار null برمیگرده و با شرط dbnull فهمیده نمیشه


با سلام
نباید اینطورى باشه. اگه Null برگشته این خروجى Query شما نباید باشه و #C داره به شما این مقدار رو برمى‌گردونه، اگه امکان داره نمونه کد خود رو اینجا بگذار شاید من ویا دیر دوستان اشکال رو پیدا کنیم.

صبا صبوحى

Mrs.Net
یک شنبه 04 آذر 1386, 13:02 عصر
موقع استفاده از بعضی توابع هم حتی null برمیگردونه اما الان یاد نیست
این یه نمونه برای سلکت معمولی هست

SabaSabouhi
دوشنبه 05 آذر 1386, 12:20 عصر
با سلام
خوب مشکل رو فهمیدم.
به این چند خط SQL توجه کن:



DECLARE @Value as int
SELECT @Value = Value
FROM MyTable
WHERE MyCondition



اگر خروجى عبارت Select یک سطر باشد مقدار ستون Value چه عددى و چه NULL در متغیر Value@ قرار مى‌گیرد.
اگر خروجى عبارت Select بیش از یک سطر باشد مقدار ستون Value از آخرین سطر در متغیر Value@ قرار مى‌گیرد.
اگر عبارت Select خروجى نداشته باشد ( یعنى هیچ سطرى با شرط شما مطابقت نداشته باشد ) مقدار Value@ دست نخورده باقى خواهد ماند. ( یعنى اگه بهش مقدارى نداده باشى مقدارش NULL و در غیر این صورت همان مقدار قبلى رو خواهد داشت. )

و اما چرا شما بجاى DBNull با null مواجه مى‌شى، دلیلش اینه که شرط شما و یا خالى بودن جدول شما باعث مى‌شه که Select هیچ سطرى رو به عنوان خروجى برنمى‌گردونه.
مقدار DBNull متناظر هست با یک مقدار NULL در خروجى و چون هیچ خروجى وجود ندارد شما مقدار null دریافت مى‌کنید.

* مقدار null در #C را با حروف کوچک و مقدار NULL در SQL را با حروف بزرگ نوشتم که اشتباه نشه.

براى اجتناب از دریافت مقدار null بهتره عبارت SQL را به این شکل تغییر بدى:



SELECT @Value = Min( Value)
FROM MyTable
WHERE MyCondition



در این حالت تصریح مى‌کنى که اولین مقدار رو مى‌خواهى در این صورت اگر عبارت یک یا بیش از یک سطر داشت همیشه اولین سطر رو دریافت مى‌کنى و اگر هیچ سطرى وجود نداشت مقدار NULL رو ( DBNull در #C ).

اگر Query رو به شکل : (SELECT ISNULL( Min( Value), 0 بنویسى دیگه DBNull رو هم نمى‌بینى و متغیر داخل برنامه رو هم مى‌تونى بجاى این‌که از تایپ object استفاده کنى یک متغیر int داشته باشى.

صبا صبوحى

Mrs.Net
سه شنبه 06 آذر 1386, 10:23 صبح
خیلی خوب بود ممنون