c++ mysql 存储图片路径_3.用ADO实现图片在数据库中存储
在網上看到了不少介紹
VB
如何在
SQL SERVER
中存取圖片數據的文章。
經自己實現后,最終把心得拿出來和大家分享。
經
搜索,網上的對數據庫圖片進行存儲的文章,絕大部分是來自一篇。都是采用
ADO Stream
方法使用
field
對象的
AppendChunk
和
GetChunk
方法將大容量的二進制數組通過
Update
存儲到數據庫中。
Dim Conn as ADODB.Connection'
聲明
Connection
對象
Dim Rs as ADODB.RecordSet'
聲明
RecordSet
對象
CONST BLOCKSIZE=4096'
定義緩沖區塊大小
Set Conn = New ADODB.Connection
Conn.ConnectionString = " DATA SOURCE = PUBS "'ODBS
數據源名稱為
PUBS
Conn.Open
Set Rs = New ADODB.RecordSet
Rs.Open "test", Conn, adOpenKeyset, adLockOptimistic'
數據庫表為
"test"
Dim Data() as Byte'
聲明字節型數組,存放數據庫圖片信息
Dim FileLength as Integer'
文件長度變量
Dim BlockNum as Integer'
存放緩沖區塊的個數
Dim DataLeft as Integer'
存放取整塊后的遺留信息
Open "C:\TEST.BMP" for BINARY as #1'
假設圖片文件為
C:\TEST.BMP
Dim i as Integer
FileLength = LOF(1)
BlockNum = FileLength \ BLOCKSIZE'
整取塊大小,得緩沖區塊數
DataLeft = FileLength Mod BLOCKSIZE'
整塊取后的遺留
ReDim Data(BLOCKSIZE)'
重新定義緩沖區塊大小為
BLOCKSIZE
For i=1 to BlockNum
Get #1,,Data()
Rs(0).AppenChunk Data()'
將
Data()
復制至
Rs(0)
字段,假設
test
表中的
image
為第一字段
Next i
ReDim Data(DataLeft)'
重新定義塊大小取得遺留信息
Get #1,,Data()
Rs(0).AppendChunk Data()'
此時圖片信息已全部拷貝至當前記錄
Rs(0)
字段
Close #1
...
Rs.UpDate
具體的存儲方法如上所述。
下面將簡單的介紹取出信息的方法:
介紹說,將圖片二進制存儲信息用
GetChunk
方法取出,將其存儲為臨時文件即可。
REM
設
Rs
為打開的數據庫表對應的
RecordSet
對象,其中的
image
對象仍然為第一字段
REM
接著上面的思路
Dim Data() as Byte'
聲明字節型數組,存放數據庫圖片信息
Dim FileLength as Integer'
文件長度變量
Dim BlockNum as Integer'
存放緩沖區塊的個數
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
方法有一個參數為
Size
Next i
Put #1,,Data()
ReDim Data(DataLeft)
Data() = Rs(0).GetChunk(DataLeft)
Put #1,,Data()
Close #1
關于存取的內容全部于上面已經列出,組織的方法還請各位網友自行去組織一下。
如果有什么缺乏說明或是不正確的地方,還請各位能夠指出。
對于此問題的實現,本人還有一個設想,打算利用
SQL SERVER
的服務器端來實現存儲過程,使得客戶端的存取數據庫圖片信息更加方便。
具體的實現可能還得努力等看書之后,期待中
......
后記:
在具體存儲過程中,遇到了一個關于Rs的屬性長度的問題,原先采用的是Len(Rs(0))[Rs(0)為image對象],但測試時總是缺少一半的字符長度,后來查明對于Byte型數組進行Len()求值時,只會取到一半的數值。如:
Dim?a(4096)?as ByteMsgbox Len(a())
結果是:2048
原因分析:可能跟VB中Len函數的ANSI或是UniCODE有關。但是了準確的原因還沒有查出,因為時間關系,暫時還不能去做,到時查出后再附上。
總結
以上是生活随笔為你收集整理的c++ mysql 存储图片路径_3.用ADO实现图片在数据库中存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java文件异步上传_[Java教程]原
- 下一篇: java旺季机票_java-第四章-机票