2016-08-09 99 views
0

Ich habe eine Sicht namens DailyVisitSummary. Wenn ich FromDate und ToDate auswähle, erzeugt es den Report, der rpt.VisitSummaryReport genannt wird, abhängig von den ausgewählten Daten.Die Umwandlung eines Varchar-Datentyps in einen Datetime-Datentyp führte zu einem Wert außerhalb des Bereichs. Fehler in MVC5

Ich verwende Crystal Reports, um Berichte zu generieren. Wenn ich meine Anwendung (auf meinem lokalen Rechner) ausführe, funktioniert der Bericht einwandfrei. Aber wenn ich meine Anwendung nach der Bereitstellung auf einem lokalen Host mit IIS Server überprüfen, funktioniert der Bericht nicht richtig. Es zeigt einen Fehler an. Der Fehler, der in dem Bild unten (zweite)

enter image description here

enter image description here

My VisitorsViewModel erwähnt wird;:

public DateTime ? FromDate { get; set; } 
public DateTime ? ToDate { get; set; } 

Meine Ansicht:

<div class="form-group"> 
@Html.LabelFor(model => model.FromDate) 
@Html.TextBoxFor(model => model.FromDate, new { @class = "form-control", type = "text" }) 
</div> 
<div class="form-group"> 
@Html.LabelFor(model => model.ToDate) 
@Html.TextBoxFor(model => model.ToDate, new { @class = "form-control", type = "text" }) 
</div> 

My jQuery Code:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"> </script> 
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" /> 
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script> 

<script> 
$("#FromDate").datepicker({ 
    dateFormat: "dd/mm/yy", 
    changeMonth: true, 
    changeYear: true, 
}); 

$("#ToDate").datepicker({ 
    dateFormat: "dd/mm/yy", 
    changeMonth: true, 
    changeYear: true, 
});</script> 

Mein Controller-Code:

public ActionResult VisitSummaryReport() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult GetDates(VisitorsViewModel VisitorsVM) 
{ 
     var fromdt = Convert.ToDateTime(VisitorsVM.FromDate); 
     var todt = Convert.ToDateTime(VisitorsVM.ToDate); 
     SqlConnection con = new SqlConnection(@"Data Source=192.168.0.73\SQLEXPRESS,14330;Initial Catalog=WafeERP_NEW;User ID=sa;Password=wafewin;"); 

     DataTable dt = new DataTable(); 

     try 
     { 
      con.Open(); 
      SqlCommand cmd = new SqlCommand("Select * from View_VisitorsForm where VisitingDate >='" + fromdt +"'and VisitingDate <= '" + todt +"'", con); 
      SqlDataAdapter adp = new SqlDataAdapter(cmd); 
      adp.Fill(dt); 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 

     ReportDocument rpt = new ReportDocument(); 
     rpt.Load(Server.MapPath("~/Areas/Sales/CrystalReports/rpt_VisitSummaryCrystalReport.rpt")); 
     rpt.SetDataSource(dt); 

     Stream stream = rpt.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat); 

     return File(stream, "application/pdf"); 
} 

Ich versuchte mein Bestes, mein Problem zu erklären. Jeder versteht mein Problem und hilft mir, dieses Problem zu lösen.

Vielen Dank im Voraus.

+2

Warum sind Ihre Eigenschaften 'string' anstelle von' DateTime'? –

+0

ok ich habe einen Versuch und lassen Sie Stephen kennen – Susan

+0

@StephenMuecke Sie fragen mich, meine Eigenschaft als Zeichenfolge von DateTime Right – Susan

Antwort

1

Sie haben eine Reihe von Problemen.

Zuerst vorausgesetzt, Sie den Benutzer wollen beide Daten in der Ansicht auswählen, sollten Sie Ihre Eigenschaften sein DateTime (nicht nullable) und umfassen eine @Html.ValidationMessageFor() für jede Eigenschaft dann in der POST-Methode, beginnen Sie mit

if(!ModelState.IsValid()) 
{ 
    return View(VisitorsVM); 
} 

Aber noch wichtiger ist, dass Sie sich selbst für SQL Injection-Angriffe öffnen, bei denen ein böswilliger Benutzer Zugriff auf Ihre Datenbank erhält oder diese einfach löschen kann. Ich empfehle Ihnen, these answers und andere Artikel über SQL-Injection-Angriffe zu lesen.Sie müssen Sie den Code ändern parametrisierte Abfragen verwenden

SqlConnection con = new SqlConnection(.....); 
DataTable dt = new DataTable(); 
try 
{ 
    SqlCommand command = new SqlCommand(); 
    command.CommandText = "Select * from View_VisitorsForm where VisitingDate >= @fromDate and VisitingDate <= @toDate"; 
    command.Parameters.Add("@fromDate", System.Data.SqlDbType.Date).Value = VisitorsVM.FromDate; 
    command.Parameters.Add("@toDate", System.Data.SqlDbType.Date).Value = VisitorsVM.ToDate; 
    command.Connection = con; 
    // con.Open(); 
    SqlDataAdapter adp = new SqlDataAdapter(command); 
    adp.Fill(dt); 
} 

Hinweis gibt es keine Notwendigkeit, die Verbindung zu öffnen - die .Fill() Methode öffnen und schließen, aber wenn Sie es verwenden, dann müssen Sie con.Close(); rufen nach .Fill()

würde ich auch empfehlen, dass dieser Code in einem separaten Dienst sein und nicht in einer Controller-Methode

Randbemerkung: Es besteht keine Notwendigkeit für new { type = "text" }) ist in Sie sehen. Die TextBoxFor()-Methode fügt das type="text"-Attribut bereits hinzu, sodass Sie den vorhandenen Wert einfach überschreiben.

0

Ich denke, es gibt ein Problem beim Überschreiten DateTime zu SqlCommand. Dafür können Sie es von here

überprüfen Ich hoffe, es würde Ihr Problem gelöst haben.

0

Sie müssen den Zeichenfolgenwert in SQL datetime konvertieren. Für das notwendige Datum Umwandlungsmuster finden Sie es in here.

SqlCommand cmd = new SqlCommand("Select * from View_VisitorsForm where VisitingDate >=CONVERT(datetime,'" + fromdt +"', 3) and VisitingDate <= CONVERT(datetime,'" + todt +"', 3)", con); 

ich wählen , weil Sie Ihre Datetime-Format als 'TT/MM/JJJJ' in Ihrem Client zu erklären.

+0

ok ich habe einen Versuch und lassen Sie wissen, Omer – Susan

+0

omer es funktioniert nicht. Ich erhalte diesen Fehler Konvertierung fehlgeschlagen beim Konvertieren von Datum und/oder Uhrzeit aus Zeichenkette. – Susan

+0

@Susan können Sie versuchen, diese Konversionsmuster-ID 'Select * von View_VisitorsForm wo VisitingDate> = CONVERT (Datetime, '10/10/2015 ', 103) und VisitingDate <= CONVERT (Datetime, '10/10/2017' , 103) ' –