日誌 - Crux 的日誌
 訂閱 Crux 的日誌

2007/05/07
[VB6] 讀取 Oracle BLOB 文字資料

作者: Crux (13:02:48)
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 strSQLconn[/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為單位來讀, 就花了很多時間在合併上了. 不過合併這種東西, 依寫入資料有所不同, 所以就不多說了..
閱讀 Crux 的日誌 | 迴響 (0) | 引用次數 (0) | 瀏覽次數 (10397)
列印這一篇日誌 發送這篇日誌給你的朋友(Email)
網友個人意見,不代表本站立場,對於發言內容,由發表者自負責任。
發表評論
評論規則*
任何人都可以發表評論
標題*
姓名*
信箱*
網站*
內容*
確認碼*
9 - 6 = ?  
輸入運算式的結果
您最多可以嘗試:10 次

日誌月曆

        

會員登入

小老虎成長中

小小龍成長中

搜尋




JUMP to TOP - 28.11.2024 -