2009-07-28 10 views
0

Ich habe eine XML-Datei:C# DataView Datumsbereich mit LIKE Operator?

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

ich eine XMLReader verwenden, um die Datei in einen Datensatz zu lesen und in einem Datagridview angezeigt werden soll. Ich möchte in der Lage sein, einen Datumsbereich anzugeben, für den die Daten angezeigt werden. Zum Beispiel, wo das Element ein Datum zwischen INSERT DATE & INSERT DATE enthält. Um dies zu tun, verwende ich ein DATAVIEW und befüllen dann die Datagridview mit der Datenansicht anstelle der Datenmenge.

Zur Zeit habe ich eine Methode wie folgt:

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

Das Problem ist, dass, wenn Sie in der XML-Datei suchen, das Element die Zeit sowie das Datum enthält. Da ich mich nicht für den Zeitteil dieses Elements interessiere, würde ich die "LIKE" -Anweisung verwenden, um die Daten aus der XML-Datei basierend auf dem Datumsteil des Elements anzuzeigen. Als Ergebnis davon, wenn ich versuche, eine boolesche Operation auszuführen, um beispielsweise zu sagen - "Zeige mir die Daten für Daten zwischen 2009-07-27 und 2009-07-30", erhalte ich einen Fehler, da der Compiler dies nicht mag dass ich versuche, den LIKE-Operator mit den booleschen < =,> = Operatoren zu kombinieren (in der obigen Methode gezeigt). Gibt es einen Weg dahin? Ich muss in der Lage sein, Daten zwischen einer Reihe von Daten anzuzeigen, aber den Operator LIKE verwenden, um nur auf dem ersten Teil des Elements zu suchen.

Hilfe sehr geschätzt,

Mit freundlichen Grüßen.

+0

Hoffen wir, dass das keine echten UK Handy Zahlen, die Sie dort gepostet haben. – RichardOD

+0

Siehe http://www.ilearntoday.com/dataview-row-filter-for-date-time, um den gleichen Operator für die Datumsspalte in der Datenansicht zu verwenden. – Syed

Antwort

0

eine leichte Veränderung der Methode arbeitete der LIKE-Operator Entfernen ......

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

Ich gehe davon aus, dass Sie die EscapeLikeValue() -Methode ändern/ersetzen können, so dass es nur Datum Teil, z. "2009-09-27". Auf diese Weise können Sie die Filter so etwas wie umschreiben:

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

HTH, Dejan

+0

Das kann aber nicht stimmen, weil ich das ignorieren möchte Zeitwert vollständig ... Daher die Verwendung des LIKE-Operators. Der Code, den du gepostet hast, würde einfach ein Datum auf das Ende ändern, was ich nicht möchte. Ich möchte zum Beispiel Daten anzeigen können, die einen Elementwert von sagen 2009-07-09 haben. Es ist mir egal, was der Zeitteil dieses Elements enthält. Der LIKE-Operator kümmert sich darum, indem er dem Compiler erlaubt, "nicht zu beachten" und nur den Anfang des -Elementwerts auswählt. – Goober

0

Eine Möglichkeit, dies zu tun ist, um die Datum-String-Parameter in tatsächliche Datetime-Objekte wie

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

und dann können Sie ändern Ihre wo wie so

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

Ich frage mich, ob Sie Folgendes ausführen können:

custDV.RowFilter = String.Format("(Convert(DateTime,'System.DateTime' >= #{0}# AND Convert(DateTime,'System.DateTime' <= #{1}#)", EscapeLikeValue(date1), EscapeLikeValue(date2));