Question

Cela devrait être, espérons-le, simple. Lors de l'utilisation d'un sélecteur de date et d'heure dans un formulaire Windows, je souhaite qu'une instruction SQL soit exécutée, comme suit:

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

Malheureusement, cela ne donne aucun résultat car le champ JobDate est stocké en tant que valeur DateTime. J'aimerais pouvoir rechercher tous les enregistrements qui sont à cette date, quelle que soit l'heure stockée, aucune aide?

Nouvelle requête:

        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;

Un immense merci pour toute l'aide!

Était-ce utile?

La solution

Juste une réponse: utilisez les requêtes paramétrées .

C’est pour différentes raisons:

  • sécurité (aucun risque de SQL Injection
  • ces problèmes pour lesquels vous ouvrez un sujet
  • performances.

Ainsi, écrivez votre déclaration comme ceci:

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

Si vous souhaitez ignorer l'heure, alors je pense que le mieux est de faire une recherche de plage, si l'heure est stockée dans la base de données, c'est-à-dire. Quelque chose comme ça (juste la requête SQL):

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

StartDate serait alors dtpJobDate.Value.Date , et EndDate serait dtpJobDate.Value.Date.AddDays (1)

Si l'heure n'est pas stockée dans la base de données, procédez comme suit:

SELECT * FROM Jobs WHERE JobDate = @p_Date

où l'argument de recherche doit être dtpJobDate.Value.Date

Autres conseils

Essayez dtpJobDate.Value.

Autre que l'injection SQL dans d'autres réponses, vous pouvez utiliser quelque chose comme ceci:

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

Mais vous ne trouverez probablement rien qui corresponde à l'heure exacte, vous pouvez donc modifier votre requête, par exemple

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

Tout d'abord, vous avez laissé une porte ouverte à l'injection SQL dans votre exemple.

En dehors de cela - pour répondre à votre question, vous devrez supprimer les heures de la colonne JobDate pour que la correspondance soit effectuée. Essayez quelque chose comme ça (code d’injection SQL laissé dans l’exemple à titre de comparaison) ...

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

Si vous deviez paramétrer votre requête, vous pourriez le faire comme ceci ...

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...
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top