DateTimePicker가있는 SQL 문
-
05-07-2019 - |
문제
이것은 희망적으로 간단한 것이되어야합니다. 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...
}
}
}