Oracle BLOB 型態是可以儲存大量資訊 (4GB) 的二進制型態, 比較常看到的是用來儲存圖片, 網路上的範例也幾乎都是圖片, 連MSDN也是. 不過我這篇「讀取文字資料」, 是上星期遇上的 Case.
首先是連線到 Oracle, 要注意的一點是, 不是所有 VB6 支援的連線方式都認得BLOB型態的欄位, 所以 Data Provider 必須使用 Oracle 提供的介面
[font=Arial] conn.Provider = "MSDataShape"
conn.Open "[b]Data Provider=OraOLEDB.Oracle.1[/b];Password=123;User ID=AAA;
Data Source=testDB;Persist Security Info=True"[/font]
設完連線之後就可以下個SQL, 把資料撈回來
[font=Arial] strSQL = "select blobdatafrom binmap where object_id = 1"
Set Rs = New ADODB.Recordset
Rs.CursorType = adOpenKeyset
Rs.LockType = adLockOptimistic
Rs.Open strSQL, conn[/font]
接下來就是取出了, 這裡的問題在於 - 取出的文字可能是亂碼! (文字資料的編碼問題) 所以資料取出後, 必須做一個Unicode的轉換.
[font=Arial] Dim str As String
Dim strLine As String
Dim strTemp As String
Dim size As Long
Dim offset As Long
Do Until Rs.EOF
' 取得資料的大小, 做為讀取的依據
size = Rs("blobdata").ActualSize
Do While offset < size
' 一個bytes一個bytes的讀出, 並做編碼轉換
str = [b]StrConv(Rs("blobdata").GetChunk(1), vbUnicode)[/b]
If (str <> Chr(10)) Then ' 我的Case以斷行符號做為每一筆資料的間隔
strLine = strLine & str
Else
Debug.Print strLine
End If
offset = offset + 1
Loop
Rs.MoveNext
Loop[/font]
上頭是一個bytes一個bytes慢慢讀, 其實是很慢的, 也可以一次大量讀回, 不過要如何正確的合併資料就是學問了 (何時斷行? 何時合併?), 在此就不提了.
另外也可以選擇把資料寫回文件裡, 比起即時讀資料處理簡單的多, 而且不用擔心亂碼的問題.
[font=Arial] Dim mystream As ADODB.Stream
Set mystream = New ADODB.Stream
mystream.Type = adTypeBinary
mystream.Open
[b]mystream.Write Rs("blobdata")[/b] ' 這樣就全寫進去了
mystream.SaveToFile "test.txt", adSaveCreateOverWrite
mystream.Close[/font]
完成了, BLOB 型態的資料順利的讀回! 看起來滿簡單的吧?
不過事實上這小小的幾行, 花了我大半天的時間, 先是 BLOB 在原有的Connection 中無效, 所以自己去翻出來可用的連線方法, 再來則是亂碼的問題, 網路上幾乎都是圖片存取, 看到有些人在詢問, 但也沒得到解答. 而最花時間的則是資料合併了, 1Bytes的讀法合併很容易, 但實在太慢, 後來改以1000為單位來讀, 就花了很多時間在合併上了. 不過合併這種東西, 依寫入資料有所不同, 所以就不多說了..