Pergunta

Esta deve ser espero que um simples. Ao usar um selecionador de data e hora em formar uma janela, eu quero uma instrução SQL para ser realizada, assim:

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

Infelizmente, isso na verdade não fornecer qualquer resultado porque o campo JobDate é armazenado como um valor DateTime. Eu gostaria de ser capaz de procurar todos os registros que são, nesta data, não importa o que o tempo armazenado pode ser, de alguma ajuda?

Nova consulta:

        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;

Um grande obrigado por toda a ajuda!

Foi útil?

Solução

Apenas uma resposta: o uso parametrizada consultas .

Este é por razões diferentes:

  • segurança (sem risco de SQL Injeção
  • não esses problemas para os quais você está abrindo um tópico
  • performance.

Assim, escreva sua declaração como esta:

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

Se você quiser ignorar o tempo, então eu acho que a melhor aposta é a de fazer uma pesquisa intervalo, se o tempo é armazenado no DB, que é. Algo como isto (apenas a consulta SQL):

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

StartDate seria então dtpJobDate.Value.Date e EndDate seria dtpJobDate.Value.Date.AddDays(1)

Se o tempo não é armazenado no banco de dados, então você pode fazer isso:

SELECT * FROM Jobs WHERE JobDate = @p_Date

onde o argumento de pesquisa deve ser dtpJobDate.Value.Date

Outras dicas

Tente dtpJobDate.Value.

Outro do que o material de injeção SQL em outras respostas, você pode usar algo como isto:

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

Mas provavelmente você não vai encontrar nada com partida momento exato, para que possa alterar a sua consulta para algo como

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

Primeiro de tudo -. Você deixou a porta aberta para a injeção de SQL no seu exemplo

Outras que - para responder à sua pergunta, você vai ter que soltar as vezes fora da coluna JobDate para começar o jogo feito. Tente algo como isto (código SQL Injection deixado no exemplo de comparação) ...

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

Se você fosse para parametrizar sua consulta - você poderia fazer algo assim ...

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...
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top