- PR -

DataSetの再検索について

投稿者投稿内容
sarah
常連さん
会議室デビュー日: 2006/02/08
投稿数: 32
投稿日時: 2006-04-27 13:20
お疲れ様です。

 検索により取得したレコードが30000件程度あったとします。
 しかし表示用には1000件程度でいいので取得したレコードの
 最初から1000件だけを取得したい場合、30000件が格納されて
 いるDataSetを加工して1000件に絞り込むことはできるので
 しょうか?つまり2度検索を行うことなく1度目に取得した
 DataSetを再利用できないかということです。
Penguin
会議室デビュー日: 2006/03/01
投稿数: 13
投稿日時: 2006-04-27 13:35
DataViewクラスを使用すれば可能です。
RowFilterプロパティで条件絞込みも可能です。

Dim DataView1 as DataView = DataSet1.Tables("テーブル名").DefaultView
DataView1.RowFilter = "任意の条件"

#質問の趣旨を勘違いしていたようですね。
#失礼いたしました。m(__)m

[ メッセージ編集済み 編集者: Penguin 編集日時 2006-04-27 13:37 ]

[ メッセージ編集済み 編集者: Penguin 編集日時 2006-04-27 14:14 ]
Katze
ベテラン
会議室デビュー日: 2005/11/01
投稿数: 74
お住まい・勤務地: 1台でも せんだい
投稿日時: 2006-04-27 14:08
Fillメソッドを利用し先頭から1000件だけDataSetに取り込むという方法は
どうでしょうか?

[Visual Basic]
Overloads Public Function Fill( _
ByVal dataSet As DataSet, _
ByVal startRecord As Integer, _
ByVal maxRecords As Integer, _
ByVal srcTable As String _
) As Integer

↑HELPより

startRecordに0,maxRecordsに1000を設定すれば・・・

# これだと次の1000件を参照するとき、また読み込みなおさ
# なければダメなので実用的ではないかもしれませんが
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-27 14:32
引用:

sarahさんの書き込み (2006-04-27 13:20) より:

 検索により取得したレコードが30000件程度あったとします。
 しかし表示用には1000件程度でいいので取得したレコードの
 最初から1000件だけを取得したい場合、30000件が格納されて
 いるDataSetを加工して1000件に絞り込むことはできるので
 しょうか?つまり2度検索を行うことなく1度目に取得した
 DataSetを再利用できないかということです。



上記の場合なら、Penguinさんのやり方かなー、と思うのですが、最初に DataSet で
30000件取得するより、検索結果にマッチするレコードカウントを取得して一定量を
超えた時に先頭から1000件程度取得するやり方の方が効率が良いように感じますが、
実際のところはどうなんでしょう?

#結局、便乗質問ですね・・・
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-04-27 14:44
DataSetがどこに存在するか、を考える必要があると思います。

Windowsアプリケーションならクライアントにはある程度メモリの余裕があると考えても良いでしょうし、さまざまな処理を行ったうえで最終的に一括で書き戻す、という方法が考えられます。
この場合は30000件を最初に取得してしまい、表示を絞りこむのがよいかもしれません。

Webアプリの場合、ブラウザからのリクエストの毎にDataSetを作るようになります。
Session変数に格納することも可能ですが、この場合は毎回シリアライズ/デシリアライズが行われるようになります。
こういった状況であれば、必要なデータのみを毎回取得するほうがよいかもしれません。
まぁ、その場合はDataSetではなくDataReaderを使うほうがよいかもしれませんが。

このように、利用するうえでの前提条件がないと、どの方法が効率的か、という話はできないと思います。
sarah
常連さん
会議室デビュー日: 2006/02/08
投稿数: 32
投稿日時: 2006-04-27 16:19
引用:

Penguinさんの書き込み (2006-04-27 13:35) より:
DataViewクラスを使用すれば可能です。
RowFilterプロパティで条件絞込みも可能です。

Dim DataView1 as DataView = DataSet1.Tables("テーブル名").DefaultView
DataView1.RowFilter = "任意の条件"



話が遡ってしまうのですが、このやり方ですと1000件を抽出することはできますか?
"任意の条件"に"ROWNUM <= 1000"を指定する場合、SELECT文中にROWNUMを追記する
必要がありますが、このときORDER BYが無効になります。
これを避けるには元のSQL文を変更してROWNUMとORDER BYの意味が同じように変更
する必要があると思うのですが、元のSQL文を変更せずに1000件取得する方法は
ありますでしょうか?
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-27 16:52
引用:

どっとねっとふぁんさんの書き込み (2006-04-27 14:44) より:

Windowsアプリケーションならクライアントにはある程度メモリの余裕があると考えても良いでしょうし、さまざまな処理を行ったうえで最終的に一括で書き戻す、という方法が考えられます。
この場合は30000件を最初に取得してしまい、表示を絞りこむのがよいかもしれません。



やはりDataSet は全件手元に持ってきて処理するんですね。
じゃあ、低帯域なWANでVPN組んだ場合って・・・((((;゚Д゚)))ガクガクブルブル
Penguin
会議室デビュー日: 2006/03/01
投稿数: 13
投稿日時: 2006-04-27 17:04
コード:

Dim DataView1 as DataView = DataSet1.Tables("テーブル名").DefaultView 
DataView1.RowFilter = "任意の条件"



sarahさんの仰る通り、この方法だと元のSQLを変更する必要がありますね。
元のSQLを変更しないのであれば、
@30000件を読み込んだDataSetをループでまわして、1000件分新しいDataSetに取り込むか、
A1000件分読み込む別のSQLを用意し、DataSetに取り込む
方法が考えられると思いますが、いかがでしょうか?

#他によい案がある方はフォローをお願いいたします。

スキルアップ/キャリアアップ(JOB@IT)