2 Stimmen

SQL-Anweisung mit Datetimepicker

Dies sollte hoffentlich eine einfache Angelegenheit sein. Wenn ich eine Datums- und Zeitauswahl in einem Windows-Formular verwende, möchte ich, dass eine SQL-Anweisung ausgeführt wird, etwa so:

string sql = "SELECT * FROM Jobs WHERE JobDate = '" + dtpJobDate.Text + "'";

Leider liefert dies keine Ergebnisse, da das Feld JobDate als DateTime-Wert gespeichert ist. Ich möchte in der Lage sein, nach allen Datensätzen zu suchen, die an diesem Datum liegen, unabhängig von der gespeicherten Uhrzeit. Kann mir jemand helfen?

Neue Anfrage:

        SqlDataAdapter da2 = new SqlDataAdapter();
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate";
        cmd.Parameters.Add ("@p_StartDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date;
        cmd.Parameters.Add ("@p_EndDate", SqlDbType.DateTime).Value = dtpJobDate.Value.Date.AddDays(1);
        cmd.Connection = conn;
        da2.SelectCommand = cmd;
        da2.Fill(dt);
        dgvJobDiary.DataSource = dt;

Herzlichen Dank für die Hilfe!

10voto

Frederik Gheysels Punkte 54908

Nur eine Antwort: Verwenden Sie parametrisierte Abfragen .

Dies hat verschiedene Gründe:

  • Sicherheit (kein Risiko von SQL Injektion
  • nicht mehr die Probleme, für die Sie ein Thema eröffnen
  • Leistung.

Schreiben Sie Ihre Erklärung also wie folgt:

SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM Jobs WHERE JobDate = @p_Date"
cmd.Parameters.Add ("@p_Date", SqlDbType.DateTime).Value = dtpJobDate.Value;

Wenn Sie die Zeit ignorieren wollen, dann ist es am besten, eine Bereichssuche durchzuführen, wenn die Zeit in der DB gespeichert ist, das heißt. Etwas wie dieses (nur die SQL-Abfrage):

SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate

StartDate würde dann lauten dtpJobDate.Value.Date und EndDate würde lauten dtpJobDate.Value.Date.AddDays(1)

Wenn die Zeit nicht in der DB gespeichert ist, können Sie dies tun:

SELECT * FROM Jobs WHERE JobDate = @p_Date

wobei das Suchargument sein sollte dtpJobDate.Value.Date

1voto

John Punkte 15906

Versuchen Sie dtpJobDate.Value.

1voto

Abgesehen von dem SQL-Injection-Zeug in anderen Antworten, können Sie so etwas verwenden:

dtpJobDate.Value.ToString("yyyyMMdd HH:mm:ss");

Wahrscheinlich werden Sie aber nichts finden, was genau der Zeit entspricht, also können Sie Ihre Abfrage ändern in etwas wie

string sql = "SELECT * FROM Jobs WHERE JobDate BETWEEN '" + dtpJobDateStart.Value.ToString("yyyyMMdd HH:mm:ss") + "' AND '" + + dtpJobDateEnd.Value.ToString("yyyyMMdd HH:mm:ss") + " + "'";

0voto

Scott Ivey Punkte 39470

Zunächst einmal haben Sie in Ihrem Beispiel eine Tür für SQL-Injection offen gelassen.

Abgesehen davon - um Ihre Frage zu beantworten - müssen Sie die Zeiten aus der Spalte JobDate entfernen, um den Abgleich zu erhalten. Versuchen Sie etwas wie dies (SQL-Injection-Code im Beispiel zum Vergleich gelassen)...

string sql = "SELECT * FROM Jobs WHERE CAST(CONVERT(CHAR(8), JobDate, 112) AS DATETIME) = '" + dtpJobDate.Text + "'";

Wenn Sie Ihre Abfrage parametrisieren würden, könnten Sie das etwa so machen...

using (var conn = new SqlConnection(myConnectionString))
using (var cmd = new SqlCommand("SELECT * FROM Jobs WHERE JobDate = @JobDate", conn))
{
    cmd.Parameters.Add(new SqlParameter("@JobDate", dtpJobDate.Value));

    conn.Open();
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // your code here to deal with the records...
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X