Frage

Dies sollte hoffentlich ein einfacher sein. Wenn ein Datum Zeitauswahl in einem Windows-Formular, ich möchte eine SQL-Anweisung ausgeführt werden, etwa so:

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

Leider funktioniert das eigentlich keine Ergebnisse liefern, weil das JobDate Feld als Datetime-Wert gespeichert. Ich möchte für alle Datensätze suchen kann, die zu diesem Zeitpunkt sind, egal, was die Zeit gespeichert sein kann, jede mögliche Hilfe?

Neue Abfrage:

        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;

Ein großes Dankeschön für all die Hilfe!

War es hilfreich?

Lösung

Nur eine Antwort: Verwenden Sie parametrisierte Abfragen .

Dies ist aus verschiedenen Gründen:

  • Sicherheit (keine Gefahr von SQL Injection
  • nicht mehr jene Probleme, für die Sie öffnen ein Thema
  • Leistung.

So schreiben Sie Ihre Aussage 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 denke ich, die beste Wette ist eine Bereichssuche zu tun, wenn die Zeit, in der DB gespeichert ist, das ist. So etwas wie diese (nur die SQL-Abfrage):

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

Startdate würde dann dtpJobDate.Value.Date werden und EndDate würde dtpJobDate.Value.Date.AddDays(1) werden

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

SELECT * FROM Jobs WHERE JobDate = @p_Date

, wo das Suchargument dtpJobDate.Value.Date sollte

Andere Tipps

Versuchen dtpJobDate.Value.

Anders als die SQL-Injection-Sachen in anderen Antworten, Sie so etwas wie diese verwenden können:

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

Aber wahrscheinlich werden Sie nichts mit genauer Zeit Übereinstimmung finden, so können Sie Ihre Abfrage für so etwas wie

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

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

Anders als das - Ihre Frage zu beantworten, müssen Sie die Zeiten aus der JobDate Spalte fallen müssen das Spiel getan. Versuchen Sie so etwas wie dieser (SQL-Injection-Code links in Beispiel zum Vergleich) ...

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

Wenn Sie waren Ihre Anfrage zu parametrieren - man könnte es so etwas tun ...

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...
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top