2009-07-28 59 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,然後使用dataview而不是數據集填充datagridview。

目前,我有如下的方法:

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 2009-07-28 13:58:49

+0

請參閱http://www.ilearnttoday.com/dataview-row-filter-for-date-time使用數據視圖中的日期列中的運算符like – Syed 2015-02-27 11:13:48

回答

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"); 

HTH, 德揚

你可以做到這一點
0

的一種方法是將日期字符串參數轉換成實際的datetime對象,像這樣

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));