Оператор SQL с datetimepicker
-
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;
Если вы хотите игнорировать время, то, я думаю, лучше всего выполнить поиск по диапазону, если время хранится в БД, то есть.Что-то вроде этого (только SQL-запрос):
SELECT * FROM Jobs WHERE JobDate >= @p_StartDate AND JobDate < @p_EndDate
StartDate тогда будет dtpJobDate.Value.Date
, и EndDate будет dtpJobDate.Value.Date.AddDays(1)
Если время не хранится в БД, вы можете сделать это:
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 Injection оставлен в примере для сравнения) ...
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...
}
}
}