PDA

View Full Version : خیلی عجیب! تفاوت بین دستورات چیه



روح اله معینی زاده
شنبه 24 اردیبهشت 1384, 13:00 عصر
با سلام خدمت تمامی دوستان گرامی

می شه لطفا تفاوت بین دو دستور زیر رو به من بگید؟

پس از اجرای برنامه اگه از دستور اول استفاده بشه خطا می گیره ولی دستور دوم خطا نمی گیره. :sad2:

شکل اول

IIf(IsDBNull(DS_Main.Tables("persons").Rows(i)("PCityName")) = True, "", Trim(DS_Main.Tables("persons").Rows(i)("PCityName")))


شکل دوم

If IsDBNull(DS_Main.Tables("persons").Rows(i)("PCityName")) = True Then
.Write(Chr(34) & Chr(34) & ",")
Else
.Write(Chr(34) & DS_Main.Tables("persons").Rows(i)("PCityName") & Chr(34) & ",")
End If


جهت اطلاع دوستان بگم منظور من فقط دستورات If در دو شکل بالا می باشد و بقیه کار می کند، حتی در زمان اجرا من بخش اول دستور IIF رو هم تست کردم که علی‌رغم شکل ظاهری صحیح آن، باز هم سبب بروز خطا می شود. پرانتز هم اضافه و کم کردم ولی جواب نداد.

خطایی که می ده می گه نمی تونم DBNull رو به String تبدیل کنم. شماره خطا هم 13 می باشد.

منتظرم
با احترام- خدانگهدار

somayekh
شنبه 24 اردیبهشت 1384, 14:05 عصر
سلام
درسته من هم هر موقع از Iff استفاده می کنم درست جواب نمی ده ولی هر موقع معادلش رو با if then else می نویسم درست جواب می ده . :sunglass:

linux
شنبه 24 اردیبهشت 1384, 14:58 عصر
حداقل از msdn یه نگاه می انداختید
این طوری که شما نوشتید اشتباه هست.


Function CheckIt (ByVal TestMe As Integer) As String
CheckIt = IIf(TestMe > 1000, "Large", "Small")
End Function

تابع iif باید یک چیزی برگردونه


Dim strCityName As String
strCityName = IIf(IsDBNull(DS_Main.Tables("persons").Rows(i)("PCityName")), "", Trim(DS_Main.Tables("persons").Rows(i)("PCityName")))


این را امتحان کن

یاشار
شنبه 24 اردیبهشت 1384, 17:00 عصر
همونطور که linux گفتن iif یک تابع است، در حالی که if ... then یک دستور flow control محسوب می‌شه. نباید گول تشابه ظاهریشون رو خورد.


هر موقع از Iff استفاده می کنم

Iff مال تو ریاضیه ( if and only if ). بابا دقیق ... بابا نکته سنج ... مو از ماست بیرون کش

:wise1:

روح اله معینی زاده
سه شنبه 27 اردیبهشت 1384, 13:04 عصر
سلام خدمت دوستان گرامی

من از این دستور IIF دارم دو سه تا خط عقب تر و با نام فیلد دیگری از بانک اطلاعاتی استفاده می کنم و خطا نمی ده. برای همین هم هست که تعجب کردم. :sad2:

برای trace من اومدم یک تابع نوشتم و در آن چک کردم که مقدار متغیر چه وضعیتی داره. وقتی null بود که هیچ ولی وقتی که مقدار داشت (به فرض مثال «تهران») به جای این که مقدار آن را در متغیر نشان دهد یک عدد را در آن اضافه می کرد.

مقدار را هم قبل از پاس کردن به تابع چک می کردم و می گفت که از نوع String است و درست هم پاس می شد.

من که سر در نیاوردن :sorry:

با احترام خدانگهدار

یاشار
سه شنبه 27 اردیبهشت 1384, 15:24 عصر
اون قسمتی از کدتون که خطا میده و اون قسمتی که خطا نمی‌ده رو پست کنید.


چک کردم که مقدار متغیر چه وضعیتی داره

مقدار کدوم متغیر رو بررسی می‌کنید؟

روح اله معینی زاده
پنج شنبه 29 اردیبهشت 1384, 09:19 صبح
سلام خدمت دوستان گرامی

شرح کار ::نوشتن::
من از یه بانک دارم اطلاعات خاصی رو بر می دارم و توی یه فایل csv ذخیره می کنم. برای این کار هم قسمت‌هایی که قراره در فایل نوشته بشه رو توسط دستور write که در stream وجود داره، در فایل می نویسم. حالا ممکنه برخی از فیلدها مقدار null داشته باشن که من بدین علت مجبور که چک کنم آیا اونا مقدار دارن یا null هستن. این قضیه برای برخی فیلدها صادقه و یکی از اونا نام شهرستانه.
من هم برای این که کد اضافی ننویسم و روال کارم راحت‌تر و قابل فهم‌تر باشه از دستور IIF استفاده کردم که فقط در خصوص این نام شهرستان با خطا مواجه شدم. علت تعجب من هم همینه. مثلا "شماره شناسنامه" هم یکی از اونایی که من هنوز هم با همان IIF دارم جلوی مقدار null رو می گیرم ولی برای شهرستان مجبور شدم از بلوک IF استفاده کنم.
آره دوستان قضیه از این قراره :sad2:

و اما دوست‌مون "یاشار" گفتن کدوم متغیر؟
::نوشتن::
من با خودم گفتم که شاید اتفاق خاصی داره برای این فیلد شهرستان می افته، بنابراین یه تابع نوشتم که تشکیل شده از یک مقدار ورودی و در بدنه تابع یک بلوک IF بود که چک می کرد آیا مقدار متغیر ورودی null است یا غیر آن. مقدار فیلد رو به تابع پاس کردم. وقتی بلوک IF چک می کرد که مقدار چیه، برای مقدار null به خطا بر نمی خورد ولی اگه مقدار داشت این خطا دوباره اتفاق می افتاد :sad2:
من در این جا بود که مقدار متغیر رو چک می کردم. به محض ورود به تابع مقدار ورودی تابع رو در قسمت Watch (اگه اشتاه نکنم) نگاه می کردم. جالبه که مقدار رو از نوع String و با ارزش "تهران" نمایش می داد ولی به محض این که در دستور IF چک می شد و می خواست به بخش خطا بره، در قسمت watch به جای مقدار "تهران" مقدار "363" ظاهر می شد :sad2:
این جا بود که حاجیکستون خیلی قاط زد و برای خارج شدن از قاط به بلوک IF روی آورد.

بازم اگه سوالی هست که شرح بدم.

در ضمن اگه کسی می دونه که راه ساده‌تری برای ذخیره اطلاعات با قالب csv در دات نت وجود داره بگه. یعنی اگه بشه یه Select از بانک گرفت و مستقیم با قالب csv اونو ذخیره کرد، خیلی خوب می شه.

خوب سرتون رو به درد نیارم.
با احترام- خدانگهدار

یاشار
پنج شنبه 29 اردیبهشت 1384, 12:19 عصر
:sad2: نزنید حاجیکستون ... :)

شما انقدر شاک زده بودید که نفرمودید که چه خطایی می‌گیرید. ضمنا سری که درد نمی‌کنه رو ... وقتی مشکلتون با یک If ... Then معمولی حل شده بهتره زیاد اصرار نکنید روی چیزی که جواب نمی‌ده. ولی حالا اگر این قضیه ( جسارتا ) توی گلوتون گیر کرده پیغام خطایی که می‌گیرید رو پست کنید شاید بتونیم با هم یه فکری بکنیم.


با تقدیم احترامات فائقه

روح اله معینی زاده
پنج شنبه 29 اردیبهشت 1384, 12:34 عصر
سلام دوست عزیز

من که توی اون موضوع اولی شماره و نوع خطا رو به فارسی در آخر نوشتم.

با احترام- خدانگهدار

majid_afra222
پنج شنبه 29 اردیبهشت 1384, 18:36 عصر
سلام روح ا.. جان
البته اگه اشتباه نکنم :
در مورد سوالی که مطرح کردی برام جالب بود که اگه فقط مشکلت null بودن یه فیلد هستش٬‌چرا موقع خوندن اون٬ بصورت مستقیم در خود دستور select از دستور case برای تغییر فیلدهای null استفاده نمی کنی.

می بخشی من فرمت فایل csv رو نمی شناسم٬‌ولی در مورد export اطلاعات از sql server تو بخش دلفی جواب دادم که میتونی با کد نویسی از خود dts تو sql server استفاده کنی٬‌خیلی هم سادس.

یاشار
جمعه 30 اردیبهشت 1384, 12:26 عصر
بعد از تحقیقات (http://weblogs.asp.net/psteele/archive/2003/10/09/31250.aspx) مقتضی، کاشف به عمل اومد که رفتار تابع iif برای حفظ سازگاری با VB.old به همون صورت بدوی باقی مونده.

تابع iif بدون توجه به مقدار عبارت اول ( شرطی ) ، هر دو پارامتر بعدی رو چک می‌کنه. یعنی حتی اگر عبارت شرطی شما مقدار درست برگردونه، پارامتر دوم هم evaluate می‌شه. وقتی که قراره با null سر و کار داشته باشیم، این مسئله مشکل‌ساز می‌شه. بنابراین بهتره که از همون If...Then استفاده کنیم. اگر هم خیلی اصرار به استفاده از این تابع null نفهم دارید، می‌تونید به جای پارامترهاش، یک تابع دیگه رو مشخص کنید که توی اون تابع مقدار null بررسی بشه و مقدار دلخواه برگردونده بشه.

روح اله معینی زاده
شنبه 31 اردیبهشت 1384, 10:09 صبح
با سلام خدمت دوستان عزیز

به خصوص یاشار عزیز :flower:

از این که در این زمینه تحقیق نمودید خیلی تشکر می کنم هم از طرف خودم و هم از طرف همه دوستان برنامه نویس.

زحمات شما قابل تقدیر و تشکر است.

امیدوارم همه از این سوال بهره کافی را برده باشند.

با احترام- خدانگهدار