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使用の準備

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
09Global Const ORADATA_EDITNONE = 0
10Global Const ORADATA_EDITMODE = 1
11Global Const ORADATA_EDITADD = 2
12' Field Data Types
13' These are intended to match similar constants in the
14' Visual Basic file DATACONS.TXT
15Global Const ORADB_BOOLEAN = 1
16Global Const ORADB_BYTE = 2
17Global Const ORADB_INTEGER = 3
18        .....
19        .....
20        .....

(2)Oracleへの接続と切断

OrcaleをPL/SQL等で利用したことがある方であれば、最初にOracleにログオン しなければOracleへのアクセスが何もできないことはご存知のことと思いますが、 oo4oからのアクセスでも最初にログオン処理を行います。

01'Oracleハンドリングオブジェクトの宣言
02Public OraSess  As Object   ' Oracleセッションオブジェクト
03Public OraDB    As Object   ' Oracleデータベースオブジェクト
04 
05'データベースへの接続/解放のテストサブルーチン
06Public 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 
25DbOpenCloseTest_Exit:
26    On Error Resume Next
27    Exit Sub
28 
29DbOpenCloseTest_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
48End Sub

注: Oracleハンドリングオブジェクトの宣言でデータ型をObject型に宣言していますが、 VBの参照設定で[Oracle InProc Server 2.3 Type Library]をチェックしておけばデータ型を それぞれ以下の様に宣言できます。

1Public OraSess  As OraSession   ' Oracleセッションオブジェクト
2Public OraDB    As OraDatabase  ' Oracleデータベースオブジェクト

この様に宣言することは、事前バインディングと呼ばれコンパイルの時に型チェックが行われ、 As Objectと宣言するよりは実行速度が少なからず向上する様です。As Objectと宣言することを 実行時バインディングと呼ばれます。
但し、oo4oの小さなバージョンアップの場合でも事前バインディングではプログラムの再構築が 必要になります。
実行時バインディングではこの必要は無く、そのままプログラムが実行可能です。
oo4oのマイナーバージョンアップ(バグFIX)毎にプログラムの再構築を行うことは煩雑になるので、 私は実行時バインディング(As Object)でプログラミングしています。

転職を本気で考えている方向けのプログラミングスクール!【WebCampPRO】

(3)実際のプログラミングでのOracleへの接続と切断

前回の説明では、Oracleへの接続と解放を1個の関数の中で行っていますが、実際はその様な プログラミングはされず、接続と切断を別々の関数で組んでおきプログラムの開始時点でOracle への接続を行い、プログラムの終了時点でOracleの切断を行う様に私は組んでいます。 その例としての関数と使用例を以下に示します。

<Oracleハンドリング関数用Moduleファイル>
001Option Explicit
002 
003'Oracleハンドリングオブジェクトの宣言
004Public OraSess  As Object   ' Oracleセッションオブジェクト
005Public OraDB    As Object   ' Oracleデータベースオブジェクト
006 
007Private fOraSess As Boolean 'セッション済フラグ
008Private fOraDB   As Boolean 'データベースオープン済フラグ
009 
010'-------------------------------------------------------------------
011'   名称 : Ora_Open
012'   機能 : データベースのオープン
013'   引数 : 無し
014'   戻値 : True(正常終了) , False(エラー発生)
015'-------------------------------------------------------------------
016Public 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
031Ora_Open_Exit:
032    Ora_Open = True
033    Screen.MousePointer = vbDefault
034    Exit Function
035 
036Ora_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
056End Function
057 
058'-------------------------------------------------------------------
059'   名称 : Ora_Close
060'   機能 : データベースのクローズ
061'   引数 : 無し
062'   戻値 : True(正常終了) , False(エラー発生)
063'-------------------------------------------------------------------
064Public 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
079ExitHandler:
080    Ora_Close = True
081    Exit Function
082 
083Ora_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
102End Function

<TEST用Formファイル>

01Private 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
14End Sub
15 
16Private Sub Form_Unload(Cancel As Integer)
17    'オラクル解放の関数コール
18    If Ora_Close() = False Then
19        MsgBox "オラクルの接続解除に失敗しました。"
20    End If
21End 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'-------------------------------------------------------------------
07Public 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     
24ExitHandler:
25    Exit Function
26 
27Ora_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
46End Function

<TEST用Formファイル>

1Private Sub Command1_Click()
2    Dim pstr As String
3 
4    pstr = Ora_GetDate()                '上記関数のコール
5    MsgBox "Oracle Date = " & pstr      '結果の表示
6End Sub
■関連記事
Oracle SQL SELECT1 : SELECT文の基礎

(5)SQLの実行その2:INSERT,UPDATE,DELETE文の実行

SELECT文以外のDML(データ操作言語)であるINSERT,UPDATE,DELETE文の実行を OraDatabaseオブジェクトのメソッドであるExecuteSQLを用いて行います。 ExecuteSQLの戻り値は処理された行数が返されます。
今回の例はOracleをインストールした時にデフォルトとして作成されるEMP表を 利用しています。

01Private 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 
23Err:
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
36End 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'-------------------------------------------------------------------
07Public 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     
48ExitHandler:
49    Exit Function
50 
51Ora_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
70End Function

<TEST用Formファイル>

01Private 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
13End 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'-------------------------------------------------------------------
21Function 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
31ExitHandler:
32    Exit Function
33 
34VntToStr_Err:
35    On Error Goto 0   
36End 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'-------------------------------------------------------------------
008Public 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     
044ErrorHandler:
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
060End Function
061 
062'-------------------------------------------------------------------
063'   名称 : GetSYOHIN_Image
064'   機能 : 画像データ取得
065'   引数 : strCode     (商品コード)
066'      : strFilePath (画像データを格納するファイル名)
067'   戻値 : True(正常終了) , False(エラー発生)
068'-------------------------------------------------------------------
069Public 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     
103ErrorHandler:
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
119End Function

<TEST用Formファイル>

1Private 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
8End Sub

■VB.NET関連記事
「VB.NET-TIPS」ページ


share





ページのトップへ戻る