
No.1ベストアンサー
- 回答日時:
件数が多くなくて、メモリ容量も問題ないのであれば、
DataSetに溜めておくというのは、どうでしょうか?
DBにワークテーブルを作ってチェックの方が良い場合は、
.NET側ではなく、DB側にストアドを作って、
全レコードのチェック結果をまとめて返すというのが
良いと思います。
(そのやり方の方が良いのであれば、別で提示します)
簡単ではありますが、.NETのDataSetを使ったチェック処理を
VS.NET2002で、作ってみました。ご参考になれば幸いです
CSVデータの内容
1,A,111111
2,B,222222
3,C,333333
4,D,444444
5,E,555555
' ファイルを読む
' ファイルを読む
Dim fs As New System.IO.StreamReader("c:\aaa.csv", System.Text.Encoding.ASCII)
Dim buffer As String = fs.ReadToEnd()
fs.Close()
' レコード単位に分割
Dim crlf As Char() = {Chr(13)}
Dim records As String() = buffer.Split(crlf)
Dim record As String
' データテーブルを作る
Dim da As New System.Data.DataTable("aaa")
da.Columns.Add("column1", GetType(String))
da.Columns.Add("column2", GetType(String))
da.Columns.Add("column3", GetType(String))
' ファイルレコード → DataRow
For Each record In records
If record.Trim().Equals("") Then
Exit For
End If
Dim columns As String() = record.Split(","c)
Dim i As Integer = 0
Dim dr As DataRow = da.NewRow()
For i = 0 To 2
dr.Item(i) = columns.GetValue(i)
Next
da.Rows.Add(dr)
Next
' チェック処理
Dim searchKey As String = "111111"
Dim condition As String = String.Format("column3={0}", searchKey)
Dim hitRows As DataRow() = da.Select(condition)
If hitRows.Length > 0 Then
' レコードがある場合
MessageBox.Show("レコードあり")
' TODO:この後は、レコードがある処理を行う
Else
' レコードがない場合
MessageBox.Show("レコードなし")
' TODO:この後は、レコードがない処理を行う
End If
No.6
- 回答日時:
データベース上のデータ件数と、
読み込むファイルの件数。
あと、データベース上のデータの更新頻度で、
最適解は変わってくると思います。
テキストファイルに比べて、データベース側の件数が圧倒的に多いのであればデータベースの取り込みを行うだけでも時間がかかるわけで。
下記にいくつか解決策が出てますが、そのあたりをふまえてどうするか考えるといいと思います。
(ちなみに私なら、全部DBに取り込んで、DB上でチェックします。主に慣れの問題が理由ですが)
No.5
- 回答日時:
/abc__01__x/
Table_A01
Table_B02
/abc__01__y/
Table_A02
Table_B03
データベースをSQL Server や Oracle にしようともディスクアクセスの手続きを残せば高速化にも限界が。
データベースでデータで管理するのは当然だとしても、それを利用しなきゃならない決まりはないでしょう。
ファイルのコードで、ある程度、検索対象が決まるならなば、上述のようなテキストファイルを用意、
ファイルコードのマッチするテーブルデータだけを検索するという絞り込みをすれば高速化します。
もちろん、この場合、検索対象のテーブルはメモリ上に展開します。
経験では、1件90秒を要するような処理も0.001秒まで高速化できます。
私は、単なるデザイナでプログラマではありません。
ですから、<テーブルをメモリ上に展開>は、難しい手法を採用してはいません。
CないしVBでテーブルを巨大構造体に変換しバイナリファイルとして保存するだけです。
BLoad()、BSave() という関数を用意すること位、朝飯前でしょう。
そうすれば、瞬時にメモリ上に必要なテーブルを展開できます。
これで、ディスクアクセスの制約から解放されるという次第です。
どうしても高速化したいのであれば、メモリ上への検索データの展開も選択肢の一つかなと思います。
No.4
- 回答日時:
多数のPC端末で同時にデータベースにアクセスする様な
場合には、データベースへの接続数に制限が有るので
普通に、初期起動時にデータベースから取得したデータを
メモリ上に確保した配列に保存した物を使用するので良い
と思いますが?
工夫する点が有るとすれば
1)検索用テーブルを作成する際にキー項目順でソートして
おく。
バイナリサーチを使った高速な検索が可能になるので
テーブル全件を始めから順に検索せずにすみます。
2)項目が複数に分類分けできる時場合は、分類毎にテーブル
を作成する。
またテーブルの作成を起動時に行うのではなく、最初の
検索が発生した時に行う様にすれば、テーブル作成の為に
起動時間が遅くなるのを防ぐ事が可能になり、且つ無駄な
メモリを使用せずにすみます。
No.3
- 回答日時:
DB上にワークテーブルを作ってやる場合ですが、
SQL Server であれば、頭に「#」が付くテーブルをCREATE TABLEで
作成し、Bulk Insert で、一括登録させます。
(#付きテーブル名は、一定時間が過ぎると自動的にDROPされます)
■ワークテーブルの作成
http://www.techbank.jp/sqlserver/#a5
■Bulk Insert
http://www.techbank.jp/sqlserver/#a8
OracleでもSQL*LoaderなんかでUPする方法はあります。
後は、ワークテーブルの内容とチェックするマスタやテーブル等を
つき合わせてチェックするロジックを.NET側かストアド側で
書けばOKだと思いますが、如何でしょうか?
No.2
- 回答日時:
すいません、下記は勘違いしました。
やり方としては、下記の応用で、比較対象データとなりうるデータを
一括して取得し、DataSetかDataTableに保存してあげます。
その後、DataTableのSelectメソッドを使い、検索条件(チェック条件)を
指定し、レコードの存在チェックや、その他のチェックができます。
Dim da As System.Data.DataTable = SQLやストアドのReaderでマスタ等のデータ取得
Dim hitRows As DataRow() = da.Select("検索キー = 検索値")
If hitRows.Length > 0 Then
' レコードが存在した場合のチェック処理
Else
' レコードがなかった場合の処理
End If
このやり方で、レスポンスがあがった事例はあるので、
お試し頂けたらと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL 【投稿情報用データベース posts】は必要ないと思います。 1 2022/06/02 21:25
- その他(データベース) IT用語について質問です。 以前ITパスポートの試験を受けた際にデータベースが何の集まりかについての 2 2022/12/10 12:29
- JavaScript Typescript が必要な理由 1 2023/01/07 11:45
- MySQL [1000地域 × 10カテゴリー = 1万件のテーブル]!グループ化? 1 2023/06/14 23:56
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
このQ&Aを見た人はこんなQ&Aも見ています
-
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
データグリッドビューの一番最初の行に列を追加したい
Visual Basic(VBA)
-
-
4
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
-
5
VBでコンボボックスとテキストボックスの連係
Visual Basic(VBA)
-
6
SPREAD(GrapeCity)のセルにフォーカスを設定するにはどうしたらいいのでしょうか?
Visual Basic(VBA)
-
7
テキストボックス行の桁数を制限したいです VB.NET
Visual Basic(VBA)
-
8
VB.NET getとsetの概念がわかりません。
Visual Basic(VBA)
-
9
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
10
SQLServer2012の復元ができない
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
『列名 '担当者CD' があいま...
-
AccessからExcelへエクスポート...
-
Accessで別mdbのテーブルをコピー
-
ExcelVBAからAccessMDB内のテー...
-
Access SQLITEのリンクテーブ...
-
COBOLのINVALID KEYが理解でき...
-
手動または分散トランザクショ...
-
SQLを発行とは?クエリの作成と...
-
DAOでフィールドのデータ型を変...
-
DataGridViewで変更した値を反...
-
VB.NETからAccess内のデータベ...
-
Accessのフォームでリス...
-
VBとアクセスでSQL文に変...
-
vb ado → vb2005 ado.net変換
-
アクセステーブル、リンクとロ...
-
【ADO】「Execute」を使うと...
-
Excel複数シートをaccessへ一括...
-
★クリスタルレポートの元になる...
-
ワークテーブルの作成について
-
iBatisでのロック、コミットと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
『列名 '担当者CD' があいま...
-
SQLを発行とは?クエリの作成と...
-
手動または分散トランザクショ...
-
VBとアクセスでSQL文に変...
-
AccessからExcelへエクスポート...
-
Accessで別mdbのテーブルをコピー
-
エクセルのテーブルを解除する...
-
CSVファイルのエクスポートでソ...
-
COBOLのINVALID KEYが理解でき...
-
ExcelVBAからAccessMDB内のテー...
-
ACCESS2010 実行時エラー 2766
-
.net 複数の主キーを設定する方法
-
ExcelからAccessのテーブルに書...
-
アクセステーブル、リンクとロ...
-
Access2007でアプリケーション...
-
他のMDBのテーブルに追加したい
-
DAOの作成単位について
-
Excel複数シートをaccessへ一括...
-
[C#] DataGridViewでコンボボッ...
-
リストボックスに複数列表示し...
おすすめ情報