PDA

View Full Version : ارسال پارامتر از نوع DateTime به SP در SQL Server



Mahyaa
چهارشنبه 25 دی 1387, 15:25 عصر
سلام
من یک SP دارم برای گرفتن یک ریپورت ساده. فیلدهای تاریخ رو از همون نوع datetime استفاده کردم و تاریخ رو هم میلادی ذخیره میکنم.
مشکلم اینه که وقتی به این SP مقدار میفرستم مقادیر بازگشتی درست نمایش داده نمیشن.یعنی میشه گفت هیچ رکوردی رو بر نمیگردونه !

این کد SP : (تابع DateOnly فقط تاریخ رو برمیگردونه که اینجا موضوع بحث نیست)


Select
ID,
UserId,
WorkDate,
TimeIn,
TimeOut,
RelId,
LunchBreak,
Delayed
From tbl_DTR
Where
(UserId = @UserId) And
(dbo.DateOnly(WorkDate) BETWEEN
@SDate And @EDate)
اینجوری از دلفی بهش مقدار میفرستم (DateToDate , DateFromDate هردو از نوع TDate هستند) :


DM.SpRepDtrDur.Parameters.ParamByName('@EDate').Va lue := DateToDate;
DM.SpRepDtrDur.Parameters.ParamByName('@SDate').Va lue := DateFromDate;
البته خوبه که این رو هم بگم که یک نکاتی در مورد عدم همخوانی نوع تاریخ در دلفی و اس کیو ال خوندم ولی اونها هم کمکی نکرد از جمله این :
http://www.swissdelphicenter.ch/torry/showcode.php?id=1989

میشه راهنمایی کنید که اشتباه من کجاست ؟

ممنون

vcldeveloper
پنج شنبه 26 دی 1387, 01:02 صبح
من از نوع DateTime در برنامه هام به عنوان پارامتر SP استفاده کردم، و همچین مشکلی نداشتم. احتمال داره همون تابع DateOnly شما مشکل داشته باشه، و بخاطر همون نتیجه شرط همیشه False برگشت داده میشه.

ghabil
پنج شنبه 26 دی 1387, 02:40 صبح
من یک جواب طولانی به این دادم نمیدونم چی شد پستش نکردم! فکر میکردم الان باید باشه! بدجوری پیر و بیحواس شدم.

به هر حال:

کدت رو اینطوری کن :


(UserId = UserId) And
(dbo.DateOnly(:WorkDate) BETWEEN
:SDate And :EDate)

بعد هم :

DM.SpRepDtrDur.Parameters.ParamByName('EDate').Val ue := DateToDate;
DM.SpRepDtrDur.Parameters.ParamByName('SDate').Val ue := DateFromDate;

توضیح هم داده بودم که نباید پارامترهای ADO رو با پارامترهای SQL اشتباه بگیری...
خدا عاقبتم رو بخیر کنه

Mahyaa
پنج شنبه 26 دی 1387, 08:33 صبح
من از نوع DateTime در برنامه هام به عنوان پارامتر SP استفاده کردم، و همچین مشکلی نداشتم. احتمال داره همون تابع DateOnly شما مشکل داشته باشه، و بخاطر همون نتیجه شرط همیشه False برگشت داده میشه.

راستش این تابع رو چند جای دیگه هم استفاده میکنم. برای اطمینان امروز امتحان میکنم.


من یک جواب طولانی به این دادم نمیدونم چی شد پستش نکردم! فکر میکردم الان باید باشه! بدجوری پیر و بیحواس شدم.

به هر حال:

کدت رو اینطوری کن :


(UserId = UserId) And
(dbo.DateOnly(:WorkDate) BETWEEN
:SDate And :EDate)

بعد هم :

DM.SpRepDtrDur.Parameters.ParamByName('EDate').Val ue := DateToDate;
DM.SpRepDtrDur.Parameters.ParamByName('SDate').Val ue := DateFromDate;


ممنون امتحان میکنم ببینم چه جوریا میشه.


توضیح هم داده بودم که نباید پارامترهای ADO رو با پارامترهای SQL اشتباه بگیری...
خدا عاقبتم رو بخیر کنه


فقط اینکه من خیلی نمیفهمم . این معنیش اینه که این ها پارامترهاشون همیشه باهم همخوانی ندارند ؟
من همیشه پارامترهام رو با همون @ استفاده میکردم. ممکن این جاهای دیگه هم اشکال درست کنه ؟

vcldeveloper
پنج شنبه 26 دی 1387, 12:31 عصر
نباید پارامترهای ADO رو با پارامترهای SQL اشتباه بگیری...
نه علیرضا، کوئری توی دلفی نیست، SP نوشته. بخاطر همین هم از @ استفاده کرده. اگر کوئری را در دلفی می نوشت باید از : استفاده می کرد.

Mahyaa
پنج شنبه 26 دی 1387, 13:48 عصر
نه علیرضا، کوئری توی دلفی نیست، SP نوشته. بخاطر همین هم از @ استفاده کرده. اگر کوئری را در دلفی می نوشت باید از : استفاده می کرد.


همینطوره !

من امتحان کردم وقتی کوئری رو توی دلفی مینویسم درست جواب میگیرم. ولی توی SP یک اشکالی وجود داره انگاری !

تنظیمات تاریخ و ساعت خود XP دخالتی توی این نداره که! داره ؟

ghabil
پنج شنبه 26 دی 1387, 18:44 عصر
راست میگی دست نخوندمش علی شرمنده...

ببین اون مشکل دو روز تفاوت زمان دلفی و اسکیوال میتونه باشه بهترین راحش هم اینه که بجای اینکه از نوع TDateType بفرستی زمان رو به شکل استرینگ بفرستی، اما کلا همیشه برای حل این مشکلات یک راه حل خیلی ساده هست : استفاده از Profiler.

با اینکه احتمالا خودت میدونی : چروفایلر یک برنامست جزو برنامه هایی که همراه SQL Server نصب میشه که باهاش میتونی هر کوئی که به اسکیوال سرور فرستاده میشه رو ببینی . بعد میتونی اون کودری رو برداری ببری توی SQL ANalyzer یکمی باهاش ور بری تا مشکلش رو پیدا کنی ، ضمنا برای تست توی این مورد یک بار این کوئری رو ران کن :


Select dbo.DateOnly(WorkDate)

ببین چی برمیگرده، که البته بجای WORKDate مقداری که پاس شده رو بزار...
[/code]