문제

이것은 희망적으로 간단한 것이되어야합니다. Windows 양식에서 날짜 시간 선택기를 사용할 때 SQL 문을 수행하고 싶습니다.

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

불행히도, JobDate 필드가 DateTime 값으로 저장되므로 실제로는 결과를 제공하지 않습니다. 이 날짜에있는 모든 레코드를 검색하고 싶습니다. 시간이 무엇이든 상관없이 도움이 되겠습니까?

새로운 쿼리 :

        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;

모든 도움에 감사드립니다!

도움이 되었습니까?

해결책

단 하나의 답변 : 사용 매개 변수화 쿼리.

이것은 다른 이유입니다.

  • 보안 (위험 없음 SQL 주입
  • 더 이상 주제를 여는 문제가 아닙니다.
  • 성능.

따라서 다음과 같은 진술을 작성하십시오.

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

시간을 무시하고 싶다면 최선의 방법은 시간이 DB에 저장되면 범위 검색을 수행하는 것입니다. 이와 같은 것 (SQL 쿼리 만) :

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

그런 다음 StartDate가 될 것입니다 dtpJobDate.Value.Date, 그리고 종말은 될 것입니다 dtpJobDate.Value.Date.AddDays(1)

시간이 DB에 저장되지 않으면 다음을 수행 할 수 있습니다.

SELECT * FROM Jobs WHERE JobDate = @p_Date

검색 인수가 있어야합니다 dtpJobDate.Value.Date

다른 팁

dtpjobdate.value를 사용해보십시오.

다른 답변에서 SQL 주입품 외에 다음과 같은 것을 사용할 수 있습니다.

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

그러나 아마도 정확한 시간 일치로 아무것도 찾을 수 없으므로 쿼리를 변경할 수 있습니다.

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

우선 - 당신은 당신의 예에서 SQL 주입을 위해 문을 열어 두었습니다.

그 외에 - 당신의 질문에 답하기 위해서, 당신은 경기를 끝내려면 JobDate 열에서 시간을 떨어 뜨려야합니다. 이와 같은 것을 시도하십시오 (비교를 위해 예제에 남은 SQL 주입 코드) ...

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

당신이 당신의 쿼리를 매개 변수화한다면 - 당신은 이런 일을 할 수 있습니다 ...

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...
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top