- ベストアンサー
VB.NETでソートされたデータセットの取得
データ数が数十万レコードのテーブルがあります。 ここから上位1000件のレコードをデータセットに取得したいと思います。 しかし、この時点でソートがかけられないのでビューを作成時にソート をすることになると思います。 レコード数が少ない場合は、これでもいいのですが、多くなると、データ セットに取得する時点でかなり時間がかかります。 この場合、どういった方法が最適でしょうか? リーダーを使うのが普通でしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>最初は#2さんの回答のようにORDERを指定していましたが、それだと取得数(300)が取れなかったので、これは.NETの仕様かと思い、VIEWでORDERを指定しようと思いました。 もしかして.NET2005ですか? 件数の仕様は聞いた事がありませんが、2005はまだ触れてないので、正確にはわかりません。 私の.NET2002では普通に300件取れましたが、、、、 新規のプロジェクトを起こして、以下を実行したらどうなりますか? Imports System.Data.OleDb Module Module1 Sub Main() Dim l_strPath As String = "C:\県ALL.mdb" Dim l_strSQL As String = "" l_strSQL &= "SELECT TOP 300 * FROM KEN_ALL" & vbCrLf l_strSQL &= "WHERE(F7 Like '%府%')" & vbCrLf l_strSQL &= "ORDER BY F5 ASC, ID ASC" Dim l_cnn As New OleDbConnection( _ String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};", l_strPath) _ ) Dim l_cmd As New OleDbCommand(l_strSQL, l_cnn) Dim l_adp As New OleDbDataAdapter(l_cmd) Dim l_dst As New DataSet() l_adp.Fill(l_dst) MsgBox(l_dst.Tables(0).Rows.Count) End Sub End Module
その他の回答 (3)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
>Dim l_dstマスタ As DataSet >l_dstマスタ = データセット取得() >この時点でしょうか ん? >上位1000件のレコードをデータセットに取得 >しかし、この時点でソートがかけられないのでビューを作成時にソート と言われておりましたので、取得した後のデータセットをソートし、データセットに格納する方法を示したのです。 ですので最初の部分は、質問者さんの既存処理を表しております。 ちょっと整理しましょう。。。 >郵便番号データ(約12万件) >12万件のDatasetを取得しないと まず。。。 ・データベースは何でしょう?「オラクル?SQLサーバ?アクセス?などなど」 ・そのテーブル構成はどのようになっていますか。主にキーを知りたいです。 ・既存のデータセットを取得するときの文と、「300件ずつ」表示するための編集条件と、表示するためのソート条件 これらを示していただけませんか?
補足
すみません。中途半端で。 データは次のところから全フィールドをインポートしています。 フィールド名は仮にF1、F2、F3・・・としておきます。 http://www.post.japanpost.jp/zipcode/dl/kogaki.html それの他にIDというオートナンバーのフィールドをもちそれが 主キーです。テーブル名はKEN_ALLで、DBはAccessのMDBです。 SQLは "SELECT TOP 300 * FROM KEN_ALL WHERE(F7 Like '%府%')" という感じです。F7に都道府県名がはいっているとします。 最初は#2さんの回答のようにORDERを指定していましたが、 それだと取得数(300)が取れなかったので、これは.NETの 仕様かと思い、VIEWでORDERを指定しようと思いました。 "SELECT TOP 300 * FROM KEN_ALL WHERE(F7 Like '%府%') ORDER BY F5 ASC, ID ASC" oleDa = New OleDb.OleDbDataAdapter(SQL, oleCn) DAO、ADO、DataReaderだとTOP値が生きてくるのですが・・・
こんにちは。 データセットを取得する時にSQL文を発行して取得していれば、上位1000件をソートするSQL文を発行出来ればいいと思います。 SQL文は 昇順での並べ替えの場合 SELECT フィード名 FROM テーブル名 WHERE 抽出条件 ORDER BY フィールド名 ASC 降順はASCをDESCにします。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
早い/遅いは、 ・現場の環境 ・あなたが発行しているSQ ・テーブルのキー状態と、そのオブジェクト間の関連性 などなど、、、 全てを知らない限り、何も言えません。 それらのことは、質問をするより、 「現場で思いつくパターンの簡単なサンプルをテスト実行する」 というのが、普通だと思います。 データセットのソート方法は以下に記します。 ------------------------------------------------------------------ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ '何らかの関数で、あらかじめデータセットは取得出来ているものとする Dim l_dstマスタ As DataSet l_dstマスタ = データセット取得() +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 'ソートをして、データを抽出する(抽出条件 = Nothing/ソート条件のみ指定) Dim l_drwデータロウズ As DataRow() Dim l_strソート条件 As String = "カラム1 ASC, カラム2 DESC" l_drwデータロウズ = l_dstマスタ.Tables("テーブル名").Select(Nothing, l_strソート条件) '抽出結果を、新たなデータセットへマージする(データテーブルでもマージ可能) Dim l_dstデータセット As New DataSet() l_dstデータセット.Merge(l_drwデータロウズ)
補足
たとえば、郵便番号データ(約12万件)で、それを郵便番号順に300件ずつ表示するとします。 ソートする以前に12万件のDatasetを取得しないといけないのですが、この時点で非常に 時間がかかってしまいます。 Dim l_dstマスタ As DataSet l_dstマスタ = データセット取得() この時点でしょうか・・・
お礼
ありがとうございます。 もらったサンプルではTOP値で指定したレコード数が表示 されました。 私の作っているのではほとんど意味のない値ばかり表示 されていた上に、買った本のサンプルでは、SORTはView でしか実行されていなかったために勘違いしてしまいま した。 もう一度、自分のソースをよく見直してみようと思いま す。 なお、VB2005を使っています。