SAK 図書館

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

VB テクニック編25 - oo4o CSV エクスポート、oo4o CSV インポート

■SAK 関数利用規程

  ・テクニック編で紹介する関数は、私こと Y.SAK の開発関数である。
  ・著作権明示部分の改編は認めない。
  ・個人、企業がこれらの関数を使用したり、一部を使用して新たなシステムや
    プログラムを開発することは自由です。
  ・但し、これらの関数を一部でも使用しているソフトウェアをシェアウェア、
    その他有償プロダクトとして配布・販売するには、私の許可が必要です。
    (無償のフリーソフトウェアなら、自由に配布しても良い。)
  ・これらの関数を使用して発生した、いかなる形での損害も私こと Y.SAK は
    賠償しません。

■CSV エクスポート (oo4o 版)

  ・SQL による様々な問い合わせ結果をそのままテキストファイルなどに出力
    することができる。
    この例では CSV 形式でテキストファイルエクスポートする。
    尚、先頭行に見出しも出力している。
    見出しが不要の場合は、mds = false にする。

  Dim OraSession as variant
  Dim OraDatabase as variant
  Dim dbname as string
  Dim cnuser as string
  Dim sql As String
  Dim fnm As String
  Dim mds As boolean
  Dim rs As Variant
  Dim fno As Integer
  Dim rec As String
  Dim i As Integer
  Dim dummy As Variant
  Dim s As String

  dbname = ""
  cnuser = "SAK/SAK"
  sql = "select * from sak.受注v1"
  fnm = "g:\tmp\test.csv"
  mds = true

  Set OraSession = CreateObject("OracleInProcServer.XOraSession")
  Set OraDatabase = OraSession.OpenDatabase(dbname, cnuser, 0)
  set rs = OraDatabase.CreateDynaset(sql, 0)

  fno = FreeFile
  Open fnm For Output As fno Len = 32000
  if mds then
    For i = 0 to rs.fields.count - 1
      rec = rec & Chr(&H22) & rs(i).Name & Chr(&H22) & ","
    Next
    Print #fno, Left(rec, Len(rec) - 1)
  end if
  Do Until rs.EOF
    rec = ""
    For i = 0 to rs.fields.count - 1
      dummy = rs(i)
      If IsNull(dummy) Then
        s = ""
      Else
        s = dummy
      End If
      rec = rec & Chr(&H22) & RTrim(s) & Chr(&H22) & ","
    Next
    Print #fno, Left(rec, Len(rec) - 1)
    rs.MoveNext
  Loop
  Close fno
  Set rs = Nothing

  Set OraDatabase = Nothing
  Set OraSession = Nothing

■CSV インポート (oo4o 版)

  ・外部データ取込として、CSV テキストファイルをデータベースに追加更新す
    るには、次のようにする。
    先頭行を見出しとして無視するか指定できる。
    見出しがない場合は、mds = false にする。
    尚、ダブルコーテション「"」を CSV 項目の引用句として処理しているので、
    CSV 項目データに半角や全角の「"」があると、このサンプルは誤動作する。
    GetCntCSV() 関数は、「VB テクニック編6 - CSV ファイル項目数取得」を
    使用してください。
    また、テーブルの項目に、char、varchar2、number、long 以外があると、
    文字列と数値の判断がおかしくなるかもしれません。
    見出しによって、テーブル項目を指定することはしていないので、
    CSV の項目順は、更新テーブルの項目順と一致していなければなりません。

  ・一括トランザクションをかけているため、大量のレコードを更新しようとす
    ると、ロールバックセグメントがオーバーするか、著しく更新速度が低下す
    る可能性があります。1 万件を超える場合は要注意です。

  Dim OraSession as variant
  Dim OraDatabase as variant
  Dim dbname as string
  Dim cnuser as string
  Dim tbl As String
  Dim tky As String
  Dim sql As String
  Dim rs As variant
  Dim fnm As String
  Dim mds As boolean
  Dim fno As Integer
  Dim cmax As Integer
  Dim i As Integer
  Dim j As Integer
  Dim rec As String
  Dim s As String
  Dim ct As long

  dbname = ""
  cnuser = "SAK/SAK"
  tbl = "sak.受注m"
  tky = "受注番号 = ''"  '0 件のダミー問い合わせ用のキー"
  fnm = "g:\tmp\test.csv"
  mds = true

  Set OraSession = CreateObject("OracleInProcServer.XOraSession")
  Set OraDatabase = OraSession.OpenDatabase(dbname, cnuser, 0)

  sql = "select * from " & tbl & " where " & tky
  set rs = OraDatabase.CreateDynaset(sql, 0)
  j = rs.fields.count - 1
  redim ctyp(j) as boolean
  For i = 0 to j
    select case rs(i).type
      Case 4
        ctyp(i) = true
      case else
        ctyp(i) = false
    end select
  Next
  Set rs = Nothing

  cmax = GetCntCSV(fnm)
  if cmax = 0 then msgbox "CSV 形式エラー"
  if cmax <> j + 1 then msgbox "項目数不一致"

  fno = FreeFile
  Open fnm For input As fno Len = 32000
  if mds and eof(fno) = false then
    line input #fno, s
  end if
  OraSession.BeginTrans
  on error resume next
  Do Until eof(fno)
    s = ""
    for i = 0 to j
      input #fno, rec
      rec = trim(rec)
      if ctyp(i) then
        s = s & "," & rec
      else
        s = s & ",'" & rec & "'"
      end if
    next
    s = mid(s, 2)
    sql = "insert into " & tbl & " values (" & s & ")"
    OraDatabase.ExecuteSQL sql
    if err <> 0 then
      OraSession.RollbackTrans
      close fno
      Set OraDatabase = Nothing
      Set OraSession = Nothing
      msgbox "更新エラー" & chr(10) & err & ": " & error _
        & chr(10) & ct + 1 & " 件目に問題あり" _
        & chr(10) & sql
      end
    end if
    ct = ct + 1
  Loop
  OraSession.CommitTrans
  on error goto 0

  Close fno
  Set OraDatabase = Nothing
  Set OraSession = Nothing

■VB テクニック編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料
| VB | SQL | Perl | PHP | ASP | JSP | C | PC | HP | FAQ | フリーソフト |

SAK Streets メインストリート 図書館・カフェ 一覧 SAK Streets 検索



Copyright (C) 1999-2017 Y.SAK