- - PR -
VBAでODBCでOracleのバイナリデータの読み込み
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-04-12 09:48
VBAでODBC経由でOracleに接続し、logn型の画像データ(バイナリ・ZIP圧縮)
をVBA上で画像データに変換したいのですが、うまくいきませんので、アドバ イス頂ければと思い、投稿致します。 そもそもこのような処理は可能なのでしょうか? ご存知の方がいらっしゃいましたら、アドバイスをお願い致します。 【環境】 Excel2003 Oracle10g 最後に、VBAは初心者に近いので、大雑把な質問となり、申し訳有りません。 | ||||||||
|
投稿日時: 2007-04-12 10:44
画像サイズはどのくらいでしょうか? long型は 『最大2GB(231 から1 を引いたバイト数)の可変長文字データ。 下位互換性のために提供されています。』 (Oracle 10g RELEASE2のSQLリファレンスより抜粋) となっていますので、画像(バイナリデータ)の格納に適している とは思いません。 ですので、blob型の使用を推奨いたします。 blob型は 『バイナリ・ラージ・オブジェクト。最大サイズは、4GB から 1を引いたバイト数にデータベース・ブロック・サイズを掛けた 値です。』 (Oracle 10g RELEASE2のSQLリファレンスより抜粋) となります。
処理自体は可能ですが、ODBC経由はあまり事例が少ないので、 oo4o(Oracle Object for OLE)を使用することをお勧めします。 最後に、現在の格納テーブルの定義と、VBAで該当部分のコード、 及び、多分エラーが出ていると思いますが、そのエラー発生箇所 とエラーの内容を差し支えない程度で記載願います。 | ||||||||
|
投稿日時: 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) -------------------------------------------------------------------------------- 何か分かりますでしょうか? | ||||||||
|
投稿日時: 2007-04-12 11:41
そんなに大きなサイズではありませんね。 で、まず、プログラムは取り敢えずおいておいて、 テーブルの構造を変更することは可能ですか? 可能でしたら # 元質問ではlong型と書かれていましたが、下記を見ますと、 # long raw型ですね。 # こちらは、 # 『最大2GB の可変長バイナリ・データ。』 # とありますが、これも画像などのバイナリデータの場合は # 『RAWデータ型とLONG RAWデータ型のデータは、Oracleデー # タベースによって解析されません(異なるシステム間でデー # タを移動するときには変換されません)。これらのデータ型は、 # バイナリ・データまたはバイト列に使用されます。たとえば、 # LONG RAWは、図形、音声、文書、またはバイナリ・データの # 配列の格納に使用できますが、解析方法は用途によって異なり # ます。 # LONG RAW列をバイナリLOB(BLOB)へ変換することをお薦めします。 # LOB列は、LONG列ほど制限は多くありません。』 # (以上、SQLリファレンスより抜粋) # となっています。やはりBLOB型が良いでしょう。
以下に変更してみてください。 名前 NULL? 型 -------------------------------- -------- ---------------------------- 番号 NOT NULL VARCHAR2(11) ・ ・ 略 ・ ・ 画像データ BLOB -------------------------------------------------------------------------------- | ||||||||
|
投稿日時: 2007-04-12 12:47
>テーブルの構造を変更することは可能ですか?
テーブルの構成を変更するのは不可です。 データベースのlong型という条件で処理が組み込まれていたりするので、 データ型を変更すると影響が大きいですので、変更は厳しいです。 | ||||||||
|
投稿日時: 2007-04-12 13:15
画像等のバイナリデータの格納は、LOB(Large OBject)型をOracleが 推奨しています。前回、私が記載した下記を元に、各アクターと交渉 することをお勧めしますが。。。
さて、次に、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/ | ||||||||
|
投稿日時: 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/ このようなサイトもあるのですね。初めて知りました。 さっそく登録させて頂きました(笑) | ||||||||
|
投稿日時: 2007-04-12 14:15
件名は 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} |