CSVファイルをDBとして、SQLで検索する

種別 データベース
ご要望 CSVファイルをデータベースとして、SQLで検索したい
ファイル CsvSQL.zip をクリックし、ダウンロード後に、解凍してください。
実行
イメージ
ポイント CSVをデータベースとして、SQLを使用する際のポイント

① データベースをオープンする際に、CSVファイルパスを使用する
② レコードオープン時、SQL文の後に「<@>」を付けてから、型指定を行う。
型指定 型指定のルールは、以下の通り。

SQL文字列 = 通常のSQL文 & "<@>" & 項目名1 型指定1,項目名2 型指定2,・・・

(ソース事例:"<@>単価 Currency,在庫数 Long,発売日 DateTime")

項目名+半角空白+型指定とし、複数なら「,」で区切る。
型指定のないものは、自動的に「Text」(文字列)として扱う。

以下、型指定の一覧表を掲載する。

型名 説明 用途例
Text 文字列型(最大255文字) 商品名、住所、コード
Memo 長文文字列(255文字超) 備考、説明
Long 整数 数量、ID、番号
Currency 固定小数点(小数点4桁) 金額、単価、消費税
Single 単精度浮動小数点 比率、温度
Double 倍精度浮動小数点 統計、測定値
DateTime 日付・時刻
(#yyyy/mm/dd#形式)
日付、納期、登録日
Boolean 論理型(True/False) フラグ
ソース 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以降、利用可能。