2009-07-28 2 views
0

У меня есть файл XML:C# DataView Диапазон дат с помощью LIKE-оператора?

<SMS> 
    <Number>+447761692278</Number> 
    <DateTime>2009-07-27T15:20:32</DateTime> 
    <Message>Yes</Message> 
    <FollowedUpBy>Unassigned</FollowedUpBy> 
    <Outcome></Outcome> 
    <Quantity>0</Quantity> 
    <Points>0</Points> 
    </SMS> 
    <SMS> 
    <Number>+447706583066</Number> 
    <DateTime>2009-07-27T15:19:16</DateTime> 
    <Message>STOP</Message> 
    <FollowedUpBy>Unassigned</FollowedUpBy> 
    <Outcome></Outcome> 
    <Quantity>0</Quantity> 
    <Points>0</Points> 
    </SMS> 

Я использую XMLReader для чтения файла в наборе данных и отобразить его в DataGridView. Я хочу, чтобы указать диапазон дат для отображения данных. Например, если элемент содержит дату между INSERT DATE & INSERT DATE. Для этого я использую DATAVIEW и затем заполняю datagridview с помощью dataview вместо набора данных.

В настоящее время у меня есть метод, как показано ниже:

public void DisplayRecSmsByDateRange(string date1,string date2, string readDir) 
     { 
      DataSet ds = new DataSet("SMS DataSet"); 
      XmlDataDocument xmlDatadoc = new XmlDataDocument(); 
      xmlDatadoc.DataSet.ReadXml(readDir); 
      ds = xmlDatadoc.DataSet; 

      DataView custDV = new DataView(ds.Tables["SMS"]); 
      custDV.RowFilter = String.Format("(DateTime >= DateTime LIKE '{0}*' AND DateTime <= DateTime LIKE '{1}*')", EscapeLikeValue(date1), EscapeLikeValue(date2)); 
      this.dataGridView1.DataSource = custDV; 
     } 

Проблема заключается в том, что если вы посмотрите на файл XML, элемент содержит время, а также дату. Поскольку меня не интересует временная часть этого элемента, я бы использовал оператор «LIKE» для отображения данных из XML-файла на основе только части даты элемента. В результате этого, когда я пытаюсь выполнить логическую операцию, например, «Покажите мне данные для дат между 2009-07-27 и 2009-07-30», я получаю сообщение об ошибке, поскольку компилятор не нравится что я пытаюсь объединить LIKE-оператор с логическим оператором < =,> = (показано в приведенном выше методе). Есть ли способ обойти это? Мне нужно иметь возможность отображать данные между диапазоном дат, но использовать оператор LIKE для поиска, основанного только на первой части элемента.

Полезно оценить,

С уважением.

+0

Будет надеяться, что те не являются реальной Великобритания мобильного телефона номера, которые вы там разместили. – RichardOD

+0

Обратитесь к http://www.ilearnttoday.com/dataview-row-filter-for-date-time, чтобы использовать как оператор для столбца даты в dataview – Syed

ответ

0

небольшого изменения в способ удаления LIKE оператор работал ......

public void DisplayRecSmsByDateRange(string date1,string date2, string readDir) 
      { 
       DataSet ds = new DataSet("SMS DataSet"); 
       XmlDataDocument xmlDatadoc = new XmlDataDocument(); 
       xmlDatadoc.DataSet.ReadXml(readDir); 
       ds = xmlDatadoc.DataSet; 

       DataView custDV = new DataView(ds.Tables["SMS"]); 
       custDV.RowFilter = String.Format("(DateTime >= '{0}*' and DateTime <= '{1}*')", EscapeLikeValue(date1), EscapeLikeValue(date2)); 

       custDV.Sort = "DateTime"; 
       this.dataGridView1.DataSource = custDV; 
      } 
0

Я предполагаю, что вы можете изменить/заменить метод EscapeLikeValue() так, чтобы он возвращал только часть даты, например. "2009-09-27". Таким образом, вы можете переписать фильтр что-то вроде:

custDV.RowFilter = String.Format("(DateTime >= '{0}' AND DateTime <='{1}')", EscapeLikeValue(date1) + "T00:00:00", EscapeLikeValue(date2) + "T23:59:59"); 

НТН, Деяна

+0

Это не может быть правильно, потому что я хочу иметь возможность игнорировать значение времени полностью ..... Следовательно, использование оператора LIKE. Код, который вы опубликовали, просто изменит дату на конец, чего я не хочу. Я хочу, например, иметь возможность отображать данные, которые имеют значение элемента , например, 2009-07-09. Мне все равно, что содержит часть времени этого элемента. Оператор LIKE позаботится об этом, предоставив компилятору «Not Care» и выбрав только начало значения элемента . – Goober

0

Один из способов сделать это, чтобы преобразовать параметры строки даты в реальные объекты даты и времени, как и

DateTime dt = System.Convert.ToDateTime(date1); 
DateTime dt2 = System.Convert.ToDateTime(date2); 
dt2=dt2.AddDays(1); 

, а затем вы можете изменить ваш, где, как так

custDV.RowFilter=String.Format("DateTime>={0} and DateTime<{1}",dt.ToShortDateString(),dt2.ToShortDateString()); 
0

Интересно, если вы можете сделать следующее:

custDV.RowFilter = String.Format("(Convert(DateTime,'System.DateTime' >= #{0}# AND Convert(DateTime,'System.DateTime' <= #{1}#)", EscapeLikeValue(date1), EscapeLikeValue(date2)); 
Смежные вопросы