• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            TanZek's 技術(shù)空間

            勇往直前,專注于技術(shù)...

            首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              7 Posts :: 19 Stories :: 13 Comments :: 0 Trackbacks

            在網(wǎng)上看到了不少介紹 VB 如何在 SQL SERVER 中存取圖片數(shù)據(jù)的文章。

            經(jīng)自己實(shí)現(xiàn)后,最終把心得拿出來(lái)和大家分享。

            ?

            經(jīng) GOOGLE 搜索,網(wǎng)上的對(duì)數(shù)據(jù)庫(kù)圖片進(jìn)行存儲(chǔ)的文章,絕大部分是來(lái)自一篇。都是采用 ADO Stream 方法使用 field 對(duì)象的 AppendChunk GetChunk 方法將大容量的二進(jìn)制數(shù)組通過(guò) Update 存儲(chǔ)到數(shù)據(jù)庫(kù)中。

            ?

            Dim Conn as ADODB.Connection???? ' 聲明 Connection 對(duì)象

            Dim Rs as ADODB.RecordSet??? ' 聲明 RecordSet 對(duì)象

            CONST BLOCKSIZE=4096??? ' 定義緩沖區(qū)塊大小

            ?

            Set Conn = New ADODB.Connection

            Conn.ConnectionString = " DATA SOURCE = PUBS "??? 'ODBS 數(shù)據(jù)源名稱為 PUBS

            Conn.Open

            Set Rs = New ADODB.RecordSet

            Rs.Open "test", Conn, adOpenKeyset, adLockOptimistic??? ' 數(shù)據(jù)庫(kù)表為 "test"

            ?

            Dim Data() as Byte???? ' 聲明字節(jié)型數(shù)組,存放數(shù)據(jù)庫(kù)圖片信息

            Dim FileLength as Integer??? ' 文件長(zhǎng)度變量

            Dim BlockNum as Integer???? ' 存放緩沖區(qū)塊的個(gè)數(shù)

            Dim DataLeft as Integer????? ' 存放取整塊后的遺留信息

            ?

            Open "C:\TEST.BMP" for BINARY as #1??? ' 假設(shè)圖片文件為 C:\TEST.BMP

            Dim i as Integer

            FileLength = LOF(1)

            BlockNum = FileLength \ BLOCKSIZE????? ' 整取塊大小,得緩沖區(qū)塊數(shù)

            DataLeft = FileLength Mod BLOCKSIZE???? ' 整塊取后的遺留

            ReDim Data(BLOCKSIZE)??? ' 重新定義緩沖區(qū)塊大小為 BLOCKSIZE

            For i=1 to BlockNum

            ?????? Get #1,,Data()

            ?????? Rs(0).AppenChunk Data()??? ' Data() 復(fù)制至 Rs(0) 字段,假設(shè) test 表中的 image 為第一字段

            Next i

            ReDim Data(DataLeft)??? ' 重新定義塊大小取得遺留信息

            Get #1,,Data()

            Rs(0).AppendChunk Data()???? ' 此時(shí)圖片信息已全部拷貝至當(dāng)前記錄 Rs(0) 字段

            Close #1

            ...

            Rs.UpDate

            ?

            具體的存儲(chǔ)方法如上所述。

            ?

            下面將簡(jiǎn)單的介紹取出信息的方法:

            ??? 介紹說(shuō),將圖片二進(jìn)制存儲(chǔ)信息用 GetChunk 方法取出,將其存儲(chǔ)為臨時(shí)文件即可。

            REM?? 設(shè) Rs 為打開(kāi)的數(shù)據(jù)庫(kù)表對(duì)應(yīng)的 RecordSet 對(duì)象,其中的 image 對(duì)象仍然為第一字段

            REM?? 接著上面的思路

            ?

            Dim Data() as Byte??? ?' 聲明字節(jié)型數(shù)組,存放數(shù)據(jù)庫(kù)圖片信息

            Dim FileLength as Integer??? ' 文件長(zhǎng)度變量

            Dim BlockNum as Integer???? ' 存放緩沖區(qū)塊的個(gè)數(shù)

            Dim DataLeft as Integer????? ' 存放取整塊后的遺留信息

            Dim i as Integer

            ReDim Data(BLOCKSIZE)

            Open "C:\TMP.BMP" for BINARY as #1

            FileLength = Rs(0).ActualSize

            BlockNum = FileLength \ BLOCKSIZE

            DataLeft = FileLength Mod BLOCKSIZE

            ReDim Data(BLOCKSIZE)

            For i = 1 to BlockNum

            ?????? Data() = Rs(0).GetChunk(BLOCKSIZE)??? 'GetChuk 方法有一個(gè)參數(shù)為 Size

            Next i

            Put #1,,Data()

            ReDim Data(DataLeft)
            Data() = Rs(0).GetChunk(DataLeft)

            Put #1,,Data()

            Close #1

            ?

            關(guān)于存取的內(nèi)容全部于上面已經(jīng)列出,組織的方法還請(qǐng)各位網(wǎng)友自行去組織一下。

            如果有什么缺乏說(shuō)明或是不正確的地方,還請(qǐng)各位能夠指出。

            ?

            對(duì)于此問(wèn)題的實(shí)現(xiàn),本人還有一個(gè)設(shè)想,打算利用 SQL SERVER 的服務(wù)器端來(lái)實(shí)現(xiàn)存儲(chǔ)過(guò)程,使得客戶端的存取數(shù)據(jù)庫(kù)圖片信息更加方便。

            具體的實(shí)現(xiàn)可能還得努力等看書(shū)之后,期待中 ......


            后記:
            在具體存儲(chǔ)過(guò)程中,遇到了一個(gè)關(guān)于Rs的屬性長(zhǎng)度的問(wèn)題,原先采用的是Len(Rs(0))[Rs(0)為image對(duì)象],但測(cè)試時(shí)總是缺少一半的字符長(zhǎng)度,后來(lái)查明對(duì)于Byte型數(shù)組進(jìn)行Len()求值時(shí),只會(huì)取到一半的數(shù)值。如:
            Dim?a(4096)?as Byte
            Msgbox Len(a())
            結(jié)果是:2048

            原因分析:可能跟VB中Len函數(shù)的ANSI或是UniCODE有關(guān)。但是了準(zhǔn)確的原因還沒(méi)有查出,因?yàn)闀r(shí)間關(guān)系,暫時(shí)還不能去做,到時(shí)查出后再附上。

            posted on 2006-04-22 00:16 TanZek 閱讀(493) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 家教辦公系統(tǒng)的開(kāi)發(fā)日志
            久久精品一区二区| 久久久久亚洲AV无码麻豆| 日日狠狠久久偷偷色综合免费| 久久精品国产精品亜洲毛片| 久久人人爽人人爽人人片AV不| 国产精品对白刺激久久久| 久久久久亚洲AV无码专区桃色| 综合网日日天干夜夜久久| 国产精品青草久久久久福利99| 久久精品国产99久久久古代| 99热精品久久只有精品| 麻豆成人久久精品二区三区免费| 亚洲国产精久久久久久久| 久久亚洲私人国产精品vA| 狠狠色丁香久久婷婷综合_中| 热久久国产精品| 99久久精品午夜一区二区 | 久久久久亚洲Av无码专| 四虎久久影院| 久久亚洲天堂| 成人a毛片久久免费播放| 91精品国产乱码久久久久久| 97精品依人久久久大香线蕉97 | 国产精品久久久亚洲| 久久久亚洲AV波多野结衣| 亚洲国产日韩欧美综合久久| 国产亚州精品女人久久久久久| 精品九九久久国内精品| 国产欧美一区二区久久| 99国产欧美精品久久久蜜芽| 亚洲午夜久久久久久久久电影网| 久久99这里只有精品国产| 欧美亚洲另类久久综合婷婷| 久久精品中文字幕有码| 久久婷婷五月综合97色直播| 久久久久国产日韩精品网站| 欧美久久亚洲精品| 久久这里都是精品| 亚洲成色www久久网站夜月 | 大香网伊人久久综合网2020| 国产午夜福利精品久久|