首頁 > 文章中心 > 正文

      OLE字段加密功能

      前言:本站為你精心整理了OLE字段加密功能范文,希望能為你的創(chuàng)作提供參考價(jià)值,我們的客服老師可以幫助你提供個(gè)性化的參考范文,歡迎咨詢。

      OLE字段加密功能

      摘要:在VisubalBasic6.0中,利用微軟的ADO技術(shù),討論了如何把OLE字段加密存儲(chǔ)到ACCESS數(shù)據(jù)庫中,以及如何從ACCESS中獲取OLE字段并解密的實(shí)現(xiàn)方法。

      關(guān)鍵詞:ADO;OLE字段;數(shù)據(jù)加密;VisubalBasic

      0前言

      在開發(fā)MIS或OA類的軟件時(shí),經(jīng)常需要將外部圖片或各類文件保存在數(shù)據(jù)庫中,目前的關(guān)系數(shù)據(jù)庫大都有一個(gè)大二進(jìn)制字段,可以保存該類數(shù)據(jù)。將圖片及文件以二進(jìn)制方式存儲(chǔ)在數(shù)據(jù)庫中,可以考慮以下兩種方法:一是使用ADO的Stream對(duì)象的LoadFromFile方法以及SaveToFile方法實(shí)現(xiàn);二是使用ADO的Recordset.Field對(duì)象的GetChunk以及AppendChunk方法實(shí)現(xiàn)。鑒于數(shù)據(jù)的安全性,需要將保存在OLE字段的數(shù)據(jù)加密。

      1實(shí)現(xiàn)步驟

      一個(gè)通用的方法是可以先將外部文件或圖片加密,然后再保存到OLE字段中,解密時(shí)反向操作即可,缺點(diǎn)是效率不高。對(duì)于使用ADO的Stream對(duì)象或ADO的Recordset.Field對(duì)象的GetChunk、AppendChunk保存數(shù)據(jù)的方法,由于在操作中使用了數(shù)組,可以直接將加密、解密算法在內(nèi)存中直接操作,所以在效率及安全方面都比前者的方法要好。

      2AppendChunk及Getchunk方法簡介

      2.1AppendChunk方法

      語法:Object.AppendChunkData;對(duì)象Data是變體型,包含追加到對(duì)象中的數(shù)據(jù)。使用Field或Parameter對(duì)象的AppendChunk方法可將長二進(jìn)制或字符數(shù)據(jù)填寫到對(duì)象中。在系統(tǒng)內(nèi)存有限的情況下,可以使用AppendChunk方法對(duì)長整型值進(jìn)行部分而非全部的操作。

      在Field對(duì)象上的第一個(gè)AppendChunk調(diào)用將數(shù)據(jù)寫入字段,覆蓋任何現(xiàn)有的數(shù)據(jù),隨后的AppendChunk調(diào)用則添加到現(xiàn)有數(shù)據(jù)。如果將數(shù)據(jù)追加到一個(gè)字段,然后設(shè)置或讀取當(dāng)前記錄中另一個(gè)字段的值,ADO則認(rèn)為已將數(shù)據(jù)追加到第一個(gè)字段。如果在第一個(gè)字段上再次調(diào)用AppendChunk方法,那么ADO將調(diào)用解釋為新的AppendChunk操作并覆蓋現(xiàn)有數(shù)據(jù)。訪問其他Recordset對(duì)象(并非第一個(gè)Recordset對(duì)象的復(fù)制品)中的字段將不會(huì)破壞AppendChunk操作。

      2.2Getchunk方法

      語法:variable=field.GetChunk(Size);使用Field對(duì)象的GetChunk方法來檢索其中的部分或全部長二進(jìn)制或字符數(shù)據(jù)。在系統(tǒng)內(nèi)存有限的情況下,可使用GetChunk方法操作部分而非全部Long值。

      GetChunk調(diào)用返回的數(shù)據(jù)將被分配給Variable。如果Size大于剩余的數(shù)據(jù),GetChunk方法僅返回剩余的數(shù)據(jù)而不用空格填充Variable。如果該字段為空,GetChunk方法將返回Null值。每個(gè)后續(xù)的GetChunk調(diào)用將從上一次GetChunk調(diào)用停止處開始檢索數(shù)據(jù)。

      3ADOStream簡介

      顧名思義,ADOStream以流的方式來操作文件或記錄。通過Open方法來打開Stream對(duì)象來操作二進(jìn)制或文本數(shù)據(jù)的流,通過Read或Write來讀寫流。用SaveToFile和LoadFromFile方法保存和恢復(fù)文件中的數(shù)據(jù)。

      4關(guān)鍵代碼分析

      4.1使用AppendChunk將文件保存到OLE字段:

      PublicSubCopyFiletoField(fldAsADODB.Field,sfName)

      DimioSizeAsLong

      DimiAsLong,ifSizeAsLong,iKeyasByte

      iKey=2''''密鑰

      DimA1()AsByte,A2()AsByte,A3()AsByte''''定義字節(jié)數(shù)組存放文件內(nèi)容

      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''''再次異或計(jì)算就還原為原來的文件了

      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''''二進(jìn)制模式

      .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

      ''''完成后關(guān)閉對(duì)象

      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結(jié)束語

      ADO的Stream對(duì)象和Recordset.Field對(duì)象的GetChunk、AppendChunk方法是操作數(shù)據(jù)庫OLE字段常用的兩種方法。GetChunk、AppendChunk方法相對(duì)來說要通用一些,在一些低版本的ADO中,Stream可能得不到很好的支持。限于篇幅,文中的代碼略有刪減。

      參考文獻(xiàn)

      [1]魏新俊,郭力平,MicrosoftAccess2.0/7.0[M].北京:清華大學(xué)出版社,1997.

      [2]陳虹頤,何春.VB6.0中利用ADO對(duì)象實(shí)現(xiàn)數(shù)據(jù)庫編程[J].甘肅科技,2007,23(4).

      文檔上傳者
      亚洲国产精品久久久久网站| 亚洲伊人久久综合影院| 久久久久亚洲AV成人网人人网站 | 亚洲精品国产成人| 亚洲精品成人av在线| 亚洲日韩精品无码专区网址| 三上悠亚亚洲一区高清| 国产精品亚洲va在线观看| 亚洲GV天堂无码男同在线观看| 在线aⅴ亚洲中文字幕| 亚洲最大的黄色网| 亚洲一区二区三区在线| 亚洲国产激情在线一区| 欧洲 亚洲 国产图片综合| 亚洲一区二区三区高清在线观看 | 国产亚洲精品AA片在线观看不加载 | 久久亚洲中文字幕精品一区四| 一本色道久久综合亚洲精品高清| 成人亚洲性情网站WWW在线观看| 亚洲一级特黄无码片| 亚洲中文字幕第一页在线| 亚洲精品乱码久久久久久自慰 | 亚洲无码一区二区三区| 亚洲精品无码av中文字幕| 亚洲AV成人精品一区二区三区| 国产精品亚洲专区在线播放| 亚洲第一页综合图片自拍| 亚洲成年人啊啊aa在线观看| 亚洲中文字幕无码爆乳av中文 | 中文字幕无码精品亚洲资源网| 亚洲一区二区三区自拍公司| 亚洲精品无码永久在线观看你懂的| 亚洲国产精品久久久天堂| 蜜芽亚洲av无码精品色午夜| 91亚洲自偷在线观看国产馆| 国产亚洲精品VA片在线播放| 最新亚洲人成无码网www电影| 亚洲男人的天堂在线va拉文| 亚洲精品美女久久久久99| 亚洲色偷偷av男人的天堂| 色天使亚洲综合在线观看|