2017-10-17 8 views
2

Access 2013レポートでは、リンクテーブルを介してOracle DBビューに接続します。 1つのビューフィールドはBLOBタイプであり、以前にそこに格納されたイメージを保持します。Blobイメージをmsにインポートする際の例外アクセスレポート

マイ・アクセス・レポートで、リンクされた表には、Oracle DBのBLOBフィールドにマップされるタイプ「OLEオブジェクト」のフィールド(BILD_INHALTという名前)があります。私は時に次の例外を取得し、実行時に

If Len(RS![BILD_INHALT]) > 0 Then 
    Me.MST_Image.PictureData = RS![BILD_INHALT] 
End If 

は、レポートビューでは、私は(MST_Imageという名前の)「画像」フィールドは画像をロードするために持って作成され、それは次のように初期化されますOracleからのコンテンツでMST_Image.PictureDataを初期化します。

enter image description here

私はこの(非常に古い)トピックに関する詳細なドキュメントについて、インターネット上で確認したが、私は、この特定の問題については何も見つけることができませんでした。

答えて

2

Microsoft Accessのイメージコントロールは、ファイルの場所にバインドするか、画像が.dibdevice independent bitmap format、より曖昧なイメージ形式の1つ)に設定されている可能性があります。

しかし、それを回避することは簡単ではありません。

あなたはいくつかの方法でこの制限を回避することができます。

  1. は、複数の画像フォーマットをサポートし、ActiveXコントロールを使用して、一時フォルダ内
  2. ディスクに保存した画像(発見される複数あります)そして、Webブラウザコントロールを使用し、embedded BASE64 image
を使用して、あなたの画像を表示するためにHTMLに <img />タグを使用
  • その場所にイメージコントロールソースを設定ここ

    アプローチ3のコード例である:

    まず、BASE64にOLEオブジェクトに含まれるバイナリコードを変換できるようにする必要があり:

    Public Function ToBase64(Bytes As Variant) As String 
        Dim XMLElement As Object 
        Set XMLElement = CreateObject("Msxml2.DOMDocument.6.0").createElement("tmp") 
        XMLElement.DataType = "bin.base64" 
        XMLElement.nodeTypedValue = Bytes 
        ToBase64 = Replace(XMLElement.Text, vbLf, "") 
    End Function 
    

    そして、我々が使用することができウェブブラウザコントロール、およびそれにBASE64でエンコードされた画像を含むWebページを挿入します。

    MyWebbrowserControlあなたのWebBrowserコントロールの名前です
    Public Sub InsertImageInControl() 
        Dim wb As Object 
        Set wb = MyWebbrowserControl.Object 
        With wb 
         .Navigate2 "about:blank" 
         Do Until .ReadyState = 4 '=READYSTATE_COMPLETE 
          'This is a somewhat inefficient way to wait, but loading a blank page should only take a couple of milliseconds 
          DoEvents 
         Loop 
         .Document.Open 
         .Document.Write "<!DOCTYPE html><HTML><HEAD><TITLE>A</TITLE></HEAD><BODY scroll=""no"" style=""margin: 0px; padding: 0px;"">" 
         .Document.Write "<img alt="""" style=""width:100%; margin: 0px; padding: 0px;"" src=""data:image/jpg;base64," 
         .Document.Write ToBase64(MyOLEObject.Value) 
         .Document.Write """ />" 
         .Document.Write "</BODY></HTML>" 
         .Document.Close 
        End With 
    End Sub 
    

    image/jpgがあなたのイメージトンでありますype、MyOLEObjectはあなたのOLEオブジェクトです。

    ヒント:

    • は、WebブラウザーのActiveXコントロールを使用しますが、アクセスが付属して1を使用しないでください。そうでなければ、取り除くことができない3dボーダーのInternet Explorerの古いバージョンが手に入ります。
    • は答えのために空白のページ
  • +0

    感謝エリックとして、それを初期化するために="about:blank"にWebブラウザコントロールのコントロールソースを設定します。 Accessレポートは、私の同僚とVBソース(BLOBSとして保存されている画像)のVB.netで作成されています。クライアントの管理下にあります。問題を解決するための時間が に限定されているため、私はあなたの第2の提案を試みます。 – Francesco

    +0

    @Francesco言われたように、私は第3の解決策のためのVBAコード例を持っていますが、それは短くはないかもしれませんが、ほとんど変更を必要としません。しかし、2番目の解決方法も問題ありません。もし私がそれを読もうとするなら、[チップPearsonsは一時的なフォルダとVBAでファイルを扱う](http://www.cpearson.com/excel/WorkingWithTempFilesAndFolders.htm)を読むことをお勧めします。 –

    +0

    あなたのVBAのサンプルコードを見ることができれば、私は感謝しています。あなたはそれをブログに公開していますか、それを手に入れる方法を教えてもらえますか?もう一度ありがとう – Francesco

    関連する問題