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も見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
-
split関数で区切り文字がない場合
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBとアクセスでSQL文に変...
-
『列名 '担当者CD' があいま...
-
他のMDBのテーブルに追加したい
-
SQLを発行とは?クエリの作成と...
-
エクセルのテーブルを解除する...
-
Access2007でアプリケーション...
-
VB.NETでのAccessテーブルリンク
-
ExcelVBAからAccessMDB内のテー...
-
[C#] DataGridViewでコンボボッ...
-
手動または分散トランザクショ...
-
CSVファイルのエクスポートでソ...
-
★クリスタルレポートの元になる...
-
AccessからExcelへエクスポート...
-
ADO&mdbで、リンクテーブルの...
-
ACCESSのレコード転送について
-
(泣)VBscriptでinnerhtmlを使...
-
.net 複数の主キーを設定する方法
-
二重引用符(")について
-
Accessのフォームでリス...
-
ダイナセットタイプのレコード...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLを発行とは?クエリの作成と...
-
『列名 '担当者CD' があいま...
-
AccessからExcelへエクスポート...
-
ExcelVBAからAccessMDB内のテー...
-
エクセルのテーブルを解除する...
-
VBとアクセスでSQL文に変...
-
手動または分散トランザクショ...
-
Accessで別mdbのテーブルをコピー
-
ACCESS2010 実行時エラー 2766
-
他のMDBのテーブルに追加したい
-
CSVファイルのエクスポートでソ...
-
DataGridViewに複数テーブルの...
-
COBOLのINVALID KEYが理解でき...
-
HTMLのテーブルの行数が多くな...
-
.net 複数の主キーを設定する方法
-
ワークテーブルの作成について
-
Excel複数シートをaccessへ一括...
-
★クリスタルレポートの元になる...
-
Accessで宛名ラベルに同一宛先...
-
DataGridの中身をDataSetにテー...
おすすめ情報