fc2ブログ

(元)社内SEの徒然なる日記

ExcelVBA&ADOでOracleからデータ抽出で文字化け(解決編)

■ キャラクタセット

Oracle関係で文字化けした時の基本は、サーバ側とクライアント側で文字コードが違っていないか確認する事らしいです。

まぁ、oo4oでは上手く行くので大丈夫だとは思いますが、念のために確認してみます。

まず、サーバ側を確認するため下記のSQL文を発行します。
SELECT  *  FROM  V$NLS_PARAMETERS
WHERE parameter = 'NLS_CHARACTERSET'


結果は「JA16SJIS」。
PARAMETER	VALUE
NLS_CHARACTERSET JA16SJIS


クライアント側は、レジストリの¥HKEY_LOCAL_MACHINE¥SOFT¥WARE¥ORACLE¥KEY_OraClient11g_home1 の、NLS_NANG の値を確認。

設定されていたのは、これです。

JAPANESE_JAPAN.JA16SJISTILDE


うん、やっぱり良さそうです。

■ プロバイダ

今度は、ADO側のプロバイダを確認します。

'ADODB.Connectionオブジェクト
Dim mAdoCn As Object

'ADOコネクションの作成
Set mAdoCn = CreateObject("ADODB.Connection")

'接続先データベースにOracleを指定
mAdoCn.Provider = "OraOLEDB.Oracle" 'Oracle純正


使っているのは、Oracle純正の「OraOLEDB.Oracle」。うっかりMicrosoft製を使ったとかって訳でもなさそうです。

■ 環境ってよりは・・・

こうなると、環境っていうよりはもっと小さなレベルで問題が起きていると考えた方が良い気がします。そもそも、文字コードのレベルで間違えているのなら、〜だけでなく、もっと色々な文字が化けるような気がします。

そういった観点で調べていくと、どうやら文字コード変換の色々な絡みで〜が?になってしまう問題にたどり着きました。

どうすれば良いかっていうと、VBA側で特定の文字コードを強制的に〜に置き換える方法が良いそうです。

こんな感じかな?



'読み取り専用でファイルを開きます。このファイルに書き込むことはできません。
Public Const ForReading As Integer = 1
'ファイルを開き、ファイルの末尾から書き込みます。
Public Const ForAppending As Integer = 8
'システムの既定値を使ってファイルを開きます。
Public Const TristateUseDefault As Double = -2
'Unicode としてファイルを開きます。
Public Const TristateTrue As Double = -1
'ASCII ファイルとしてファイルを開きます。
Public Const TristateFalse As Double = 0

Sub TEST()

'----- 省略 Start --------
'
' Oracleに接続して、SQL(SELECT)文を実行。
' 実行結果を、myRs(レコードセット)に設定する。
'
'----- 省略 End ----------


    'ファイルシステムオブジェクトの宣言
    Dim myFs As Object
    Set myFs = CreateObject("Scripting.FileSystemObject")
    Dim myOutFile As Object

    '出力ファイルの作成とオープン
    myFs.CreateTextFile ("D:¥CSVTEST.csv")
    Set myOutFile = myFs.OpenTextFile("D:¥CSVTEST.csv", ForAppending, False, TristateFalse)

    'データ全件出力
    Do Until myRs.EOF

        '出力
        'myOutFile.WriteLine (myRs.Fields.Item(0).Value)
        myOutFile.WriteLine (Replace(myRs.Fields.Item(i).Value, ChrW(12316), "〜"))

        'カーソルを次行に変更します。
        myRs.MoveNext
    Loop
End Sub


この辺り、文字コードの結構複雑な話があるようです。一通り目を通したのですが、他人に説明できるほど理解しきれていないので省略させて下さい。

■ 後書き

この現象、そういえば、昔何かの記事で読んだ気がします。当時は「へぇ、そうなんだ」くらいの気持ちで読み流したのですが、まさか自分が遭遇するとは思いませんでした。

さて、これで問題解決って言いたかったのですが、結局は接続方法をoo4oに戻すことにしました。

実際にデータを投入して動かしてみると、取得結果がNullだった時の扱いとか色々なことが、oo4oADOで微妙に動作が違うってことが分かってきて、少し腰を据えて取り掛からないとダメだって事が判明しました。

ま、いつか納得するものが出来たら記事にしましょうか。

問題編:ExcelVBA&ADOでOracleからデータ抽出で文字化け(問題編)

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end ---
スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する