- PR -

OracleからBLOB型データ(Bitmap)の読み取り

1
投稿者投稿内容
Ukeke。
会議室デビュー日: 2002/07/29
投稿数: 8
投稿日時: 2002-10-18 14:13
こんにちは。
 
Oracle9i Database に格納されているBLOBデータ(ビットマップ)の読み取りを行おうと、

[HOW TO] Visual Basic .NET で ADO.NET を使用して BLOB データの読み取りや
書き込みを行う方法
http://support.microsoft.com/default.aspx?scid=kb;ja;jp308042

を参考に処理を作成しました。
処理は問題なく実行されたのですが、生成されたビットマップを開こうとするとすると
『このファイルは読み取れません。
 このビットマップは無効であるか、または現在サポートされていない形式です。』
とエラーメッセージが表示され、開くことができませんでした。

以下にソースと環境を記します。

■環境
 ・ImageTest.aspxを作成し、「Button」Webコントロール(ID: Button1)を配置。
 ・DBテーブル(MYIMAGES)構成
  ID  NUMBER(5) NOT NULL PRIMARY KEY
IMGFIELD BLOB
 ・BLOB型フィールド"IMGFIELD"にはビットマップファイル(TEST.bmp)が格納されています。
 ・出力先"C:\tmp"にはテスト用にフルコントロール権限を与えております。

■ソース
ImageTest.aspx.vbソース------------------------------------ ここから

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim mySelect As String = "Select * From MYIMAGES WHERE ID='11111'"
Dim myConnection As New OleDb.OleDbConnection("PROVIDER=OraOLEDB.ORACLE;DATA Source=AAA;User ID=AAA; Password=AAA;")
Dim myDataAdapter As New OleDb.OleDbDataAdapter(mySelect, myConnection)
Dim MyCB As OleDb.OleDbCommandBuilder = _
New OleDb.OleDbCommandBuilder(myDataAdapter)
Dim myDataSet As New DataSet()

myConnection.Open()
myDataAdapter.Fill(myDataSet, "MYIMAGES")

Dim myRow As Data.DataRow
myRow = myDataSet.Tables("MYIMAGES").Rows(0)

Dim MyData() As Byte
MyData = myRow("IMGFIELD")
Dim K As Long
K = UBound(MyData)

Dim fs As New IO.FileStream("C:\tmp\TEST.bmp", _
IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
fs.Write(MyData, 0, K)
fs.Close()

fs = Nothing
MyCB = Nothing
myDataSet = Nothing
myDataAdapter = Nothing
myConnection.Close()
myConnection = Nothing
End Sub 

ImageTest.aspx.vbソース------------------------------------ ここまで

■開発環境
 ・言語:ASP.NET(VB.NET)
 ・ブラウザ:IE6.0
 ・開発機OS:Windows2000
・サーバーOS:Windows2000 Server
 ・Webサーバー:IIS5.0
 ・DB:Oracle9i Database

長文申し訳ありません。
何かエラーの原因に関する情報をお持ちの方がいらっしゃいましたら、
よろしくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-10-18 17:00
こんにちは。
引用:

Ukeke。さんの書き込み (2002-10-18 14:13) より:
 
Oracle9i Database に格納されているBLOBデータ(ビットマップ)の読み取りを行おうと、

処理は問題なく実行されたのですが、生成されたビットマップを開こうとするとすると
『このファイルは読み取れません。
 このビットマップは無効であるか、または現在サポートされていない形式です。』
とエラーメッセージが表示され、開くことができませんでした。


 これって、SQL Server用ですよね。ORACLEは、私もやろうとしてできなかったのですが、パッケージ(ORACLEにインストールする、PL/SQLのかたまりの方ね)を使え、と、アドバイスされました。


引用:
コード:
    fs = Nothing
    MyCB = Nothing
    myDataSet = Nothing
    myDataAdapter = Nothing
    myConnection = Nothing



この辺の、Nothingを代入する処理はいらないのでは?
(.NET ではいらない、と信じているのですが、いるの?)
Ukeke。
会議室デビュー日: 2002/07/29
投稿数: 8
投稿日時: 2002-10-21 10:13
Jitta様、ご返答ありがとうございました。


このエラーですが、なんとか解決いたしました。
(「解決したようです。」が正しいかもしれません。)
プログラムのテストをするためのデータを準備する際、テーブル(MYIMAGES)へ
Accessでリンクを張り、対象フィールド(IMGFIELD)へ「オブジェクトの挿入」
を使用して直接ビットマップファイルを格納していた事が原因かと思われます。

ASP.NETでoo4o(8.1.7.3.15)のCopyFromFile()を使用したプログラムを作成して、
そのプログラムにより格納したデータの読み取りをおこなった際は、
正常なビットマップが生成されました。

なお、プログラム中の
------------------------
fs.Write(MyData, 0, K)
------------------------
の部分なのですが、
------------------------
fs.Write(MyData, 0, K + 1)
------------------------
としなければ、生成されたファイルのサイズが元ファイルより
0.001バイトほど小さくなるようでした。
"K"に格納される値が元ファイル(MyData)より1ほど小さいのが原因と
思われるのですが、この辺は良くわからないです。


>この辺の、Nothingを代入する処理はいらないのでは?
>(.NET ではいらない、と信じているのですが、いるの?)

サンプルに記述してあったので記述しましたが、
特に必要は無いと思われます。
なんとなく書いてしまうんですよね(要領が悪いです)。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-10-21 14:26
引用:

Ukeke。さんの書き込み (2002-10-21 10:13) より:
なお、プログラム中の
------------------------
fs.Write(MyData, 0, K)
------------------------
の部分なのですが、
------------------------
fs.Write(MyData, 0, K + 1)
------------------------
としなければ、生成されたファイルのサイズが元ファイルより
0.001キロバイトほど小さくなるようでした。
"K"に格納される値が元ファイル(MyData)より1ほど小さいのが原因と
思われるのですが、この辺は良くわからないです。


 UBound関数は、「使用できる添え字の最大数」を返します。「要素の数」を知るには、GetLengthメソッドを使います。このあたり、VB6.0とは違います。「添え字」と「要素の数」の違いについて、理解してください。
1

スキルアップ/キャリアアップ(JOB@IT)