種別 | データベース | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ご要望 | CSVファイルをデータベースとして、SQLで検索したい | |||||||||||||||||||||||||||
ファイル | CsvSQL.zip をクリックし、ダウンロード後に、解凍してください。 | |||||||||||||||||||||||||||
実行 イメージ |
![]() | |||||||||||||||||||||||||||
ポイント | CSVをデータベースとして、SQLを使用する際のポイント ① データベースをオープンする際に、CSVファイルパスを使用する ② レコードオープン時、SQL文の後に「<@>」を付けてから、型指定を行う。 | |||||||||||||||||||||||||||
型指定 | 型指定のルールは、以下の通り。 SQL文字列 = 通常のSQL文 & "<@>" & 項目名1 型指定1,項目名2 型指定2,・・・ (ソース事例:"<@>単価 Currency,在庫数 Long,発売日 DateTime") 項目名+半角空白+型指定とし、複数なら「,」で区切る。 型指定のないものは、自動的に「Text」(文字列)として扱う。 以下、型指定の一覧表を掲載する。
| |||||||||||||||||||||||||||
ソース | Dim sFile,sDir,sName,sCn,ret 'SQLサーバーに接続するための文字列を、CSVファイル名にする ' ファイル名は英字のみ、エンコード種類は「SHIFT-JIS」のみ有効 sCn = #FILE_DIR# & "BUNDB30k.csv" ret = DbOpen(sCn)'データベースのオープン if ret < 0 then MsgBox("データベースのオープン エラー = " & ret) exit sub endif Dim sSQL,CursorType,LockType,Options,i,no,s,TableMax,ss,sSort 'レコードセットのオプション 'SQLの絞込条件を追加 s = "" if 単価範囲小 <> "" then s = s & Iif(s = "", "", " AND ") & "単価 >= " & Replace(単価範囲小, ",", "")'3桁区切りのカンマを外す if 単価範囲大 <> "" then s = s & Iif(s = "", "", " AND ") & "単価 <= " & Replace(単価範囲大, ",", "") '3桁区切りのカンマを外す if 在庫数範囲小 <> "" then s = s & Iif(s = "", "", " AND ") & "在庫数 >= " & Replace(在庫数範囲小, ",", "") '3桁区切りのカンマを外す if 在庫数範囲大 <> "" then s = s & Iif(s = "", "", " AND ") & "在庫数 <= " & Replace(在庫数範囲大, ",", "")'3桁区切りのカンマを外す if 発売日範囲小 <> "" then s = s & Iif(s = "", "", " AND ") & "発売日 >= #" & 発売日範囲小 & "#"'日付や日時は#で囲む if 発売日範囲大 <> "" then s = s & Iif(s = "", "", " AND ") & "発売日 <= #" & 発売日範囲大 & "#" '日付や日時は#で囲む if 商品検索 <> "" then s = s & Iif(s = "", "", " AND ") & "商品名 LIKE '" & 商品検索 & "'" '文字列を扱うときは、'で囲む sSort = "" if ソート <> "" then sSort = " ORDER BY " & ソート & IIf(昇順降順 = "降順", " DESC", " ASC") endif 'フォルダを外したファイル名をテーブルとして指定 sSQL = "SELECT * FROM [" & FileInfo(sCn, 1) & "]" if s <> "" then sSQL = sSQL & " WHERE " & s & sSort & "<@>単価 Currency,在庫数 Long,発売日 DateTime"'絞込条件と追加 endif CursorType=0'カーソルの種類は、順方向専用(最速・最小メモリ) LockType=1 'ロックの種類は、読み取り専用 Options=0 'ソースの種類は、SQL 'レコードセットのオープン ret = DbRecordOpen(sSQL, CursorType, LockType, Options) TableMax = TableMaxNo(商品名) no = 1 Do While DbRecordEOF() = 0 'EOFになれば抜ける ID[no] = DbRecordData("ID") 商品名[no] = DbRecordData("商品名") 種別[no] = DbRecordData("種別") 型番[no] = DbRecordData("型番") 単価[no] = DbRecordData("単価") 在庫数[no] = DbRecordData("在庫数") 発売日[no] = DbRecordData("発売日") no = no + 1 if no > TableMax then Exit Do 'テーブルの最大値を超えたら、ループを抜ける endif DbRecordMove() '次のレコードを取得 Loop 'データ数が少なかった場合は、クリア処理を行う For i = no To TableMax'テーブルは、1から始まります。 ID[i] = "" 商品名[i] = "" 種別[i] = "" 型番[i] = "" 単価[i] = "" 在庫数[i] = "" 発売日[i] = "" Next i DbRecordClose() 'レコードセットのクローズ DbClose() 'データベースのクローズ | |||||||||||||||||||||||||||
備考 | ver10以降、利用可能。 |