Visual Basic Tips(oo4o)
Visual Basic(以下VBと略す)からOracleへアクセスする方法はODBC経由の方式と、oo4o経由の方法があります。oo4oのTipsと銘打っておきながら最初にODBCの話が出てくるのもおかしいのですが、なぜoo4oなのかを述べる上で敢えて説明します。
以前はVBよりもAccessでの業務用ソフトの開発が多かった為にODBC経由でOracleへの接続が主でした。この時のAccessのバージョンはAccess95及びAccess97でした。Accessはうまく開発を行えばVBよりも開発工数を少なくでき、また内部的にレポートの機能を持っている為、VBの様に別にレポート用のミドルウエア(Crystal
Report等)を導入する必要もありませんでした。
しかし、ODBCとOracleとの相性の問題等により種々の問題がありました。また、データ入力方法、データの見せ方などでAccessでは客先の要望に答えられないようになりだしAccessの代わりとしてVBを使用することになってきました。
- (1)oo4o使用の準備
- (2)Oracleへの接続と切断
- (3)実際のプログラミングでのOracleへの接続と切断
- (4)SQLの実行その1:簡単なSELECT文の実行
- (5)SQLの実行その2:INSERT,UPDATE,DELETE文の実行
- (6)SQLの実行その3:複数行を返すSELECT文の実行
- (7)BLOB型の利用方法:画像データをテーブルに設定
(1)oo4o使用の準備
oo4oからOracleへ接続する為には、接続用のサービス名をOracle用の名前解決
ファイル(TNSNAME.ORA)に設定しておく必要があります。通常はNet8 Configuration-
Assistantにより設定します。このとき確実にOracleに接続できることを確認しておきます。
[tnsping.exeを用いての確認は以下を参照]
D:\Oracle\Ora81\bin>tnsping orcl
TNS Ping Utility for 32-bit Windows: Version 8.1.6.0.0 - Production on 20-SEP-20
02 16:01:28
(c) Copyright 1997 Oracle Corporation. All rights reserved.
Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=rnk2000)(PORT=1521))
OK (70ミリ秒)
oo4oがインストールされているディレクトリ下にVB用のOracle定義ファイル[ORACONST.TXT]
がありますので、このファイルを[ORACONST.BAS]等のファイル名に変更しVBのプログラム開発の
ディレクトリにコピーして参照することを勧めます。
(私のマシンのディレクトリ[D:\Oracle\Ora81\oo4o\ORACONST.TXT])
oo4oで使用するパラメータ等の数値を意味のあるシンボルでVBのソース上に記述できます。
[ORACONST.TXT]
01 | '''''''''''''''''''''''''''' |
02 | ' Oracle Objects for OLE global constant file. |
03 | ' This file can be loaded into a code module. |
04 | '''''''''''''''''''''''''''' |
05 |
06 | 'Editmode property values |
07 | ' These are intended to match similar constants in the |
08 | ' Visual Basic file CONSTANT.TXT |
09 | Global Const ORADATA_EDITNONE = 0 |
10 | Global Const ORADATA_EDITMODE = 1 |
11 | Global Const ORADATA_EDITADD = 2 |
12 | ' Field Data Types |
13 | ' These are intended to match similar constants in the |
14 | ' Visual Basic file DATACONS.TXT |
15 | Global Const ORADB_BOOLEAN = 1 |
16 | Global Const ORADB_BYTE = 2 |
17 | Global Const ORADB_INTEGER = 3 |
18 | ..... |
19 | ..... |
20 | ..... |
(2)Oracleへの接続と切断
OrcaleをPL/SQL等で利用したことがある方であれば、最初にOracleにログオン しなければOracleへのアクセスが何もできないことはご存知のことと思いますが、 oo4oからのアクセスでも最初にログオン処理を行います。
01 | 'Oracleハンドリングオブジェクトの宣言 |
02 | Public OraSess As Object ' Oracleセッションオブジェクト |
03 | Public OraDB As Object ' Oracleデータベースオブジェクト |
04 |
05 | 'データベースへの接続/解放のテストサブルーチン |
06 | Public Sub DbOpenCloseTest() |
07 | On Error Goto DbOpenCloseTest_Err |
08 | Dim pstrErr As String |
09 | |
10 | 'セッションオブジェクトの生成 |
11 | Set OraSess = CreateObject( "OracleInProcServer.XOraSess" ) |
12 | 'データベースのオープン処理(ログイン処理) |
13 | Set OraDB = OraSess.OpenDatabase( "ORCL" , "SCOTT/TIGER" , ORADB_DEFAULT) |
14 |
15 | '-------------------------------------------------------------- |
16 | ' 実際のデータベースに対する処理..... |
17 | '-------------------------------------------------------------- |
18 | 'データベースのクローズ処理(DAOとの互換性の為のCloseメソッドで実際にはコールの必要無し) |
19 | OraDB.Close |
20 | 'データベースオブジェクトの廃棄(必ずオブジェクトの生成の逆順で廃棄処理を行う) |
21 | Set OraDB = Nothing |
22 | 'セッションオブジェクトの廃棄 |
23 | Set OraSess = Nothing |
24 |
25 | DbOpenCloseTest_Exit: |
26 | On Error Resume Next |
27 | Exit Sub |
28 |
29 | DbOpenCloseTest_Err: |
30 | 'エラー処理 |
31 | If OraSess.LastServerErr = 0 Then |
32 | If OraDB.LastServerErr = 0 Then |
33 | 'VBエラー |
34 | pstrErr = Error (Err.Number) |
35 | Else |
36 | 'データベース処理系エラー |
37 | pstrErr = OraDB.LastServerErrText |
38 | OraDB.LastServerErrReset |
39 | EndIf |
40 | Else |
41 | 'セッション系エラー |
42 | pstrErr = OraSess.LastServerErrText |
43 | OraSess.LastServerErrReset |
44 | EndIf |
45 | 'エラー表示 |
46 | MsgBox pstrErr, vbOKOnly, "DbOpenCloseTest" |
47 | Resume DbOpenCloseTest_Exit |
48 | End Sub |
注: Oracleハンドリングオブジェクトの宣言でデータ型をObject型に宣言していますが、 VBの参照設定で[Oracle InProc Server 2.3 Type Library]をチェックしておけばデータ型を それぞれ以下の様に宣言できます。
1 | Public OraSess As OraSession ' Oracleセッションオブジェクト |
2 | Public OraDB As OraDatabase ' Oracleデータベースオブジェクト |
この様に宣言することは、事前バインディングと呼ばれコンパイルの時に型チェックが行われ、
As Objectと宣言するよりは実行速度が少なからず向上する様です。As Objectと宣言することを
実行時バインディングと呼ばれます。
但し、oo4oの小さなバージョンアップの場合でも事前バインディングではプログラムの再構築が
必要になります。
実行時バインディングではこの必要は無く、そのままプログラムが実行可能です。
oo4oのマイナーバージョンアップ(バグFIX)毎にプログラムの再構築を行うことは煩雑になるので、
私は実行時バインディング(As Object)でプログラミングしています。


(3)実際のプログラミングでのOracleへの接続と切断
前回の説明では、Oracleへの接続と解放を1個の関数の中で行っていますが、実際はその様な プログラミングはされず、接続と切断を別々の関数で組んでおきプログラムの開始時点でOracle への接続を行い、プログラムの終了時点でOracleの切断を行う様に私は組んでいます。 その例としての関数と使用例を以下に示します。
<Oracleハンドリング関数用Moduleファイル>001 | Option Explicit |
002 |
003 | 'Oracleハンドリングオブジェクトの宣言 |
004 | Public OraSess As Object ' Oracleセッションオブジェクト |
005 | Public OraDB As Object ' Oracleデータベースオブジェクト |
006 |
007 | Private fOraSess As Boolean 'セッション済フラグ |
008 | Private fOraDB As Boolean 'データベースオープン済フラグ |
009 |
010 | '------------------------------------------------------------------- |
011 | ' 名称 : Ora_Open |
012 | ' 機能 : データベースのオープン |
013 | ' 引数 : 無し |
014 | ' 戻値 : True(正常終了) , False(エラー発生) |
015 | '------------------------------------------------------------------- |
016 | Public Function Ora_Open() As Boolean |
017 | On Error GoTo Ora_Open_Err |
018 | Dim pstrErr As String |
019 | |
020 | Ora_Open = False |
021 | Screen.MousePointer = vbHourglass |
022 | |
023 | If fOraSess = False Then |
024 | 'セッションオブジェクトの生成 |
025 | Set OraSess = CreateObject( "OracleInProcServer.XOraSession" ) |
026 | fOraSess = True |
027 | 'データベースのオープン処理(ログイン処理) |
028 | Set OraDB = OraSess.OpenDatabase( "ORCL" , "SCOTT/TIGER" , ORADB_DEFAULT) |
029 | fOraDB = True |
030 | End If |
031 | Ora_Open_Exit: |
032 | Ora_Open = True |
033 | Screen.MousePointer = vbDefault |
034 | Exit Function |
035 |
036 | Ora_Open_Err: |
037 | Screen.MousePointer = vbDefault |
038 | 'エラー処理 |
039 | If OraSess.LastServerErr = 0 Then |
040 | If OraDB.LastServerErr = 0 Then |
041 | 'VBエラー |
042 | pstrErr = Error (Err.Number) |
043 | Else |
044 | 'データベース処理系エラー |
045 | pstrErr = OraDB.LastServerErrText |
046 | OraDB.LastServerErrReset |
047 | End If |
048 | Else |
049 | 'セッション系エラー |
050 | pstrErr = OraSess.LastServerErrText |
051 | OraSess.LastServerErrReset |
052 | End If |
053 | 'エラー表示 |
054 | MsgBox pstrErr, vbOKOnly, "Ora_Open" |
055 | On Error Resume Next |
056 | End Function |
057 |
058 | '------------------------------------------------------------------- |
059 | ' 名称 : Ora_Close |
060 | ' 機能 : データベースのクローズ |
061 | ' 引数 : 無し |
062 | ' 戻値 : True(正常終了) , False(エラー発生) |
063 | '------------------------------------------------------------------- |
064 | Public Function Ora_Close() As Boolean |
065 | On Error GoTo Ora_Close_Err |
066 | Dim pstrErr As String |
067 | |
068 | Ora_Close = False |
069 | If fOraDB = True Then |
070 | 'データベースのクローズ処理 |
071 | OraDB.Close |
072 | 'データベースオブジェクトの廃棄 |
073 | Set OraDB = Nothing |
074 | End If |
075 | If fOraSess = True Then |
076 | 'セッションオブジェクトの廃棄 |
077 | Set OraSess = Nothing |
078 | End If |
079 | ExitHandler: |
080 | Ora_Close = True |
081 | Exit Function |
082 |
083 | Ora_Close_Err: |
084 | 'エラー処理 |
085 | If OraSess.LastServerErr = 0 Then |
086 | If OraDB.LastServerErr = 0 Then |
087 | 'VBエラー |
088 | pstrErr = Error (Err.Number) |
089 | Else |
090 | 'データベース処理系エラー |
091 | pstrErr = OraDB.LastServerErrText |
092 | OraDB.LastServerErrReset |
093 | End If |
094 | Else |
095 | 'セッション系エラー |
096 | pstrErr = OraSess.LastServerErrText |
097 | OraSess.LastServerErrReset |
098 | End If |
099 | 'エラー表示 |
100 | MsgBox pstrErr, vbOKOnly, "Ora_Close" |
101 | On Error Resume Next |
102 | End Function |
<TEST用Formファイル>
01 | Private Sub Form_Load() |
02 | '"接続中..."メッセージを表示するウインドウの表示 |
03 | Load frmLogin |
04 | frmLogin.Show |
05 | DoEvents |
06 | |
07 | 'オラクル接続の関数コール |
08 | If Ora_Open() = False Then |
09 | MsgBox "オラクルとの接続に失敗しました。" |
10 | End If |
11 | |
12 | '"接続中..."メッセージを表示するウインドウを廃棄 |
13 | Unload frmLogin |
14 | End Sub |
15 |
16 | Private Sub Form_Unload(Cancel As Integer ) |
17 | 'オラクル解放の関数コール |
18 | If Ora_Close() = False Then |
19 | MsgBox "オラクルの接続解除に失敗しました。" |
20 | End If |
21 | End Sub |
※実際のプログラムに組み込む場合には、Ora_Openは引数としてOracleのSID(接続文字列)、
ユーザ名、パスワードを渡した方がより実用的だと思います。
(4)SQLの実行その1:簡単なSELECT文の実行
データベース内のデータを検索するSQL文としてのSELECT文の実行を行います。
ここでは簡単なSELECT文として、DUAL擬似表からシステム日付を取得する関数を示します。
クエリー(SELECT文)の結果として返されるデータの集まりを結果セットといい、この結果セットを
制御するものがカーソルとよばれるものです。カーソル処理を行う為にOraDynasetオブジェクトを
利用しその中のメソッド、プロパティにアクセスすることでデータを取り扱うことができます。
OraDynasetオブジェクトのメソッド、プロパティの詳細は別のところで説明したいと思います。
実際のプログラムは以下の通り長くないので、一読すれば内容はすぐに理解できると思います。
このSQL文は結果が1行のみ必ず返されるとわかっていますので、データを取得後はダイナセットを
明示的に廃棄処理しています。ダイナセットもCloseメソッドは無く、ダイナセットオブジェクトを
Nothingに設定することで廃棄します。
<Oracleハンドリング関数用Moduleファイル>
01 | '------------------------------------------------------------------- |
02 | ' 名称 : Ora_GetDate |
03 | ' 機能 : データベースの日付取得 |
04 | ' 引数 : 無し |
05 | ' 戻値 : 日付文字列 |
06 | '------------------------------------------------------------------- |
07 | Public Function Ora_GetDate() As String |
08 | On Error GoTo Ora_GetDate_Err |
09 | Dim pstrErr As String |
10 | Dim pstrSQL As String |
11 | Dim pobjDyn As Object 'ダイナセットオブジェクト |
12 | |
13 | Ora_GetDate = "" |
14 | pstrSQL = "SELECT SYSDATE FROM DUAL" |
15 |
16 | 'ダイナセットオープン |
17 | Set pobjDyn = OraDB.CreateDynaset(pstrSQL, ORADYN_READONLY) |
18 | '検索結果の格納 |
19 | Ora_GetDate = pobjDyn.Fields( "SYSDATE" ).Value |
20 | ' Ora_GetDate = pobjDyn.Fields(0).Value |
21 | 'ダイナセットをクローズ |
22 | Set pobjDyn = Nothing |
23 | |
24 | ExitHandler: |
25 | Exit Function |
26 |
27 | Ora_GetDate_Err: |
28 | 'エラー処理 |
29 | If OraSess.LastServerErr = 0 Then |
30 | If OraDB.LastServerErr = 0 Then |
31 | 'VBエラー |
32 | pstrErr = Error (Err.Number) |
33 | Else |
34 | 'データベース処理系エラー |
35 | pstrErr = OraDB.LastServerErrText |
36 | OraDB.LastServerErrReset |
37 | End If |
38 | Else |
39 | 'セッション系エラー |
40 | pstrErr = OraSess.LastServerErrText |
41 | OraSess.LastServerErrReset |
42 | End If |
43 | 'エラー表示 |
44 | MsgBox pstrErr, vbOKOnly, "Ora_GetDate" |
45 | On Error Resume Next |
46 | End Function |
<TEST用Formファイル>
1 | Private Sub Command1_Click() |
2 | Dim pstr As String |
3 |
4 | pstr = Ora_GetDate() '上記関数のコール |
5 | MsgBox "Oracle Date = " & pstr '結果の表示 |
6 | End Sub |
■関連記事
⇒Oracle SQL SELECT1 : SELECT文の基礎(5)SQLの実行その2:INSERT,UPDATE,DELETE文の実行
SELECT文以外のDML(データ操作言語)であるINSERT,UPDATE,DELETE文の実行を
OraDatabaseオブジェクトのメソッドであるExecuteSQLを用いて行います。
ExecuteSQLの戻り値は処理された行数が返されます。
今回の例はOracleをインストールした時にデフォルトとして作成されるEMP表を
利用しています。
01 | Private Sub Command1_Click() |
02 | On Error Goto Err |
03 | Dim pstrSQL As String |
04 | Dim pintCnt As Integer |
05 | |
06 | 'EMPNOが6000の給料を10%増しにするUPDATE文 |
07 | pstrSQL = "UPDATE EMP SET SAL = SAL * 1.1 WHERE EMPNO = 6000" |
08 | pintCnt = OraDB.Execiute(pstrSQL) |
09 | MsgBox pintCnt & "件の処理を行いました" , vbOKOnly , "TEST" |
10 | |
11 | 'EMPNOが8888の従業員のデータ行を作成するINSERT文 |
12 | pstrSQL = "INSERT INTO EMP (EMPNO) VALUES(8888)" |
13 | pintCnt = OraDB.Execiute(pstrSQL) |
14 | MsgBox pintCnt & "件の処理を行いました" , vbOKOnly , "TEST" |
15 | |
16 | 'EMPNOが8888の従業員のデータを削除するDELETE文 |
17 | pstrSQL = "DELETE FROM EMP WHERE EMPNO = 8888" |
18 | pintCnt = OraDB.Execiute(pstrSQL) |
19 | MsgBox pintCnt & "件の処理を行いました" , vbOKOnly , "TEST" |
20 |
21 | Exit Sub |
22 |
23 | Err: |
24 | 'エラー処理 |
25 | If OraDB.LastServerErr = 0 Then |
26 | 'VBエラー |
27 | pstrErr = Error (Err.Number) |
28 | Else |
29 | 'データベース処理系エラー |
30 | pstrErr = OraDB.LastServerErrText |
31 | OraDB.LastServerErrReset |
32 | End If |
33 | 'エラー表示 |
34 | MsgBox pstrErr, vbOKOnly, "Command1_Click" |
35 | On Error Resume Next |
36 | End Sub |
■関連記事
⇒Oracle SQL・データの追加(INSERT)⇒Oracle SQL・データの更新(UPDATE)
⇒Oracle SQL・データの削除(DELETE)
(6)SQLの実行その3:複数行を返すSELECT文の実行
SQLの実行その1のSELECT文では1行しか結果を返さないことがはっきりしていましたが、
複数行を返すSELECT文を実行することのほうが実際には多いものです。
以下のプログラムでは
EMP表の中のEMPNOを文字列の配列に返す処理を行っています。
ダイナセットのFieldオブジェクトの値がNULLの可能性がある場合は、Valueの値がNULLかどうかを
IsNull関数で判定しNULLの場合には適切な処理が必要です。
<Oracleハンドリング関数用Moduleファイル>
01 | '------------------------------------------------------------------- |
02 | ' 名称 : Ora_SelectData1 |
03 | ' 機能 : EMP表の全てのEMPNOを取得する(結果を文字列配列に返す) |
04 | ' 引数 : astrNoData() (データ格納用文字列配列) |
05 | ' 戻値 : True(正常終了) , False(エラー発生) |
06 | '------------------------------------------------------------------- |
07 | Public Function Ora_SelectData1( ByRef astrNoData() As String ) As String |
08 | On Error GoTo Ora_SelectData1_Err |
09 | Dim pstrSQL As String |
10 | Dim pstrErr As String |
11 | Dim pobjDyn As Object 'ダイナセットオブジェクト |
12 | Dim pstr As String |
13 | Dim pint As Integer |
14 | |
15 | Ora_SelectData1 = False |
16 | 'ダイナセットオープン |
17 | pstrSQL = "SELECT EMPNO FROM EMP" |
18 | Set pobjDyn = OraDB.CreateDynaset(pstrSQL, ORADYN_READONLY) |
19 | |
20 | 'EMPNOのデータを格納する配列の初期化 |
21 | ReDim astrNoData(0) |
22 | |
23 | '検索結果の格納 |
24 | If (pobjDyn.EOF = False ) And (pobjDyn.BOF = False ) Then |
25 | pint = 0 |
26 | 'レコードの終わりまでを処理する |
27 | Do While (pobjDyn.EOF = False ) |
28 | 'EMPNOのデータを格納する配列の領域拡張 |
29 | pint = pint + 1 |
30 | ReDim Preserve astrNoData(pint) |
31 | |
32 | 'Filedオブジェクトの保持している値がNULLかのチェック |
33 | If IsNull(pobjDyn.Fields( "EMPNO" ).Value) Then |
34 | pstr = "" |
35 | Else |
36 | pstr = CStr (pobjDyn.Fields( "EMPNO" ).Value) |
37 | End If |
38 | astrNoData(pint) = pstr |
39 | |
40 | 'カーソルを次のレコードに移動する |
41 | pobjDyn.MoveNext |
42 | Loop |
43 | End If |
44 | 'ダイナセットをクローズ |
45 | Set pobjDyn = Nothing |
46 | Ora_SelectData1 = True |
47 | |
48 | ExitHandler: |
49 | Exit Function |
50 |
51 | Ora_GetDate_Err: |
52 | 'エラー処理 |
53 | If OraSess.LastServerErr = 0 Then |
54 | If OraDB.LastServerErr = 0 Then |
55 | 'VBエラー |
56 | pstrErr = Error (Err.Number) |
57 | Else |
58 | 'データベース処理系エラー |
59 | pstrErr = OraDB.LastServerErrText |
60 | OraDB.LastServerErrReset |
61 | End If |
62 | Else |
63 | 'セッション系エラー |
64 | pstrErr = OraSess.LastServerErrText |
65 | OraSess.LastServerErrReset |
66 | End If |
67 | 'エラー表示 |
68 | MsgBox pstrErr, vbOKOnly, "Ora_SelectData1" |
69 | On Error Resume Next |
70 | End Function |
<TEST用Formファイル>
01 | Private Sub Command1_Click() |
02 | Dim pstr As String |
03 | Dim pstrNo() As String |
04 |
05 | If Ora_SelectData1(pstrNo) = True Then '上記関数のコール |
06 | '結果の表示 |
07 | pstr = "" |
08 | For i = 1 To UBound(pstrNo) |
09 | pstr = pstr & pstrNo(i) & vbCr |
10 | Next i |
11 | MsgBox pstr |
12 | End If |
13 | End Sub |
上記のIsNullの判定している部分を以下の様に関数化してコールしてやればより使いやすいと思います。
Variant型を文字列に変換する関数を示していますが、実際にはInteger型やLong型等に変換する関数がを作って使用しています。
01 | .... |
02 | Do While (pobjDyn.EOF = False ) |
03 | 'EMPNOのデータを格納する配列の領域拡張 |
04 | ReDim Preserve astrNoData(pint) |
05 | |
06 | 'Filedオブジェクトの保持している値がNULLかのチェック |
07 | astrNoData(pint) = VntToStr(pobjDyn.Fields( "EMPNO" ).Value) |
08 | |
09 | 'カーソルを次のレコードに移動する |
10 | pobjDyn.MoveNext |
11 | pint = pint + 1 |
12 | Loop |
13 | .... |
14 |
15 | '------------------------------------------------------------------- |
16 | ' 名称 : VntToStr |
17 | ' 機能 : 与えられたVariant型データを文字列に変換 |
18 | ' 引数 : astrData (Variant型データ) |
19 | ' 戻値 : 文字列データ |
20 | '------------------------------------------------------------------- |
21 | Function VntToStr( ByVal avntData As Variant ) As String |
22 | On Error GoTo VntToStr_Err |
23 | |
24 | '戻り値を初期化する |
25 | dfVntToStr = "" |
26 | |
27 | '有効な文字列に変換する |
28 | If Not IsNull(avntData) Then |
29 | dfVntToStr = CStr (avntData) |
30 | End If |
31 | ExitHandler: |
32 | Exit Function |
33 |
34 | VntToStr_Err: |
35 | On Error Goto 0 |
36 | End Function |
(7)BLOB型の利用方法:画像データをテーブルに設定
テーブルにBLOB型を設定しその中に画像データファイルを格納する方法を以下に示します。
OracleSQL入門の中で使用している商品マスタに画像データを設定することにします。
以下のSQL文でTM_商品のテーブルにカラムを追加します。
>ALTER TABLE TM_商品 ADD 商品画像 BLOB;BLOBをoo4oで扱うにはOraBLOBオブジェクトを利用します。BLOB列を含むダイナセットを作成してやり BLOB列のValue値をOraBLOBオブジェクトに設定してやります。OraBLOBオブジェクトのメソッドには ディスク上のファイルへの読み書きを簡単に行える、CopyFromFile,CopyFileが用意されています。
CopyFromFileはファイルからBLOBに内容をコピーし、CopyFileは逆にBLOBからファイルへのコピーを行います。
以下に、商品画像データ設定関数及び、商品画像データ取得関数を示します。
<Oracleハンドリング関数用Moduleファイル>
001 | '------------------------------------------------------------------- |
002 | ' 名称 : SetSYOHIN_Image |
003 | ' 機能 : 画像データ設定 |
004 | ' 引数 : strCode (商品コード) |
005 | ' : strFilePath (画像データを格納するファイル名) |
006 | ' 戻値 : True(正常終了) , False(エラー発生) |
007 | '------------------------------------------------------------------- |
008 | Public Function SetSYOHIN_Image( ByVal strCode As String , _ |
009 | ByVal strFilePath As String ) As Boolean |
010 | On Error GoTo ErrorHandler |
011 | Dim strSQL As String |
012 | Dim objOraDyn As OraDynaset |
013 | Dim objOraBlb As OraBlob |
014 | Dim pstrErr As String |
015 |
016 | '戻り値初期化 |
017 | SetSYOHIN_Image = False |
018 | 'BLOB列を含むSELECT文 |
019 | strSQL = "SELECT 商品画像 FROM TM_商品 WHERE 商品コード = " & strCode |
020 | 'ダイナセットの設定 |
021 | Set objOraDyn = OraDB.CreateDynaset(strSQL, ORADYN_DEFAULT) |
022 | With objOraDyn |
023 | .MoveFirst |
024 | .Edit |
025 | 'LOB列をEmptyキーワードで初期化 |
026 | .Fields(0).Value = Empty |
027 | .Update |
028 | 'BLOB列の値をOraBLOBオブジェクトに設定 |
029 | Set objOraBlb = objOraDyn.Fields(0).Value |
030 | .MoveFirst |
031 | '更新モード |
032 | .Edit |
033 | 'CopyFromFileメソッドで指定ファイルから読み込みBLOBに設定 |
034 | objOraBlb.CopyFromFile strFilePath |
035 | .Update |
036 | Set objOraBlb = Nothing |
037 | End With |
038 | 'ダイナセットの解放 |
039 | Set objOraDyn = Nothing |
040 | '正常戻り |
041 | SetSYOHIN_Image = True |
042 | Exit Function |
043 | |
044 | ErrorHandler: |
045 | 'エラー処理 |
046 | Set objOraBlb = Nothing |
047 | Set objOraDyn = Nothing |
048 | If OraDB.LastServerErr = 0 Then |
049 | 'VBエラー |
050 | pstrErr = Error (Err.Number) |
051 | Else |
052 | 'データベース処理系エラー |
053 | pstrErr = OraDB.LastServerErrText |
054 | OraDB.LastServerErrReset |
055 | End If |
056 | 'エラー表示 |
057 | MsgBox pstrErr, vbOKOnly, "SetSYOHIN_Image" |
058 | On Error Resume Next |
059 | SetSYOHIN_Image = False |
060 | End Function |
061 |
062 | '------------------------------------------------------------------- |
063 | ' 名称 : GetSYOHIN_Image |
064 | ' 機能 : 画像データ取得 |
065 | ' 引数 : strCode (商品コード) |
066 | ' : strFilePath (画像データを格納するファイル名) |
067 | ' 戻値 : True(正常終了) , False(エラー発生) |
068 | '------------------------------------------------------------------- |
069 | Public Function GetSYOHIN_Image( ByVal strCode As String , _ |
070 | ByVal strFilePath As String ) As Boolean |
071 | On Error GoTo ErrorHandler |
072 | Dim strSQL As String |
073 | Dim objOraDyn As Object |
074 | Dim objOraBlb As Object |
075 | Dim pstrErr As String |
076 | |
077 | '戻り値初期化 |
078 | GetSYOHIN_Image = False |
079 | 'BLOB列を含むSELECT文 |
080 | strSQL = "SELECT 商品画像 FROM TM_商品 WHERE 商品コード = " & strCode |
081 | 'ダイナセットの設定 |
082 | Set objOraDyn = OraDB.CreateDynaset(strSQL, ORADYN_DEFAULT) |
083 | 'BLOB型にデータがあり?? |
084 | If IsNull(objOraDyn.Fields(0).Value) = True Then |
085 | 'データが無い!! |
086 | GetSYOHIN_Image = False |
087 | Else |
088 | 'BLOB型のオブジェクトを設定 |
089 | Set objOraBlb = objOraDyn.Fields(0).Value |
090 | 'ファイルへの書込み |
091 | objOraBlb.CopyToFile strFilePath |
092 | 'BLOB型のオブジェクトを解放 |
093 | Set objOraBlb = Nothing |
094 | 'データが在り |
095 | GetSYOHIN_Image = True |
096 | End If |
097 | 'ダイナセットの解放 |
098 | Set objOraDyn = Nothing |
099 | '正常戻り |
100 | GetSYOHIN_Image = True |
101 | Exit Function |
102 | |
103 | ErrorHandler: |
104 | 'エラー処理 |
105 | Set objOraBlb = Nothing |
106 | Set objOraDyn = Nothing |
107 | If OraDB.LastServerErr = 0 Then |
108 | 'VBエラー |
109 | pstrErr = Error (Err.Number) |
110 | Else |
111 | 'データベース処理系エラー |
112 | pstrErr = OraDB.LastServerErrText |
113 | OraDB.LastServerErrReset |
114 | End If |
115 | 'エラー表示 |
116 | MsgBox pstrErr, vbOKOnly, "GetSYOHIN_Image" |
117 | On Error Resume Next |
118 | GetSYOHIN_Image = False |
119 | End Function |
<TEST用Formファイル>
1 | Private Sub Command1_Click() |
2 | If SetSYOHIN_Image( "1" , "TEST1.BMP" ) = False Then '上記関数のコール |
3 | MsgBox "商品マスタの画像設定でエラーが発生しました。" , vbOKOnly |
4 | End If |
5 | If GetSYOHIN_Image( "1" , "TEST1_COPY.BMP" ) = False Then |
6 | MsgBox "商品マスタの画像取得でエラーが発生しました。" , vbOKOnly |
7 | End If |
8 | End Sub |