PDA

View Full Version : پارامتر از نوع تاریخ رو چه طور به کوئری پاس بدیم؟



Itist82
سه شنبه 22 بهمن 1387, 00:02 صبح
سلام
من این سوال رو سرچ کردم اما همش مربوط به دلفی بود!
یه تابعی هست که شرط یه کوئری رو می سازه و برای این کار از پارامتر استفاده می کنه (=رشته ها رو به هم کانکت نمی کنه). اما کوئری که ساخته می شه می گه نمی تونم از روی رشته ی ورودی تاریخ بسازم. این کد خلاصه شده ی برنامه است:

اینجا مقدار تاریخ از یه کنترل که خودمون ساختیم(cFromDate) خونده می شه و ریخته می شه توی یه متغیر رشته که در انتها، خروجی یه تابعه.


string fromDate = cFromDate.Date.date.ToString("yyyy/MM/dd");
.
.
.
return new SqlParameter("FromDate", string.Format("'{0}'", fromDate)
بعد تابع دیگه ای از این پارامتر استفاده می کنه تا نتیجه رو بین دو تاریخ محدود کنه اما پیغام می ده که:
Conversion failed when converting datetime from character string.

ببخشید کد رو کامل نذاشتم، طولانی وپیچیده بود.
ممنون از توجهتون و وقتی که می ذارید.

Itist82
سه شنبه 22 بهمن 1387, 16:46 عصر
هیچ کس جواب رو نمی دونه؟ تا الان هیچ کس با پاس دادن یه مقدار تاریخ به کوئری های پارامتری مشکل نداشته؟!!:متعجب:
من شکل های زیادی رو امتحان کردم، به جای کد بالا اینو هم نوشتم:


datetime fromDate = cFromDate.Date.date;
.
.
.
return new SqlParameter("FromDate", string.Format("'{0}'", fromDate)
توی کوئری هم با CONVERT سعی کردم پارامتر ورودی رو به تاریخ تبدیل کنم اما نشد و همچنان همون خطا رو می گیره.
ممنون می شم اگه می دونید چه کار باید کرد بگید.

majid325
سه شنبه 22 بهمن 1387, 22:17 عصر
ورودي تابع چي هست يه عدد ، يه متن هست! چيه يه مثال بزنيد ، بعد خود تابع رو هم بزاريد و بگين وردي بعد از تبديل در تابع به چه صورت تغيير ميكنه؟
راه حلش اينه كه خروجي رو ببيني چي هست و اونو تو Management Studio خود sql داخل يه كوئري بزاري .

Itist82
سه شنبه 22 بهمن 1387, 23:53 عصر
سلام
ممنون از جوابتون. توی پست اول گفته بودم که تاریخ رو از یه کنترل که خودمون ساختیم می خونه. cFromDate اسم اون کنترله و به کاربر اجازه ی انتخاب یه تاریخ رو می ده که به شکل گفته شده به اون مقدار می شه دسترسی داشت. نوع داده cFromDate.Date.date هم از نوع datetime است. کپی کردن کد تقریبا فایده نداره چون خیلی طولانیه و یه ساعت باید فقط فکر کنید سر ساختارش که چی به چیه و خودش یه تاپیک می شه! به همین خاطر سعی کردمفقط خطوط مهم رو بیارم. مطمئنم مسئله توی همین چند تا خطه چون خود کوئری رو توی SQL Server اجرا کردم و مشکل نداشته. چیزی مثل این:

SELECT dbTransactions.id, dbTransactions.Number, dbTransactions.Date,
dbTransactions.TransactionType, dbTransactions.amount,
ISNULL(NULLIF(DBPerson.firstName + ' ' + DBPerson.lastName, ' '), '') as personname,
p1.firstname + ' ' + p1.lastname userName

FROM DBPerson RIGHT JOIN
dbTransactions ON DBPerson.id=dbTransactions.personid INNER JOIN
DBPerson p1 ON dbTransactions.UserId = p1.id
AND dbTransactions.Date between '2009-01-17' and '2009-01-20'اما متوجه شدم وقتی یه متغیر توی همون محیط اس کیو ال سرور از نوع کاراکتر تعریف کنم و تاریخ رو که الان توی سینگل کوتیشنه بریزم توش و بذارم تو شرط، همین خطا رو می ده. تابع CONVERT هم فایده نداشت. بعد امتحان کردم که تاریخ رو چه به صورت رشته دربیارم (توی سی شارپ، مثل خط دوم کد پست اول) و چه با همون فرمت datetime پاس بدم، هیچ فرقی نداشت!همون خطا رو میده.

بگين وردي بعد از تبديل در تابع به چه صورت تغيير ميكنه؟ این پارامتر (SQLParameter) که خروجی تابعه هیچ تغییری نمی کنه و مستقیم می ره که پارامتر های کوئری رو تشکیل بده

majid325
چهارشنبه 23 بهمن 1387, 04:23 صبح
آخر سر، اون چيزي كه من ميخواستم رو به من نگفتيد !
يه مثال بزنيد از مقداري كه به عنوان تاريخ ميفرستيد مثلا : "2005" و "2005/11/11" و "2005-11-11"
اصلان تاريخ شمسي هست يا ميلادي ؟
من با كد زير الان تست كردم مشكلي نداشت:

SqlCommand cmd = new SqlCommand("Select * from Student where date > @date ",cnn );
DataSet ds = new DataSet();
cmd.Parameters.AddWithValue("@date", this.dateDateTimePicker.Text);

SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds, "Student");

dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = ds.Tables[0];

MessageBox.Show(cmd.CommandText.ToString() + "\n" + cmd.Parameters[0].Value.ToString());

Mhs.Trace
چهارشنبه 23 بهمن 1387, 08:55 صبح
كلا از كوئري هاي پرامتريك استفاده كنيد بهتره مثله همين كاري كه دوستمون انجام دادن

Itist82
چهارشنبه 23 بهمن 1387, 11:31 صبح
آخر سر، اون چيزي كه من ميخواستم رو به من نگفتيد !
يه مثال بزنيد از مقداري كه به عنوان تاريخ ميفرستيد مثلا : "2005" و "2005/11/11" و "2005-11-11"
اصلان تاريخ شمسي هست يا ميلادي ؟

[
بازم ممنون از جوابتون، تاریخ میلادیه. من هر دو شکل رو امتحان کردم: "2009/02/10" (به جای اسلش از - و . هم استفاده کردم) و همین طور به صورتی که ساعت هم داشته باشه. البته کنترلی که روی فرم هست و تاریخ رو می گیره امکان انتخاب ساعت رو نمی ده. فقط تاریخ.
توی کد شما دیدم چون از پروپرتی Text می خونید حتما از نوع رشته است دیگه، من هم رشته و هم datetime رو امتحان کردم بازم نشد. انگار مثلا یه مشت کاراکتر بی معنی بهش پاس دادم که نمی تونه تبدیلشون کنه! در صورتی که trace کردم دیدم درست به شکل "2009/02/10" بود.


كلا از كوئري هاي پرامتريك استفاده كنيد بهتره مثله همين كاري كه دوستمون انجام دادندوست عزیز ممنون ولی معلومه که دارم از پارامتر استفاده می کنم، مسئله این نیست.

majid325
چهارشنبه 23 بهمن 1387, 22:43 عصر
به جواب رسيدي يا نه؟
تو كدي كه در پست اول گزاشتي از تك كويشن ( ' ) اول و آخر تاريخ استفاده كردي ! اين در Management Studio
مشكلي نداره .

AND dbTransactions.Date between '2009-01-17' and '2009-01-20'
ولي در زماني كه كوئري رو در زمان اجرا به sql پاس ميديد در مورد تاريخ و روش پارامتريك مشكل داره اگه دقت كني من هم در پست 5 از تك كوتيشن استفاده نكردم.

Itist82
پنج شنبه 24 بهمن 1387, 12:43 عصر
خیلی ممنون و متشکر از وقتی که گذاشتید، حل شد! اچندین حالت رو امتحان کردم نشده بود، این یکی به ذهنم نرسیده بود!
یه چی هم بگم شاید به درد بقیه بخوره، من تک کوتیشن رو که برداشتم اول این خطا رو گرفت: Arithmetic overflow error converting expression to data type datetime.
بعد رفتم جای ماه و روز و سال رو عوض کردم یعنی به جای کد پست اول:


string fromDate = cFromDate.Date.date.ToString("yyyy/MM/dd");
.
.
.
return new SqlParameter("FromDate", string.Format("'{0}'", fromDate
اینو نوشتم:



string fromDate = cFromDate.Date.date.ToString("MM/dd/yyyy");
.
.
.
return new SqlParameter("FromDate", string.Format("{0}", fromDate
اون خطا رو هم دیگه نگرفت!
بازم ممنونم ازتون خیلی لطف کردید!:قلب: