ورود

View Full Version : مشکل در نمایش رکوردهای یک view در برنامه و خطای عجیب آن



naeeme
چهارشنبه 16 بهمن 1387, 08:44 صبح
من یک view در sqlserver دارم که می خوام رکوردهای اون رو در برنامه نشون بدم. خوب مسلمه که از دستور select * from view_1 استفاده می کنم و با یک data Adapter اون رو خونده و dataTable رو پر می کنم.
اما مشکلی که دارم این هست که من می دونم view من دارای رکورد هست و این view در sqlServer داره خروجی میده اما وقتی دستور select در دات نت (در حالت کامپایل) اجرا می شود، یک Exception پرتاب میشود.

دستور سازنده view:



SELECT CONVERT(smalldatetime,
CONVERT(char, DATEPART(year, [date])) + '/' +
CONVERT(char, DATEPART(month, [date])) + '/' +
CONVERT(char, DATEPART(day, [date]))) AS Day,
SUM(login_count) AS totalLogin
FROM tbl_usersLog
GROUP BY
DATEPART(year, [date]),
DATEPART(month, [date]),
DATEPART(day, [date])


پیغام Exception :



The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value


دستور فراخواننده view در داخل برنامه:



SELECT * FROM View_login_daily


اما نکته قابل توجه اینکه همین برنامه با همین view و همین دستورات بر روی سرور به درستی کار می کنه!!!
----
1) دات نت به توابع مقسم تاریخ گیر میده اما به نظرم خطایی که اعلام میکنه منطقی نمیاد.
----
2) پیغام خطا مربوط به GROUP BY هست. چرا که با حذف فیلد DAY از VIEW همچنان این پیغام داده میشه.
همچنین اگر به جای DATEPART از توابع YEAR و DAY و... هم استفاده کنم، باز هم این خطا رخ میده.

--> smalldatetime با DateTime هم هیچ تفاوتی در نتیجه نداره!
----
3) من از dataReader هم استفاده کردم. تفاوتی که با dataAdapter.Fill داشت این بود که exception پرتاب نمی کرد اما HasRow برابر False بود در حالیکه این View دارای 10 رکورد بود.
----
شاید این سوال پیش بیاد «حالا که رو سرور کار میکنه چرا بهش گیر دادم؟ »
چون نمی تونم به کدی که این بازی رو دربیاره اعتماد کنم و می ترسم وقتی برنامه اجرایی شد برام دردسر ایجاد کنه!


کسی در این باره نظری داره؟؟

mh19842008
چهارشنبه 16 بهمن 1387, 09:43 صبح
با سلام پیغام خطای شما به نظر از خارج از محدوده بودن مقدار خروجی شما ست میتونید نوع داده smalldatetime رو به dataetimeتبدیل کنی امیدوارم درست بشه

naeeme
چهارشنبه 16 بهمن 1387, 09:50 صبح
dateTime و SmallSateTime با هم تفاوتی ندارند. قبلا تمام اینها امتحان شده. همونطور که توی توضیحاتم گفتم، اگر فیلد Day رو حذف کنم و فقط قسمت Group by رو نگه دارم، باز هم همین خطا رو می بینم و به این نکته هم باید توجه کرد که در صورت حذف فیلد Day، دیگه هیچ تبدیل کاراکتر به DateTime وجود نداره که بخواد این خطا رو بگیره!!

twelve
چهارشنبه 16 بهمن 1387, 10:17 صبح
در نوع داده ای Char چه چیزی رو ذخیره کردی ؟

naeeme
چهارشنبه 16 بهمن 1387, 11:00 صبح
در نوع داده Char هیچ چیزی ذخیره نمیشه!!

این دستور رو در نظر بگیرید:



SELECT SUM(login_count) AS totalLogin
FROM tbl_usersLog
GROUP BY DATEPART(year, [date]), DATEPART(month, [date]), DATEPART(day, [date])

فیلد [date] از جنس datetime هست و همونطور که میبینید هیچ تبدیل داده ای صورت نگرفته اما پیغام خطای گفته شده، نشون داده میشه.