- PR -

VBAでODBCでOracleのバイナリデータの読み込み

投稿者投稿内容
ゆう
会議室デビュー日: 2006/06/23
投稿数: 6
投稿日時: 2007-04-12 09:48
VBAでODBC経由でOracleに接続し、logn型の画像データ(バイナリ・ZIP圧縮)
をVBA上で画像データに変換したいのですが、うまくいきませんので、アドバ
イス頂ければと思い、投稿致します。

そもそもこのような処理は可能なのでしょうか?
ご存知の方がいらっしゃいましたら、アドバイスをお願い致します。

【環境】
Excel2003
Oracle10g

最後に、VBAは初心者に近いので、大雑把な質問となり、申し訳有りません。
YASUYOKA
ベテラン
会議室デビュー日: 2007/03/19
投稿数: 71
投稿日時: 2007-04-12 10:44
引用:

ゆうさんの書き込み (2007-04-12 09:48) より:
VBAでODBC経由でOracleに接続し、logn型の画像データ(バイナリ・ZIP圧縮)
をVBA上で画像データに変換したいのですが、うまくいきませんので、アドバ
イス頂ければと思い、投稿致します。



画像サイズはどのくらいでしょうか?

long型は
『最大2GB(231 から1 を引いたバイト数)の可変長文字データ。
下位互換性のために提供されています。』
(Oracle 10g RELEASE2のSQLリファレンスより抜粋)
となっていますので、画像(バイナリデータ)の格納に適している
とは思いません。

ですので、blob型の使用を推奨いたします。
blob型は
『バイナリ・ラージ・オブジェクト。最大サイズは、4GB から
1を引いたバイト数にデータベース・ブロック・サイズを掛けた
値です。』
(Oracle 10g RELEASE2のSQLリファレンスより抜粋)
となります。

引用:

そもそもこのような処理は可能なのでしょうか?



処理自体は可能ですが、ODBC経由はあまり事例が少ないので、
oo4o(Oracle Object for OLE)を使用することをお勧めします。

最後に、現在の格納テーブルの定義と、VBAで該当部分のコード、
及び、多分エラーが出ていると思いますが、そのエラー発生箇所
とエラーの内容を差し支えない程度で記載願います。
ゆう
会議室デビュー日: 2006/06/23
投稿数: 6
投稿日時: 2007-04-12 11:07
早速のご回答ありがとうございます。

>画像サイズはどのくらいでしょうか?

実データのほとんどがに5M以下です。

>処理自体は可能ですが、ODBC経由はあまり事例が少ないので、
>oo4o(Oracle Object for OLE)を使用することをお勧めします。
>最後に、現在の格納テーブルの定義と、VBAで該当部分のコード、
>及び、多分エラーが出ていると思いますが、そのエラー発生箇所
>とエラーの内容を差し支えない程度で記載願います。

エラーは出ておりません。
正確には作れて居ません・・・。
以下がメイン部分のコードです。

'DBに接続
ret = DB_Connection(OraSession, OraDatabase)
If ret = False Then
Exit Sub
End If

'SELECT
sql = "SELECT 画像データ FROM 画像テーブル WHERE 番号='100000'"
ret = DB_Select_Request(EmpDynaset, OraDatabase, sql)

If (EmpDynaset.EOF = False) And (EmpDynaset.BOF = False) Then
Do While (EmpDynaset.EOF = False)
'ActiveCell.Value = EmpDynaset.Fields("画像データ").Value
'ActiveCell.Offset(1, 0).Select
'ファイル名
FileName = "image" & no
'バイナリ値
str = EmpDynaset.Fields("画像データ").Value
'画像ファイルを作成
'ここからがよく分かりません。

'カーソルを次のレコードに移動する
EmpDynaset.MoveNext
no = no + 1
Loop
End If



テーブルの構成は以下の通りです。
名前 NULL? 型
-------------------------------- -------- ----------------------------
番号 NOT NULL VARCHAR2(11)





画像データ LONG RAW(0)
--------------------------------------------------------------------------------

何か分かりますでしょうか?
YASUYOKA
ベテラン
会議室デビュー日: 2007/03/19
投稿数: 71
投稿日時: 2007-04-12 11:41
引用:

ゆうさんの書き込み (2007-04-12 11:07) より:
>画像サイズはどのくらいでしょうか?

実データのほとんどがに5M以下です。



そんなに大きなサイズではありませんね。

で、まず、プログラムは取り敢えずおいておいて、
テーブルの構造を変更することは可能ですか?

可能でしたら
# 元質問ではlong型と書かれていましたが、下記を見ますと、
# long raw型ですね。
# こちらは、
# 『最大2GB の可変長バイナリ・データ。』
# とありますが、これも画像などのバイナリデータの場合は
# 『RAWデータ型とLONG RAWデータ型のデータは、Oracleデー
# タベースによって解析されません(異なるシステム間でデー
# タを移動するときには変換されません)。これらのデータ型は、
# バイナリ・データまたはバイト列に使用されます。たとえば、
# LONG RAWは、図形、音声、文書、またはバイナリ・データの
# 配列の格納に使用できますが、解析方法は用途によって異なり
# ます。
# LONG RAW列をバイナリLOB(BLOB)へ変換することをお薦めします。
# LOB列は、LONG列ほど制限は多くありません。』
# (以上、SQLリファレンスより抜粋)
# となっています。やはりBLOB型が良いでしょう。

引用:

テーブルの構成は以下の通りです。
名前 NULL? 型
-------------------------------- -------- ----------------------------
番号 NOT NULL VARCHAR2(11)





画像データ LONG RAW(0)
--------------------------------------------------------------------------------



以下に変更してみてください。

名前 NULL? 型
-------------------------------- -------- ----------------------------
番号 NOT NULL VARCHAR2(11)





画像データ        BLOB
--------------------------------------------------------------------------------
ゆう
会議室デビュー日: 2006/06/23
投稿数: 6
投稿日時: 2007-04-12 12:47
>テーブルの構造を変更することは可能ですか?

テーブルの構成を変更するのは不可です。
データベースのlong型という条件で処理が組み込まれていたりするので、
データ型を変更すると影響が大きいですので、変更は厳しいです。
YASUYOKA
ベテラン
会議室デビュー日: 2007/03/19
投稿数: 71
投稿日時: 2007-04-12 13:15
引用:

ゆうさんの書き込み (2007-04-12 12:47) より:
>テーブルの構造を変更することは可能ですか?

テーブルの構成を変更するのは不可です。
データベースのlong型という条件で処理が組み込まれていたりするので、
データ型を変更すると影響が大きいですので、変更は厳しいです。



画像等のバイナリデータの格納は、LOB(Large OBject)型をOracleが
推奨しています。前回、私が記載した下記を元に、各アクターと交渉
することをお勧めしますが。。。

引用:

# long raw型ですね。
# こちらは、
# 『最大2GB の可変長バイナリ・データ。』
# とありますが、これも画像などのバイナリデータの場合は
# 『RAWデータ型とLONG RAWデータ型のデータは、Oracleデー
# タベースによって解析されません(異なるシステム間でデー
# タを移動するときには変換されません)。これらのデータ型は、
# バイナリ・データまたはバイト列に使用されます。たとえば、
# LONG RAWは、図形、音声、文書、またはバイナリ・データの
# 配列の格納に使用できますが、解析方法は用途によって異なり
# ます。
# LONG RAW列をバイナリLOB(BLOB)へ変換することをお薦めします。
# LOB列は、LONG列ほど制限は多くありません。』
# (以上、SQLリファレンスより抜粋)
# となっています。やはりBLOB型が良いでしょう。



さて、次に、Oracleデータベースとの接続アプリケーションは
初めてでしょうか。
もし、そうだとしたら、下記URLの内容を真似て簡単な接続アプ
リケーションを作成してみてください。
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9904/oo4o/
『Oracle Objects for OLEからの接続』
『データを取得するには』
『データを更新するには』

と同時に、下記URLからOTN(Oracle Technorogy Network:登録無料)
へ登録することをお勧めいたします。
http://otn.oracle.co.jp/

ゆう
会議室デビュー日: 2006/06/23
投稿数: 6
投稿日時: 2007-04-12 13:58
>画像等のバイナリデータの格納は、LOB(Large OBject)型をOracleが
>推奨しています。前回、私が記載した下記を元に、各アクターと交渉
>することをお勧めしますが。。。

制約や、oracle社の考えから行くと変更すべき項目ですので、
検討すべき事項があるものに、紛れ込まして検討する事になると思います。
すぐは、費用面からして厳しそうです。。

>さて、次に、Oracleデータベースとの接続アプリケーションは
>初めてでしょうか。
データを取得する程度であれば、VBAは自分用に作る程度です。
通常はJavaで稼動しているシステムですので、大抵はJavaかPLを作って
済ませてしまうのですが、VBAでが前提にありまして・・・。

>と同時に、下記URLからOTN(Oracle Technorogy Network:登録無料)
>へ登録することをお勧めいたします。
>http://otn.oracle.co.jp/
このようなサイトもあるのですね。初めて知りました。
さっそく登録させて頂きました(笑)
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-04-12 14:15
引用:

ゆうさんの書き込み (2007-04-12 11:07) より:
エラーは出ておりません。
正確には作れて居ません・・・。
以下がメイン部分のコードです。


件名は ODBC ですが、提示されたコードは ODBC を直接扱っているわけではないですよね?
ADO でしょうか?下位層で使うのが ODBC ということですか?
ADO の場合、大きなデーターはチャンク(Chunk)として処理しないといけないかもしれません。
http://www.google.co.jp/search?hl=ja&q=ADO+GetChunk+Oracle&lr=lang_ja

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}

スキルアップ/キャリアアップ(JOB@IT)