PDA

View Full Version : مبتدی: کوئری با ارسال پارامتر از ویو به کنترلر



آنتریوم
سه شنبه 18 تیر 1392, 16:16 عصر
سلام

من میخوام ار ویو 2 تا پارامتر startdate و enddate رو به کوئری ارسال کنم میشه بگین کجای این کدم ایراد داره ممنون
این کد ویو هست:


@
using (Html.BeginForm())

{


<p>

از: @Html.TextBox(
"StartDate") &nbsp;

تا:@Html.TextBox(
"EndDate") &nbsp;


<input type="submit" value="Search" /></p>

}


این کد کوئری کنترلم:



public ActionResult myQuery(DateTime startDate, DateTime endDate)

{


var query = "SELECT numofproperty, dateofpurcahse "

+
"FROM Item"

+
"WHERE dateofpurchase between StartDate and EndDate";




var data = db.Database.SqlQuery<myItems>(query);


return View (data);

}


اصلا این طرز کوئری گرفتن درسته؟

gama_slv
سه شنبه 18 تیر 1392, 17:17 عصر
درسته.اما اگر از linq استفاده کنی خیلی بهتره و استاندار تره و می تونی هم تو view و هم تو کنترل کوئری بگیری .اگر با linq زیاد آشنا نیستی تبدیل کننده sql به linq از آدرس زیر بگیری
http://www.softpedia.com/get/Programming/Other-Programming-Files/Linqer.shtml

آنتریوم
سه شنبه 18 تیر 1392, 17:24 عصر
مرسی ولی این ارور میده اون assign بین مقادیر آرگومان ها و textBox رو به نظرم درست انجام نمیده اینم ارورش هست

The parameters dictionary contains a null entry for parameter 'startDate' of non-nullable type 'System.DateTime' for method 'System.Web.Mvc.ActionResult myQuery(System.DateTime, System.DateTime)' in 'mymvcapp.Controllers.itemController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters

hakan648
چهارشنبه 19 تیر 1392, 00:15 صبح
سلام
وقتی با یک ORM کار می کنید دیگه چرا دارید دستی کوئری می نویسید؟
اروری که دریافت کردید میتونه بخاطر خالی بودن مقدار ارسالی از View باشه. برای اینکه ارور نده و بتونید دستی چک کنید، به این شکل تغییرش بدید:
publicActionResult myQuery(DateTime? startDate, DateTime? endDate)

آنتریوم
چهارشنبه 19 تیر 1392, 10:13 صبح
دستی کوئری ننویسم چه کار کنم؟ میشه راهنماییم کنید؟ این طرز مقایسه ای که من با between انجام دادم رو پارامترام درسته؟ یا تو SQl query نمی تونم پارامتر وارد کنم؟

Saeed_m_Farid
چهارشنبه 19 تیر 1392, 10:40 صبح
دستی کوئری ننویسم چه کار کنم؟ میشه راهنماییم کنید؟ این طرز مقایسه ای که من با between انجام دادم رو پارامترام درسته؟ یا تو SQl query نمی تونم پارامتر وارد کنم؟
از کوئری های linq استفاده کنید (با فرض اینکه اسم context شما db_ باشه):
public ActionResult myQuery(DateTime startDate, DateTime endDate)
{
var model = from item in _db.Item
where (item.dateofpurchase >= startDate && item.dateofpurchase <= endDate)
select item;
return View (model);
}

EF خودش این رو تبدیل به کوئری های پارامتریک میکنه و این اشتباهات مهلک (جمع زدن رشته ها در کوئری که باعث راحت تر شدن حملات Sql ای میشه) دیگه تکرار نمیشه.
- اون خطا هم که میده، باید مدل خودتون رو بذارید اینحا (یا حداقل نوع dateofpurchase) که بشه گفت مشکل از کجاست؟

hakan648
چهارشنبه 19 تیر 1392, 11:23 صبح
شما باید حتما در مورد ORM ( احتمالا Entity Framework (http://www.dotnettips.info/Post/831) ) بیشتر مطالعه کنید.


دستی کوئری ننویسم چه کار کنم؟یکی از اهدف اصلی ORMها ، ایجاد لایه ی دسترسی به دیتا هست که در اون برنامه نویس فقط با کلاس سروکار داشته باشه، نه SQL خام!
پس در نهایت کدی باید بنویسید مشابه کدی که دوستمون قرار دادند.