データ型の指定(CSVファイルをADOで扱う㉗)

CSVファイルをADOで扱う連載の27回目です。前回の記事はこちらになります。 hirocom777.hatenadiary.org

CSVファイルと一緒にできたもの

前回はADOを使ってCSVファイルを作るコードの解説でした。そしその際にschema.iniというファイルが一緒にできたのでした。

今回は、このschema.iniをご紹介しようと思います。

schema.iniって何だ?

その前に今までのおさらいです。CSVファイルを開く際に、ADOではCSVファイルをテーブル、つまりデータベースの中の表として扱います。CSVファイルのあるフォルダーがデータベースとなります。前回CREATE TABLEを使って新しいCSVファイル(テーブル)を作って、その際に各フィールドのデータ型を指定しました。

CSVファイルはテキストデータなのでデータ型を記録する方法がありません。そこで各CSVファイルのフィールドのデータ型をschema.iniに記録しているのです。ADOはその後のファイルアクセスの際に、フィールドのデータ型をschema.iniに記録してある内容で取り扱います。

それでは具体的な例を見てみましょう。前回作成したファイル(Test.csv)とschema.iniを使ってデータを追加してみます。

データを追加してみる

Test.csvとschema.iniが配置してあるフォルダーに操作するExcelファイルも配置します。例によってMicrosoft ActiveX Data Objects 2.8 Libraryを参照設定しておいてください。標準モジュールを作成して以下を入力しましょう。データを追加するプロシージャです。

Public Function AddCsvData(folderName As String, fileName As String, fieldLst() As Variant, recordData() As Variant)
On Error GoTo ErrorHandler

  'データベースを接続します
  Dim adoCn As New ADODB.Connection
  adoCn.Provider = "Microsoft.ACE.OLEDB.12.0"
  adoCn.Properties("Extended Properties") = "Text;HDR=Yes;FMT=Delimited"
  adoCn.Open folderName & "\"
 
  'データを追加します
  Dim adoRs As New ADODB.Recordset
  adoRs.Open "[" & fileName & "]", adoCn, adOpenKeyset, adLockOptimistic
  Dim i As Long
  For i = 0 To UBound(recordData())
    adoRs.AddNew fieldLst, recordData(i)
  Next
  adoRs.Update  

  adoRs.Close
  adoCn.Close
ErrorHandler:
  If Err.Number <> 0 Then MsgBox "データベース接続に失敗しました " & Err.Number
End Function

実際にデータを追加してみましょう。以下を入力して実行してみてください。上のAddCsvDataを使ってデータを追加します。

Public Sub AddDataTest()
Dim folderName As String
Dim fileName As String
Dim fieldList() As Variant
Dim recordData() As Variant

  folderName = ThisWorkbook.Path
  fileName = "Test.csv"
  
  fieldList = Array("日付", "品名", "価格")
  recordData = Array(Now, "バナナ", 100)
  
  AddCsvData folderName, fileName, fieldList, recordData
End Sub

実行した後にTest.csvを確認すると・・・以下の様にデータが追加されてます。

"日付","品名","価格"
2022/02/07 20:42:09,"バナナ",100

品名の項目はダブルクォーテーションで括られていますが、他の項目は括られていません。schema.iniで指定した内容が影響しているようです。

それではschema.iniがない場合はどうなるのでしょうか?試しにTest.csvに追加したデータを削除して保存してからschema.iniを削除して、再度AddDataTestを実行してみましょう。結果は以下の様になりました。

"日付","品名","価格"
"2022/02/07 20:55:23","バナナ","100"

すべてのデータがダブルクォーテーションで括られています。文字列型として扱われているようですね。

次回もschema.ini

いかがでしょうか。schema.ini、奥が深そうです。次回も引き続き追求していこうと思います。お楽しみに!! hirocom777.hatenadiary.org CSVファイルをADOで扱う連載記事はコチラからどうぞ