C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: VB6 ORACLEのBLOB型チェックについて


(過去ログ 29 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■13574 / inTopicNo.1)  VB6 ORACLEのBLOB型チェックについて
  
□投稿者/ sada (2回)-(2008/01/31(Thu) 16:14:58)

分類:[VB6 以前] 

皆様、いつもお世話になります。

VB6にてOracleのBLOB型のデータの取得後のチェックの実行方法について。
下記ロジックでは、

If IsNull(RecSet.Fields(2).Value) = True Then
        'データが無い!!
        
で、データがNULLにも関わらず、ELSEの方へ処理が移行してしまいます。
BLOB型のNULLの判定を行いたいのですが、うまくいきません。
どなたか些細なことでも構いませんので、ご教授いただけませんでしょうか。

宜しくお願い致します。

--------------------------------------------------------------------------------------------------
Private Function funTEMPGET(ByVal strConvert As String) As Boolean

On Error GoTo Error_proc

    Dim RecSet          As OraDynaset       'Oracleダイナセット用変数を宣言
    Dim strSQL          As String           'SQL文字列用変数を宣言
    Dim objOraBlb       As OraBlob          'OracleBLOB型オブジェクト変数を宣言【画像データ格納用】
    Dim strFilePath     As String           '添付オブジェクト格納用を宣言
    Dim strFilePath2    As String           '添付オブジェクト格納用パスを宣言
    
    funTEMPGET = True

    strFilePath = "NYKTEMP.BMP"                 '格納用命名
    strFilePath2 = App.Path & "\" & strFilePath '格納用パス指定
    
    'BLOB列を含むSELECT文
    strSQL = " SELECT TEMPNO , " & _
             "        EXPLANATION , " & _
             "        ATTACHEDCHART , " & _
             "        UPDPRSNLID , " & _
             "        UPDDATE , " & _
             "        INSPRSNLID , " & _
             "        INSDATE " & _
             "   FROM MTEMP " & _
             "  WHERE TEMPNO ='" & strConvert & "'"
         
    'ダイナセットの設定
    Set RecSet = gOraDatabase.CreateDynaset(strSQL, ORADYN_DEFAULT)
    
    '説明
    If Not IsNull(RecSet.Fields("EXPLANATION").Value) Then
        txtTEMPSetumei.Text = RecSet.Fields("EXPLANATION").Value
    End If

    '添付図オブジェクト
    'BLOB型にデータがあり??
    If IsNull(RecSet.Fields(2).Value) = True Then
        'データが無い!!
    Else
        'BLOB型のオブジェクトを設定
        Set objOraBlb = RecSet.Fields(2).Value
        'wk用ファイルパスへの書込み
        objOraBlb.CopyToFile strFilePath2
        'ピクチャーコントロールにWk用パスを設定
        imgTEMP.Picture = LoadPicture(strFilePath2)
        
        '入荷管理アプリケーションフォルダ内に一時的に排出された画像ファイルを削除
        Kill strFilePath2
    End If

    RecSet.Close

    'レコードセットの解放
    Set RecSet = Nothing
    'BLOB型のオブジェクトを解放
    Set objOraBlb = Nothing

    
exit_proc:
    Exit Function
Error_proc:
'    gVb_Error ("funTEMPGET")
    funTEMPGET = False
    Set RecSet = Nothing
    Set objOraBlb = Nothing
    GoTo exit_proc
End Function

--------------------------------------------------------------------------------------------------

引用返信 編集キー/
■13577 / inTopicNo.2)  Re[1]: VB6 ORACLEのBLOB型チェックについて
□投稿者/ 七曜 (60回)-(2008/01/31(Thu) 17:19:06)
No13574 (sada さん) に返信
ORACLE環境もVB6.0環境もないので推測でしかありませんが、

> 下記ロジックでは、
>
> If IsNull(RecSet.Fields(2).Value) = True Then
> 'データが無い!!

VB系はデフォルトだと配列は1から始まったと思いますので、これだと2番目を指していますよね。

> で、データがNULLにも関わらず、ELSEの方へ処理が移行してしまいます。
> 'BLOB列を含むSELECT文
> strSQL = " SELECT TEMPNO , " & _
> " EXPLANATION , " & _
> " ATTACHEDCHART , " & _
> " UPDPRSNLID , " & _
> " UPDDATE , " & _
> " INSPRSNLID , " & _
> " INSDATE " & _
> " FROM MTEMP " & _
> " WHERE TEMPNO ='" & strConvert & "'"

このSQL文の2番目の要素は、EXPLANATIONだと思われます。

> '説明
> If Not IsNull(RecSet.Fields("EXPLANATION").Value) Then
> txtTEMPSetumei.Text = RecSet.Fields("EXPLANATION").Value
> End If

ここでは、フィールド名で取得しているのに・・・

> '添付図オブジェクト
> 'BLOB型にデータがあり??
> If IsNull(RecSet.Fields(2).Value) = True Then
> 'データが無い!!
> Else

ここでは、フィールドコレクションの2番目で取っていますよね。
RecSet.Fields(2)の内容をステップ実行で確認すると良いかと思いますが
おそらく、RecSet.Fields("EXPLANATION")と一緒だと思われます。

BLOBとして評価したいのは、ATTACHEDCHART だと思われますので、
RecSet.Fields(3) か RecSet.Fields("ATTACHEDCHART")
とすればよろしいのではないでしょうか。



引用返信 編集キー/
■13580 / inTopicNo.3)  Re[2]: VB6 ORACLEのBLOB型チェックについて
□投稿者/ sada (3回)-(2008/01/31(Thu) 18:07:53)
七曜 様

非常にわかりづらいロジックで大変申し訳ありません。

この配列は0から始まっています。

よって、
> '添付図オブジェクト
> 'BLOB型にデータがあり??
> If IsNull(RecSet.Fields(2).Value) = True Then
> 'データが無い!!
> Else

ここでは"ATTACHEDCHART"が取得できています。

また、 RecSet.Fields("ATTACHEDCHART")
と指定しても、NULLの評価ができませんでした。

現在、画像データの処理を最後に持ってきて、エラートラップ内でエラーを無かったことにしております。
引用返信 編集キー/
■13581 / inTopicNo.4)  Re[2]: VB6 ORACLEのBLOB型チェックについて
□投稿者/ やじゅ (77回)-(2008/01/31(Thu) 18:09:42)
No13577 (七曜 さん) に返信
> ■No13574 (sada さん) に返信
> ORACLE環境もVB6.0環境もないので推測でしかありませんが、
>
>>下記ロジックでは、
>>
>>If IsNull(RecSet.Fields(2).Value) = True Then
>> 'データが無い!!
>
> VB系はデフォルトだと配列は1から始まったと思いますので、これだと2番目を指していますよね。
>

配列は0からなので、問題ありません。

VB系でBLOB扱う場合って、ADO GetChunkを使っていた気がします。
なので、IsNullではなく、取得サイズ=0で判断するのかなーと・・・
Oracle での 使用 ADO GetChunk/AppendChunk に BLOB データの方法
http://www.amy.hi-ho.ne.jp/jbaba/vbblob1.htm

BLOB型項目をSQLの検索条件に指定して検索したいのですが。
http://okwave.jp/qa3435536.html
引用返信 編集キー/
■13582 / inTopicNo.5)  Re[3]: VB6 ORACLEのBLOB型チェックについて
□投稿者/ sada (4回)-(2008/01/31(Thu) 18:35:06)
やじゅ様

ご回答いただきありがとうございます。

>VB系でBLOB扱う場合って、ADO GetChunkを使っていた気がします。
>なので、IsNullではなく、取得サイズ=0で判断するのかなーと・・・
>Oracle での 使用 ADO GetChunk/AppendChunk に BLOB データの方法
http://www.amy.hi-ho.ne.jp/jbaba/vbblob1.htm

GetChunkメソッドは接続モデルで言いますとADO,DAOを用いた手法となります。
現在のロジックではoo4oを利用したアプリケーションとなっております。

* oo4oにはGetChunkというメソッドは存在しません。

ADOではなくoo4oにて処理を行いたいと考えています。

oo4oにもGetChunkに似たメソッドが存在すれば、取得サイズ=0の判定が可能になると思われますが、
現在のところ見つかっていません(汗

宜しくお願い致します。
引用返信 編集キー/
■13583 / inTopicNo.6)  Re[4]: VB6 ORACLEのBLOB型チェックについて
□投稿者/ 七曜 (62回)-(2008/01/31(Thu) 18:45:35)

No13580 (sada さん) に返信

> この配列は0から始まっています。

失礼しました。


No13582 (sada さん) に返信
> ADOではなくoo4oにて処理を行いたいと考えています。

VB+oo4oは使用経験がないので、推測ばかりで申し訳ありませんがヒントになれば・・・。

下記、URLを見ますと何か専用のオブジェクトがあって、それを使うと取り出せる感じですね。
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/win.102/B25023-01/advfeat.htm

で、Readした時に長さが返ると思われるので、0判定すれば良いかも知れません。
引用返信 編集キー/
■13587 / inTopicNo.7)  Re[5]: VB6 ORACLEのBLOB型チェックについて
□投稿者/ sada (5回)-(2008/01/31(Thu) 19:39:50)
皆様

解決しました。
一度、フィールドサイズを取得してそのサイズが0であれば、NULLと同様という考え方の
評価を行うことに成功しました。

lngBLOB = RecSet.Fields("ATTACHEDCHART").FieldSize → ここで画像データのフィールドサイズを取得
If lngBLOB = 0 Then → ここで判定

今考えると割と単純な問題の様な気がしますが。
私はまだまだ未熟者のPGですね。

本当にありがとうございました。

■ソース
---------------------------------------------------------------------------------
Dim lngBLOB As Long '添付図オブジェクトフィールドサイズ格納用

'添付図のフィールドサイズを格納
lngBLOB = RecSet.Fields("ATTACHEDCHART").FieldSize

'添付図オブジェクト
'BLOB型にデータがあり??
If lngBLOB = 0 Then
'処理無し
Else
'BLOB型のオブジェクトを設定
Set objOraBlb = RecSet.Fields("ATTACHEDCHART").Value
'wk用ファイルパスへの書込み
objOraBlb.CopyToFile strFilePath2
'ピクチャーコントロールにWk用パスを設定
imgTEMP.Picture = LoadPicture(strFilePath2)

'入荷管理アプリケーションフォルダ内に一時的に排出された画像ファイルを削除
Kill strFilePath2
End If
---------------------------------------------------------------------------------


引用返信 編集キー/
■13588 / inTopicNo.8)  Re[4]: VB6 ORACLEのBLOB型チェックについて
□投稿者/ やじゅ (78回)-(2008/01/31(Thu) 19:41:45)
No13582 (sada さん) に返信
> やじゅ様
>
> GetChunkメソッドは接続モデルで言いますとADO,DAOを用いた手法となります。
> 現在のロジックではoo4oを利用したアプリケーションとなっております。
>

失礼しました。では、oo4oにて
ここでは、IsNull使ってますね、実際正常に動作しているかまでは不明ですが
http://www.mitene.or.jp/~rnk/TIPS_VB_oo4o.htm#Link7

引用返信 編集キー/
■13590 / inTopicNo.9)  Re[6]: VB6 ORACLEのBLOB型チェックについて
□投稿者/ sada (6回)-(2008/01/31(Thu) 19:55:24)
No13587 (sada さん) に返信
> 皆様
>
> 解決しました。
> 一度、フィールドサイズを取得してそのサイズが0であれば、NULLと同様という考え方の
> 評価を行うことに成功しました。
>
> lngBLOB = RecSet.Fields("ATTACHEDCHART").FieldSize → ここで画像データのフィールドサイズを取得
> If lngBLOB = 0 Then → ここで判定
>
> 今考えると割と単純な問題の様な気がしますが。
> 私はまだまだ未熟者のPGですね。
>
> 本当にありがとうございました。
>
> ■ソース
> ---------------------------------------------------------------------------------
> Dim lngBLOB As Long '添付図オブジェクトフィールドサイズ格納用
>
> '添付図のフィールドサイズを格納
> lngBLOB = RecSet.Fields("ATTACHEDCHART").FieldSize
>
> '添付図オブジェクト
> 'BLOB型にデータがあり??
> If lngBLOB = 0 Then
> '処理無し
> Else
> 'BLOB型のオブジェクトを設定
> Set objOraBlb = RecSet.Fields("ATTACHEDCHART").Value
> 'wk用ファイルパスへの書込み
> objOraBlb.CopyToFile strFilePath2
> 'ピクチャーコントロールにWk用パスを設定
> imgTEMP.Picture = LoadPicture(strFilePath2)
>
> '入荷管理アプリケーションフォルダ内に一時的に排出された画像ファイルを削除
> Kill strFilePath2
> End If
> ---------------------------------------------------------------------------------
>
>
解決済み
引用返信 編集キー/
■13597 / inTopicNo.10)  Re[4]: VB6 ORACLEのBLOB型チェックについて
□投稿者/ はつね (416回)-(2008/01/31(Thu) 20:14:44)
はつね さんの Web サイト
No13582 (sada さん) に返信
> GetChunkメソッドは接続モデルで言いますとADO,DAOを用いた手法となります。
> 現在のロジックではoo4oを利用したアプリケーションとなっております。
> 
> * oo4oにはGetChunkというメソッドは存在しません。

GetChunkメソッドありますよ。
LOBではなくLONG ROWなどに使用するものですがLOBに対しても使えたはず(コード実行しての確認はしていません)。

>   If IsNull(RecSet.Fields(2).Value) = True Then
>        'データが無い!!
>    Else
>        'BLOB型のオブジェクトを設定
>        Set objOraBlb = RecSet.Fields(2).Value

'BLOB型のオブジェクトを設定
Set objOraBlb = RecSet.Fields(2).Value
If objOraBlb.IsNull Then
     'データが無い!!
Else

だったような・・・。



引用返信 編集キー/
■13665 / inTopicNo.11)  Re[5]: VB6 ORACLEのBLOB型チェックについて
□投稿者/ sada (7回)-(2008/02/01(Fri) 11:29:16)
はつね様

ご回答いただきありがとうございます。

> GetChunkメソッドありますよ。
> LOBではなくLONG ROWなどに使用するものですがLOBに対しても使えたはず(コード実行しての確認はしていません)。

おっしゃるとおり存在しますね。
参考URL → http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/9808/visual/oo4o.html

嘘ついてしまいました。
申し訳ありません。

> 'BLOB型のオブジェクトを設定
> Set objOraBlb = RecSet.Fields(2).Value
> If objOraBlb.IsNull Then
> 'データが無い!!
> Else

objOraBlb.IsNullというロジックにて実行したところ判定が可能でした。
素晴らしいですね。
ありがとうございます。

でもなんで、IsNull(objOraBlb)では判定ができないのかがわかりません。
イミディエイドで確認してもobjOraBlbのValueはNullとなっているのに。


引用返信 編集キー/
■13675 / inTopicNo.12)  Re[6]: VB6 ORACLEのBLOB型チェックについて
□投稿者/ はつね (421回)-(2008/02/01(Fri) 12:27:32)
はつね さんの Web サイト
No13665 (sada さん) に返信
> でもなんで、IsNull(objOraBlb)では判定ができないのかがわかりません。
> イミディエイドで確認してもobjOraBlbのValueはNullとなっているのに。

LOBなので他のデータ型と同じようにしておくと意図せず大量データを読み込んでしまい性能劣化に繋がるので意図的に変えてあるとか色々想像できますが、そういう作りになっているからとしかいいようがないですね〜。


#前回の投稿を書いているうちに解決済みとなっていたため、投稿した事で解決済みがはずれていたので、解決済みを付けさせて頂いています。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -