前言:本站為你精心整理了OLE字段加密功能范文,希望能為你的創(chuàng)作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。
摘要:在VisubalBasic6.0中,利用微軟的ADO技術,討論了如何把OLE字段加密存儲到ACCESS數(shù)據(jù)庫中,以及如何從ACCESS中獲取OLE字段并解密的實現(xiàn)方法。
關鍵詞:ADO;OLE字段;數(shù)據(jù)加密;VisubalBasic
0前言
在開發(fā)MIS或OA類的軟件時,經常需要將外部圖片或各類文件保存在數(shù)據(jù)庫中,目前的關系數(shù)據(jù)庫大都有一個大二進制字段,可以保存該類數(shù)據(jù)。將圖片及文件以二進制方式存儲在數(shù)據(jù)庫中,可以考慮以下兩種方法:一是使用ADO的Stream對象的LoadFromFile方法以及SaveToFile方法實現(xiàn);二是使用ADO的Recordset.Field對象的GetChunk以及AppendChunk方法實現(xiàn)。鑒于數(shù)據(jù)的安全性,需要將保存在OLE字段的數(shù)據(jù)加密。
1實現(xiàn)步驟
一個通用的方法是可以先將外部文件或圖片加密,然后再保存到OLE字段中,解密時反向操作即可,缺點是效率不高。對于使用ADO的Stream對象或ADO的Recordset.Field對象的GetChunk、AppendChunk保存數(shù)據(jù)的方法,由于在操作中使用了數(shù)組,可以直接將加密、解密算法在內存中直接操作,所以在效率及安全方面都比前者的方法要好。
2AppendChunk及Getchunk方法簡介
2.1AppendChunk方法
語法:Object.AppendChunkData;對象Data是變體型,包含追加到對象中的數(shù)據(jù)。使用Field或Parameter對象的AppendChunk方法可將長二進制或字符數(shù)據(jù)填寫到對象中。在系統(tǒng)內存有限的情況下,可以使用AppendChunk方法對長整型值進行部分而非全部的操作。
在Field對象上的第一個AppendChunk調用將數(shù)據(jù)寫入字段,覆蓋任何現(xiàn)有的數(shù)據(jù),隨后的AppendChunk調用則添加到現(xiàn)有數(shù)據(jù)。如果將數(shù)據(jù)追加到一個字段,然后設置或讀取當前記錄中另一個字段的值,ADO則認為已將數(shù)據(jù)追加到第一個字段。如果在第一個字段上再次調用AppendChunk方法,那么ADO將調用解釋為新的AppendChunk操作并覆蓋現(xiàn)有數(shù)據(jù)。訪問其他Recordset對象(并非第一個Recordset對象的復制品)中的字段將不會破壞AppendChunk操作。
2.2Getchunk方法
語法:variable=field.GetChunk(Size);使用Field對象的GetChunk方法來檢索其中的部分或全部長二進制或字符數(shù)據(jù)。在系統(tǒng)內存有限的情況下,可使用GetChunk方法操作部分而非全部Long值。
GetChunk調用返回的數(shù)據(jù)將被分配給Variable。如果Size大于剩余的數(shù)據(jù),GetChunk方法僅返回剩余的數(shù)據(jù)而不用空格填充Variable。如果該字段為空,GetChunk方法將返回Null值。每個后續(xù)的GetChunk調用將從上一次GetChunk調用停止處開始檢索數(shù)據(jù)。
3ADOStream簡介
顧名思義,ADOStream以流的方式來操作文件或記錄。通過Open方法來打開Stream對象來操作二進制或文本數(shù)據(jù)的流,通過Read或Write來讀寫流。用SaveToFile和LoadFromFile方法保存和恢復文件中的數(shù)據(jù)。
4關鍵代碼分析
4.1使用AppendChunk將文件保存到OLE字段:
PublicSubCopyFiletoField(fldAsADODB.Field,sfName)
DimioSizeAsLong
DimiAsLong,ifSizeAsLong,iKeyasByte
iKey=2''''密鑰
DimA1()AsByte,A2()AsByte,A3()AsByte''''定義字節(jié)數(shù)組存放文件內容
ifSize=FileLen(sfName)
OpensfNameForBinaryAccessReadAs#1
ReDimA2(ifSize)''''放大數(shù)組
ReDimA3(ifSize)
DimjAsLong
DimlLenAsLong
lLen=UBound(A3)
Get#1,,A3()
Forj=0TolLen-1
A2(j)=A3(j)XoriKey''''這里用簡單的異或算法來加密
Next
fld.AppendChunkA2''''寫入OLE字段
Close#1
EndSub
4.2使用GetChunk將OLE字段保存為文件:
PublicSubCopyFieldToFile(sfNameAsString,fldAsADODB.Field)
OnErrorResumeNext
……
OpensfNameForBinaryAccessWriteLockWriteAs#1
ioSize=fld.ActualSize
iChunks=ioSize/iSize''''分塊數(shù)目
iRestSize=ioSizeModiSize''''余下的部分
A1()=fld.GetChunk(iRestSize)
A2=A1
lLen=UBound(A1)
Forj=0TolLen-1
A2(j)=A1(j)XoriKey''''再次異或計算就還原為原來的文件了
Next
Put#1,,A2()
EndIf
……
Nexti
Close#1
EndSub
4.3以流的方式保存文件到數(shù)據(jù)庫中
PublicSubSaveFileToDB(fAsString,fldAsString)
DimiStmAsADODB.Stream
DimiReAsADODB.Recordset
DimiConcStrAsString
SetiStm=NewADODB.Stream
DimiFileSizeAsLong
DimA1()AsByte,A2()AsByte
WithiStm
.Type=adTypeBinary''''二進制模式
.Open
.LoadFromFilef
iFileSize=.Size
.Position=0
A1=.Read''''''''讀取流到字節(jié)數(shù)組
EndWith
iStm.Position=0
A2=A1
DimiAsLong
iFileSize=UBound(A1)
Fori=0ToiFileSize-1
A2(i)=A1(i)Xor2
Next
iStm.WriteA2
''''數(shù)據(jù)庫連接字符串
iConc=cnnStr
''''打開保存文件的表SetiRe=NewADODB.Recordset
iStm.Position=0
WithiRe
.Open“tbWord”,iConc,adOpenKeyset,adLockOptimistic
.Fields(fld)=iStm.Read
.Update
EndWith
''''完成后關閉對象
iRe.Close
iStm.Close
EndSub
4以流的方式從數(shù)據(jù)庫讀取數(shù)據(jù)生成文件
PublicFunctionReadFileFromDB(fAsString,fldAsString)AsString
……
SetiRe=NewADODB.Recordset
iRe.Open“tbWord”,iConc,adOpenKeyset,adLockReadOnly
''''保存到文件
SetiStm=NewADODB.Stream
WithiStm
.Mode=adModeReadWrite
.Type=adTypeBinary
.Open
.WriteiRe(fld)
.Position=0
A1=iRe(fld)
A2=A1
DimiAsLong
iFileSize=UBound(A1)
Fori=0ToiFileSize
A2(i)=A1(i)Xor2
Next
.WriteA2
.Position=0
.SaveToFilef,adSaveCreateOverWrite''''生成文件
EndWith
iRe.Close
iStm.Close
EndFunction
5結束語
ADO的Stream對象和Recordset.Field對象的GetChunk、AppendChunk方法是操作數(shù)據(jù)庫OLE字段常用的兩種方法。GetChunk、AppendChunk方法相對來說要通用一些,在一些低版本的ADO中,Stream可能得不到很好的支持。限于篇幅,文中的代碼略有刪減。
參考文獻
[1]魏新俊,郭力平,MicrosoftAccess2.0/7.0[M].北京:清華大學出版社,1997.
[2]陳虹頤,何春.VB6.0中利用ADO對象實現(xiàn)數(shù)據(jù)庫編程[J].甘肅科技,2007,23(4).