2016-07-09 5 views
1

Ich habe versucht, das Ergebnis abhängig von zwei Daten zu erhalten, die der Benutzer überprüft hat. Ich habe zwei datetimepicker Kontrollen. Ich möchte, dass der Benutzer das "von" Datum und "bis" Datum, wählt, dann erhalten die Abfrage spezifische Ergebnisse.C# Abfrage zum Vergleichen von DateTime mit SQL-Nvarchar-Datum generieren Spalte

leaving_time Spaltentyp ist nvarchar

Dies ist meine Frage:

SELECT name, mil_no, rotba, arrival_time, leaving_time, day, year 
FROM dbo.Hodor_data 
WHERE leaving_time BETWEEN '"+dateTimePicker1.Checked.ToString()+ "' AND '" + dateTimePicker2.Checked.ToString() + '" 

Wo liegt der Fehler?

+2

Verwendung parametrisierte Abfragen zurückzukehren. –

+0

Mögliches Duplikat von [Datetime-Format in SQL-Format mit C#] (http://stackoverflow.com/questions/17418258/datetime-format-to-sql-format-using-c-sharp) –

+0

Welchen Fehler bekommen Sie? Wenn keine Fehler zeigen Beispieldaten – objectNotFound

Antwort

1

Geprüft ist eine boolesche Eigenschaft, und es ist nicht das Datum. Sie müssen die Value-Eigenschaft verwenden. Es ist besser, Parameter hinzuzufügen und den Typ explizit anzugeben, damit der Konflikt im Datumsformat gelöst wird.

Edit: Wenn Spaltentyp in SQL Server NVARCHAR und Format MM/dd/yyyy ist, müssen Sie ONVERT(DATETIME, leaving_time, 101) verwenden:

conn.Open(); 
SqlDataAdapter dataAdapter = 
    new SqlDataAdapter("SELECT name, mil_no, rotba, arrival_time, leaving_time, day, year " 
        + "FROM dbo.Hodor_data where CONVERT(DATETIME, leaving_time, 101) " 
        + "BETWEEN @p1 AND @p2", conn); 

SqlParameter fromDate = new SqlParameter("@p1", SqlDbType.DateTime2); 
fromDate.Value = dateTimePicker1.Value; 
SqlParameter toDate = new SqlParameter("@p2", SqlDbType.DateTime2); 
toDate.Value = dateTimePicker2.Value; 

dataAdapter.SelectCommand.Parameters.Add(fromDate); 
dataAdapter.SelectCommand.Parameters.Add(toDate); 

DataTable dt = new DataTable(); 
dataAdapter.Fill(dt); 
dataGridView1.DataSource = dt; 
conn.Close() 

Sie wirklich leaving_time die Art der Änderung Spalte betrachten sollte eine Datetime-Spalte zu sein. Dies wird Ihr Leben bei der Abfrage erleichtern. Ich kann keinen wirklichen Vorteil darin sehen, diese Werte als Text zu speichern.

+0

wird nichts angezeigt –

+0

@amrkamal können Sie den gesamten Code anzeigen? Auf diese Weise führen Sie die Abfrage aus und erstellen das Befehlsobjekt. – user3185569

+0

conn.Open(); SqlDataAdapter dataAdapter = neuer SqlDataAdapter ("SELECT-Name, mil_no, rotba, Ankunftszeit, leaving_time, Tag, Jahr FROM dbo.Hodor_data wobei leaving_time BETWEEN '" + dateTimePicker1.Value + "' AND '" + dateTimePicker2.Value.ToString ("") + "'", conn); DataTable dt = neue DataTable(); dataAdapter.Fill (dt); dataGridView1.DataSource = dt; conn.Close(); –

3

Sie sollten parametrisierte Abfragen schreiben und keine String-Verkettung für die Übergabe der Parameter verwenden, um einen SQL-Befehl zu erstellen. Die Verwendung von String-Verkettung macht Sie anfällig für SQL-Injektionen.

var cmdText = @"SELECT ... 
       FROM dbo.Hodor_data 
       WHERE leaving_time BETWEEN @StartDate AND @EndDate"; 

var sqlCommand = new SqlCommand(cmdText, connection); 
sqlCommand.Parameters.AddWithValue("@StartDate", dateTimePicker1.Value); 
sqlCommand.Parameters.AddWithValue("@EndDate", dateTimePicker2.Value); 

wo connection ist Ihr SQL-Verbindungsobjekt.

+0

Checked ist keine DateTime-Eigenschaft. – user3185569

+0

Dieser Code verwendet die Checked-Eigenschaft nicht, und Sie sollten @ user3185569 nicht verwenden. Verwenden Sie einfach den Wert - es ist ein "DateTime" -Typ – Plutonix

+0

@ user3185569 aus diesem Grund habe ich es in "Value" geändert. Danke – Christos

2

Versuchen dateTimePicker1.Text in dateTimePicker1_ValueChanged Ereignis zu verwenden, wo Sie dateTimePicker2.Checked verwenden, die true oder false nicht den Wert von Datum

+0

kein Ergebnis wird angezeigt :( –

Verwandte Themen