• ベストアンサー

VB.NETでソートされたデータセットの取得

データ数が数十万レコードのテーブルがあります。 ここから上位1000件のレコードをデータセットに取得したいと思います。 しかし、この時点でソートがかけられないのでビューを作成時にソート をすることになると思います。 レコード数が少ない場合は、これでもいいのですが、多くなると、データ セットに取得する時点でかなり時間がかかります。 この場合、どういった方法が最適でしょうか? リーダーを使うのが普通でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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

noname#27115
質問者

お礼

ありがとうございます。 もらったサンプルではTOP値で指定したレコード数が表示 されました。 私の作っているのではほとんど意味のない値ばかり表示 されていた上に、買った本のサンプルでは、SORTはView でしか実行されていなかったために勘違いしてしまいま した。 もう一度、自分のソースをよく見直してみようと思いま す。 なお、VB2005を使っています。

その他の回答 (3)

回答No.3

>Dim l_dstマスタ As DataSet >l_dstマスタ = データセット取得() >この時点でしょうか ん? >上位1000件のレコードをデータセットに取得 >しかし、この時点でソートがかけられないのでビューを作成時にソート と言われておりましたので、取得した後のデータセットをソートし、データセットに格納する方法を示したのです。 ですので最初の部分は、質問者さんの既存処理を表しております。 ちょっと整理しましょう。。。 >郵便番号データ(約12万件) >12万件のDatasetを取得しないと まず。。。 ・データベースは何でしょう?「オラクル?SQLサーバ?アクセス?などなど」 ・そのテーブル構成はどのようになっていますか。主にキーを知りたいです。 ・既存のデータセットを取得するときの文と、「300件ずつ」表示するための編集条件と、表示するためのソート条件 これらを示していただけませんか?

noname#27115
質問者

補足

すみません。中途半端で。 データは次のところから全フィールドをインポートしています。 フィールド名は仮に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値が生きてくるのですが・・・

noname#187541
noname#187541
回答No.2

こんにちは。 データセットを取得する時にSQL文を発行して取得していれば、上位1000件をソートするSQL文を発行出来ればいいと思います。 SQL文は 昇順での並べ替えの場合 SELECT フィード名 FROM テーブル名 WHERE 抽出条件 ORDER BY フィールド名 ASC 降順はASCをDESCにします。

回答No.1

早い/遅いは、 ・現場の環境 ・あなたが発行している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データロウズ)

noname#27115
質問者

補足

たとえば、郵便番号データ(約12万件)で、それを郵便番号順に300件ずつ表示するとします。 ソートする以前に12万件のDatasetを取得しないといけないのですが、この時点で非常に 時間がかかってしまいます。 Dim l_dstマスタ As DataSet l_dstマスタ = データセット取得() この時点でしょうか・・・

関連するQ&A

専門家に質問してみよう