0

XMLファイルがあります:

<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に表示します。データを表示する日付の範囲を指定できるようにしたい。たとえば、要素にINSERTDATEとINSERTDATEの間の日付が含まれている場合。これを行うために、私は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演算子を使用して、要素の最初の部分のみに基づいて検索します。

よろしくお願いします。

敬具。

4

4 に答える 4

0

「2009-09-27」などの日付部分のみを返すように、EscapeLikeValue() メソッドを変更/置換できると仮定します。このようにして、フィルターを次のように書き換えることができます。

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

HTH、デジャン

于 2009-07-28T13:44:30.070 に答える
0

これを行う 1 つの方法は、日付文字列パラメーターを実際の日時オブジェクトに変換することです。

 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());
于 2009-07-28T13:45:47.993 に答える
0

次のことができるかどうか疑問に思います。

custDV.RowFilter = String.Format("(Convert(DateTime,'System.DateTime' >= #{0}# AND Convert(DateTime,'System.DateTime' <= #{1}#)", EscapeLikeValue(date1), EscapeLikeValue(date2));
于 2009-07-28T13:46:55.247 に答える
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;
            }
于 2009-07-28T14:02:28.800 に答える