- - PR -
OracleからBLOB型データ(Bitmap)の読み取り
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 長文申し訳ありません。 何かエラーの原因に関する情報をお持ちの方がいらっしゃいましたら、 よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2002-10-18 17:00
こんにちは。
これって、SQL Server用ですよね。ORACLEは、私もやろうとしてできなかったのですが、パッケージ(ORACLEにインストールする、PL/SQLのかたまりの方ね)を使え、と、アドバイスされました。
この辺の、Nothingを代入する処理はいらないのでは? (.NET ではいらない、と信じているのですが、いるの?) | ||||||||||||
|
投稿日時: 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 ではいらない、と信じているのですが、いるの?) サンプルに記述してあったので記述しましたが、 特に必要は無いと思われます。 なんとなく書いてしまうんですよね(要領が悪いです)。 | ||||||||||||
|
投稿日時: 2002-10-21 14:26
UBound関数は、「使用できる添え字の最大数」を返します。「要素の数」を知るには、GetLengthメソッドを使います。このあたり、VB6.0とは違います。「添え字」と「要素の数」の違いについて、理解してください。 |
1