c#
  • sql
  • winforms
  • datetime
  • datetimepicker
  • 2009-09-09 4 views 2 likes 
    2

    Это, надеюсь, будет простым. При использовании сборщика дата время в форме окна, я хочу SQL-оператор будет осуществляться, например, так:SQL-оператор с datetimepicker

    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; 
    

    Огромное спасибо за помощь!

    +0

    Я думаю Текст DateTimePicker в собственности не связано с текущей датой контроля –

    ответ

    9

    Только один ответ: используйте parametrized queries.

    Это не по разным причинам:.

    • безопасности (без риска SQL Injection
    • уже не те проблемы, на которые вы открываете тему
    • производительность

    Таким образом, напишите ваше заявление следующим образом:

    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

    +0

    +1: существуют параметризованные запросы по причине. И это не так, их можно игнорировать :) – MatBailie

    +0

    Это выглядит очень хорошо, и я хочу его использовать, но я не уверен, где взять его с этого момента. Обычно я бы заполнил новый адаптер данных с помощью sql-запроса, как бы я сделал это с этим? –

    +0

    DataAdapter имеет свойство SelectCommand, к которому вы можете назначить IDbCommand. (Если вы используете Sql Server: SqlCommand). SqlDataAdapter adapter = новый SqlDataAdapter(); SqlCommand cmd = new SqlCommand(); cmd.CommandText = "SELECT ..."; cmd.Parameters. .... adapter.SelectCommand = cmd; –

    0

    Прежде всего - у вас есть ль ft дверь для 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... 
         } 
        } 
    } 
    
    +0

    Я думаю, что текстовое свойство DateTimePicker не связано с текущей датой элемента управления –

    +0

    Это также не сработало - также возникает ошибка: «Преобразование типа данных char в тип данных даты и времени привел к тому, значение даты и времени диапазона. " Извините, я не упоминал об этом раньше, но я использую британскую систему дат. –

    +0

    Дэвид, может ли сказать мне, помогло ли мое решение? –

    1

    Try dtpJobDate.Value.

    1

    Другие, чем инъекции 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") + " + "'"; 
    
    +0

    Кажется, что это должно сработать, но с этим ничего не происходит. Попытка получить параметры, работающие выше. –

    +0

    Это ваш лучший выбор ... В любом случае учитывайте, что значения времени DateTimePickers включены в SQL-запрос с этим, поэтому вы хотели бы поместить формат DateTimePickers в Long или Custom –

     Смежные вопросы

    • Нет связанных вопросов^_^