2017-02-02 2 views
-1

ich diesen Code-Block in einer Form von mir haben,Auswahlabfrage zwischen zwei Terminen arbeiten nicht

using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.ConString)) 
{ 
    query = "select SUM(TotalMinutes) as TotalMin, SUM(OTMinutes) as OTMin from EmpLog where EmpID = @EmpID and LogDate >= @empdate1 and LogDate <= @empdate2"; 
    conn.Open(); 
    using (SqlCommand cmd2 = new SqlCommand(query, conn)) 
    { 
     cmd2.Parameters.AddWithValue("@empdate1", dtp_from.Value.ToString("yyyy-MM-dd")); 
     cmd2.Parameters.AddWithValue("@empdate2", dtp_to.Value.ToString("yyyy-MM-dd")); 
     cmd2.Parameters.Add(new SqlParameter() { ParameterName = "@EmpID", Value = listBox1.SelectedValue.ToString() }); 
     var da = new SqlDataAdapter(cmd2); 
     DataTable dt = new DataTable(); 
     da.Fill(dt);    

     decimal decminutes = Convert.ToDecimal(dt.Rows[0]["TotalMin]"].ToString()); 
     decimal decOTminutes = Convert.ToDecimal(dt.Rows[0]["OTMin"].ToString()); 

ich einen ähnlichen Code Arbeit an verschiedenen Formen gemacht haben, aber irgendwie wird dies nicht funktionieren. Ich habe versucht SqlDataReader, aber es wird nicht einmal in eine Weile Leser.Lese-Schleife gehen.

auch beim Ausprobieren der Abfrage über ssms funktioniert es wie erwartet. aber wenn ich andere Methoden wie sqldatareader versuche, geht es in Null Ausnahme.

EDIT: Ich habe versucht, die WHERE-Klausel aus meiner Abfrage zu entfernen, und ich kann die Zeilen zurückgeben.

aus irgendeinem Grund werden die datetimepicker-Werte nicht ordnungsgemäß mit den Werten in der Datenbank abgeglichen. auch wenn ich es in eine Zeichenfolge umgewandelt habe, stimmt es genau überein, aber wiederum, es gibt immer noch dbnull.

+0

Verwendung Wenn die Abfrage in SSMS funktioniert dann, warum Sie eine gespeicherte Prozedur schreiben nicht, dass wird den Datensatz zurückgeben. Sie können SqlDataReader einfach verwenden, um die Werte zu erfassen. Diese Praxis ist ebenfalls sehr bevorzugt. –

+0

Vielleicht nicht eine genaue doppelte Frage, aber sehen Sie die Antworten auf diese Frage: http://StackOverflow.com/Questions/425870/using-Datetime-in-SqlParameter-for-Stored-Procedure-Format-Fehler –

+0

Haben Sie überprüfen Sie, ob Ihre Parameter korrekt sind: '@ empdate2> = @ empdate1'? Es ist ein häufiger Fehler bei der Verwendung von "BETWEEN". – dnoeth

Antwort

4

Die BETWEEN Stichwort

Möglicherweise möchten Sie für die Überprüfung mit dem BETWEEN Schlüsselwort in SQL zu prüfen, ob ein Wert vorhanden ist in einem bestimmten Bereich, wie in diesem SQL-Beispiel demonstriert:

SELECT SUM(TotalMinutes) AS TotalMin, 
     SUM(OTMinutes) AS OTMin 
    FROM EmpLog 
WHERE EmpID = @EmpID 
    AND LogDate BETWEEN @empdate1 AND @empdate2" 

Vermeiden Unnötig Casting

Darüber hinaus möchten Sie möglicherweise vermeiden, Ihr Datum explizit zu übertragen Zeitwerte als Zeichenfolgen Der SQL-Provider sollte keine Probleme haben, diese Werte in ihre entsprechenden SQL-Äquivalente zu übersetzen.

sowohl jene Änderungen So anwenden, sollten Sie so etwas wie dieses geben:

using (var conn = new SqlConnection(Properties.Settings.Default.ConString)) 
{ 
    conn.Open(); 
    var query = "SELECT SUM(TotalMinutes) AS TotalMin, SUM(OTMinutes) AS OTMin FROM EmpLog WHERE EmpID = @EmpID AND LogDate BETWEEN @empdate1 AND @empdate2"; 
    using (var cmd = new SqlCommand(query, conn)) 
    { 
      cmd.Parameters.AddWithValue("@empdate1", dtp_from.Value); 
      cmd.Parameters.AddWithValue("@empdate2", dtp_to.Value); 
      cmd.Parameters.Add("@EmpID", listBox1.SelectedValue); 
      var da = new SqlDataAdapter(cmd2); 
      DataTable dt = new DataTable(); 
      da.Fill(dt);  

      // Other code omitted for brevity 
    }   
} 

Beispiel Datareader

using (var conn = new SqlConnection(Properties.Settings.Default.ConString)) 
{ 
    conn.Open(); 
    var query = "SELECT SUM(TotalMinutes) AS TotalMin, SUM(OTMinutes) AS OTMin FROM EmpLog WHERE EmpID = @EmpID AND LogDate BETWEEN @empdate1 AND @empdate2"; 
    using (var cmd = new SqlCommand(query, conn)) 
    { 
      cmd.Parameters.AddWithValue("@empdate1", dtp_from.Value); 
      cmd.Parameters.AddWithValue("@empdate2", dtp_to.Value); 
      cmd.Parameters.Add("@EmpID", listBox1.SelectedValue); 
      using(var reader = cmd.ExecuteReader()) 
      { 
       while(reader.Read()) 
       { 
        var minutes = Convert.ToDecimal(reader["TotalMin"]); 
        var otMinutes = Convert.ToDecimal(reader["OTMin"]); 

        // Do something here 
       } 
      } 
    }   
} 
+0

Vielen Dank, dass Sie sich die Zeit genommen haben, mir zu helfen. Allerdings habe ich Ihre Vorschläge oben versucht, ich bekomme den Fehler, Objekt kann nicht von DBNull auf andere Typen umgewandelt werden. – Seiren

Verwandte Themen