none
条件に合った値を、データベースから抽出するには? RRS feed

  • 質問

  • お世話になっております。

    主キーが、DateTime型の日時が入っています。

    このデータを、現在時刻と比較して出力させたいと思います。

    但し、複数ヒットしたとしても、最初にヒットしたデータを出力させたいと思います。

       Private Sub ButtonFind_Click(sender As Object, e As EventArgs) Handles ButtonFind.Click
    
        dim dTbl As DataTable
            dTbl = MailDataSet.Tables("mail_t")
     
           Dim str As String
    
            ' 現在の日付と時刻を取得する
            Dim dtNow As DateTime = DateTime.Now
    
            ' 取得した日付と時刻を表示する
            Debug.WriteLine(dtNow.ToString())
    
            str = "日時 <= '"
            str &= dtNow.ToString()
            str &= "'"
    
            Debug.WriteLine(str)
    
            If dTbl.Select(str).Length > 0 Then
                '対象レコードが存在する場合の処理
                Debug.WriteLine(dTbl.Select(str).ToString)
            Else
                '対象レコードが存在しない場合の処理
                Debug.WriteLine("対象レコードが存在しない")
            End If
    
        End Sub
    

    このコードを実行すると、次の結果になりました。

    日時 <= '2013/05/05 23:18:09'
    dbtest.mailDataSet+mail_tRow[]


    ヒットしたであろう「mail_tRow」の値を、Debug.WriteLineで表示させたいと思います。

    どうしたら良いでしょうか。

    ご教授をお願いします。


    2013年5月5日 15:03

回答

  • Azuleanさん

    Debug.WriteLine(dTbl.Select(str)(0).Item("num").ToString())

    としても、実行できました。(numは任意の列名)

    Select(str)(0) とできるとは、気づきませんでした。

    コードに無駄がなくなり、スッキリしますが、私には少し分かりづらいです。

    • 回答としてマーク taokato 2013年5月6日 7:15
    2013年5月6日 3:18

すべての返信

  • if の中で、select したデータを一旦 list などに移して、その list の最初のデータを抜き出せば良いかと思います。

    "num"の部分は、列名です。

    Dim List = dTbl.Select(str).ToList()
    Debug.WriteLine(List(0).Item("num").ToString())
    
    • 編集済み kentahoga 2013年5月5日 17:18
    • 回答としてマーク taokato 2013年5月6日 1:59
    • 回答としてマークされていない taokato 2013年5月6日 2:19
    2013年5月5日 17:11
  • kentahoga 様

    ありがとう御座います。

    dTbl.Select(str).ToList()

    のところで、「ToListは、SystemArrayのメンバーではありません」というエラーメッセージが出てしまいます。

    これに対する対応方法を教えて頂けませんか。

    よろしくお願いします。


    • 編集済み taokato 2013年5月6日 2:24
    2013年5月6日 1:59
  • Dim list = dTbl.Select(str) と入力して、ドット . を入力すると、次の候補が表示されましたか?

    その中から、ToList を選択して、()をつけて下さい。

    上記でできない場合は、もう少し周辺のコードがないと分かりかねます。


    • 編集済み kentahoga 2013年5月6日 2:48
    2013年5月6日 2:36
  • 横から見て思ったんですが、配列が来ているなら ToList せずとも、dTbl.Select(str)(0).ToString() みたいにはいかないものでしょうか。

    2013年5月6日 2:50
    モデレータ
  • Azuleanさん

    Debug.WriteLine(dTbl.Select(str)(0).Item("num").ToString())

    としても、実行できました。(numは任意の列名)

    Select(str)(0) とできるとは、気づきませんでした。

    コードに無駄がなくなり、スッキリしますが、私には少し分かりづらいです。

    • 回答としてマーク taokato 2013年5月6日 7:15
    2013年5月6日 3:18
  • Select(str)(0) とできるとは、気づきませんでした。
    コードに無駄がなくなり、スッキリしますが、私には少し分かりづらいです。

    であれば、配列のまま変数に代入するとわかりやすくなると思います。

    ToList メソッドを呼ぶことは、小さいながらも実行コスト&メモリコストを上げることにつながるので、必要がない場合は避けた方がよいでしょう。

    2013年5月6日 3:24
    モデレータ
  • Azulean さん

    Dim result As Array = dTbl.Select(str)
    Debug.WriteLine(result(0).Item("num").ToString())

    ということですね。ありがとうございます。

    これなら、実行コストを少しは軽減でき、理解しやすいコードになりました。


    taokato さん

    私の質問スレッドではないのに話がすすんでしまい、申し訳ありません。

    上記を参考にテストができたら、また結果を投稿をお願いします。

    • 編集済み kentahoga 2013年5月6日 3:44
    2013年5月6日 3:42
  • ありがとう御座います。

    結果として、

    Debug.WriteLine(dTbl.Select(str)(0).Item("num").ToString())

    これで、うまく行きました。

    2013年5月6日 7:17
  • kentahoga さん

    お蔭さまで、解決出来ました。

    ありがとう御座いました。

    2013年5月6日 7:19
  • taokatoさん

    スレッドが終了しているのですが、可能でしたら今後の参考に教えて頂ければ幸いです。

    >>Dim list = dTbl.Select(str) と入力して、ドット . を入力すると、次の候補が表示されましたか?

    >>その中から、ToList を選択して、()をつけて下さい。

    と返信させて頂いたのですが、試して頂けましたでしょうか?

    最終的には違った方法を採用されたとのことですが、もしこちらも試されていたら、今後の参考になりますので結果を教えて頂けますでしょうか。

    2013年5月7日 6:46
  • >>Dim list = dTbl.Select(str) と入力して、ドット . を入力すると、次の候補が表示されましたか?

    >>その中から、ToList を選択して、()をつけて下さい。

    と返信させて頂いたのですが、試して頂けましたでしょうか?

    コンパイルエラーになったのですから、「.」と打っても、候補に表示されることは無いと思いますよ。

    エラーメッセージからすると、Array.ToList メソッドと誤解されていたようなので、
    恐らくは、拡張メソッドが使えない環境(VB2005など)をお使いだったのではないでしょうか。

    2013年5月8日 14:33
  • 魔界の仮面弁士さん

    使用環境は伺えておりませんでしたので、その可能性がありますね。

    ご説明頂きまして、ありがとうございます。

    ただ、以前の質問 のキャプチャ画面を見ると新しいVSの気がします。。。
    • 編集済み kentahoga 2013年5月9日 5:18 最後に一行追記
    2013年5月9日 5:14
  • ただ、以前の質問 のキャプチャ画面を見ると新しいVSの気がします。。。

    最初の投稿で ByVal が省略されていることから、少なくとも VS2010 SP1 以降だろうとは予想しています。(Dim が dim と書かれていることから、フォーラム投稿時に修正した可能性も無いわけではありませんが)

    しかし、たとえ VS2012 を使用していたとしても、旧バージョンのプロジェクトをアップグレードした場合などにおいて、拡張メソッドが使えないことがありえます。具体的には以下のようなケースです。

    • System.Linq名前空間がインポートされていない場合。
    • ターゲットフレームワークが .NET Framework 3.0 以下になっていた場合。
    2013年5月9日 6:19
  • しかし、たとえ VS2012 を使用していたとしても、旧バージョンのプロジェクトをアップグレードした場合などにおいて、拡張メソッドが使えないことがありえます。具体的には以下のようなケースです。

    • System.Linq名前空間がインポートされていない場合。
    • ターゲットフレームワークが .NET Framework 3.0 以下になっていた場合。

    魔界の仮面弁士さん

    なるほど!確かにこのような場合は使用できないですね。全く気づいていませんでした。

    大変勉強になります、ありがとうございます。

    2013年5月9日 7:36