• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      利用oracle數(shù)據(jù)庫(kù)的blob字段保存各種文件的方法

      2012-04-29 00:44:03盧小麗
      電腦知識(shí)與技術(shù) 2012年22期
      關(guān)鍵詞:二進(jìn)制字段語(yǔ)句

      盧小麗

      摘要:在日常工作中,許多單位或企業(yè)都累積了大量的文件。如何保存和組織這些文件,如何高效地查閱和使用它們,則成了一個(gè)普遍存在的問(wèn)題。為解決這一問(wèn)題,用powerbuilder作為開發(fā)工具編寫了一個(gè)小軟件,通過(guò)運(yùn)行特殊的SQL語(yǔ)句,將各種文件保存于oracle的二進(jìn)制大字段中,并可以隨時(shí)查看和下載文件。

      關(guān)鍵詞:文件;二進(jìn)制大字段;SQL語(yǔ)句;powerbuilder

      中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)22-5271-04

      Using Binary Large Field to Save all Documents Method

      LU Xiao-li

      (Guangxi Nanning City State Taxation Bureau , Nanning 530022, China)

      Abstract: In their daily work, many units or enterprises have accumulated a lot of documents.How to store and organize these documents, how to effectively access and use them, then became a widespread problem.In order to solve this problem, using PowerBuilder as a designer tool to write a small software, by running a special SQL statements, the files are stored in the Oracle binary large field, and can be readily viewed and downloaded .

      Key words: documents; binary large field; SQL statement; powerbuilder

      在日常工作中,各單位或企業(yè)都累積了大量的文件,如WORD文檔,EXCEL文檔、多媒體文檔、圖片等。如何保存和組織這些文件,如何高效地查閱和使用它們,則成了一個(gè)普遍存在的問(wèn)題。

      例如:該如何分門別類地保存和組織大量文件?該如何保證每臺(tái)客戶端中看到的都是最新修改過(guò)的文件?

      筆者在本單位的軟件開發(fā)中就遇到類似問(wèn)題。作者所要求開發(fā)的一個(gè)軟件,要求每臺(tái)客戶端都能通過(guò)該軟件,及時(shí)上傳和瀏覽打印各種最新的文檔。

      為解決這個(gè)問(wèn)題,通過(guò)查閱大量資料后,筆者決定用oracle數(shù)據(jù)庫(kù)的blog字段,來(lái)解決文件的保存和查詢問(wèn)題。并且用power builder作為程序開發(fā)工具,開發(fā)出一個(gè)小軟件。該軟件可以上傳各種文檔、圖像、二進(jìn)制文件、多媒體文件等到oracle數(shù)據(jù)庫(kù)中,并可以隨時(shí)查看和下載。

      1原理及技巧

      隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展和普及,數(shù)據(jù)庫(kù),尤其是關(guān)系型數(shù)據(jù)庫(kù),在日常工作和生活中也得到了普遍應(yīng)用。

      關(guān)系型數(shù)據(jù)庫(kù)中,一般常用的字段有字符型、數(shù)值型、日期型、邏輯型等類型。但還有一種特殊的字段,是以二進(jìn)制形式存放數(shù)據(jù)的,長(zhǎng)度是0~2GB字節(jié),這就是二進(jìn)制大字段。如oralce、mysql、access中的blog字段。由于數(shù)據(jù)是以最基本的二進(jìn)制保存,不論其原來(lái)的數(shù)據(jù)是簡(jiǎn)單的類型還是復(fù)雜的類型,數(shù)據(jù)庫(kù)都只當(dāng)其是一連串的二進(jìn)制數(shù)據(jù),因此,就解決了各種文檔、圖像、多媒體等各種文件的存儲(chǔ)問(wèn)題。

      在powerbuilder中,主要是利用blog變量和fileread語(yǔ)句或filewrited語(yǔ)句來(lái)從文件中讀取數(shù)據(jù)或?qū)憯?shù)據(jù),再用到兩條特殊的SQL命令——UPDATEBLOB和SELECTBLOB,來(lái)跟數(shù)據(jù)庫(kù)進(jìn)行交互。具體見圖1。

      圖1過(guò)程圖

      一個(gè)table中,blog字段不能單獨(dú)存在,至少要有一個(gè)常規(guī)字段,用來(lái)標(biāo)識(shí)一條記錄。

      由于blog字段比較特殊,對(duì)其進(jìn)行操作的sql語(yǔ)句也比較特別。

      添加數(shù)據(jù)時(shí),要先insert一個(gè)空的blog字段,再用updateblob語(yǔ)句將二進(jìn)制數(shù)據(jù)添加進(jìn)去。

      導(dǎo)出數(shù)據(jù)時(shí),用selectblob語(yǔ)句查詢導(dǎo)出。

      例如:

      insert into test_photo (id,photo) values(‘01,empty_blob())

      updateblob test_photo set photo=:b1 where id=01( b1是pb中blog類型的變量)

      selectblob photo into :b1 from test_photo where id=01( b1是pb中blog類型的變量)用其他的軟件開發(fā)工具也是類似。

      2程序結(jié)果

      該小程序運(yùn)行后出現(xiàn)如圖2的界面,程序的代碼附在文后。

      圖2運(yùn)行結(jié)果圖

      窗口的左半部是pb的ole控件,點(diǎn)擊后可以直接打開word文檔或excel文檔。對(duì)于其他類型的文件,還不支持直接打開,可下載后在操作系統(tǒng)中打開或運(yùn)行。

      主要程序代碼:(代碼都已測(cè)試通過(guò))

      上傳按扭的代碼

      blob m_b1 ,m_b2

      blob tot_b

      string s1 ,s2,s3,file1, m_filename , m_hz

      long n1,jj ,li_fnum ,li_bytes , ii,ll,loops ,nbr,m_count

      ll=getfileopenname(選擇文件,path1,file1,,file(*.*),*.*,c: )

      if ll<>1 then

      messagebox(,沒(méi)選中文件)

      return

      end if

      st_1.text=file1

      m_filename=st_1.text

      m_hz=right(file1,3)

      setnull(tot_b)

      setnull(m_b1)

      m_count=0

      select count(*) into :m_count from test_photo where id=:file1 ; //查看數(shù)據(jù)庫(kù)中是否有同名文件

      if m_count>1 then

      messagebox(,已有同名文件!)

      return

      end if

      li_bytes=filelength(path1)

      li_fnum = fileopen(path1, streammode!)

      if li_fnum>0 then

      if li_bytes > 32765 then//一次只能讀32765字節(jié),要先判斷讀幾次

      if mod(li_bytes, 32765) = 0 then

      loops = li_bytes/32765

      else

      loops = (li_bytes/32765) + 1

      end if

      else

      loops = 1

      end if

      for ii = 1 to loops

      jj = fileread(li_fnum, m_b1) //將文件分次讀入bolb變量

      tot_b=tot_b + m_b1//若大于32765字節(jié),將bolb變量?jī)?nèi)容加起來(lái)

      next

      m_b2=blobmid(tot_b,1,li_bytes)

      insert into test_photo (id,photo,hz) values(:m_filename,empty_blob(),:m_hz) ;//增加記錄

      updateblob test_photo set photo=:tot_b where id=:m_filename ; //上傳bolb變量的內(nèi)容

      if sqlca.sqldbcode = 0 then

      commit ;

      messagebox("","保存成功!")

      else

      messagebox("sql error", sqlca.sqlerrtext)

      end if

      else

      messagebox(,無(wú)法打開文件!)

      end if

      fileclose(li_fnum)

      dw_1.retrieve()

      下載按扭的代碼

      long ii,jj ,li_FileNum ,li_bytes ,loops,m_row

      integer rtn

      string m_id,m_hz,m_ml,s2,m_file

      blob b1 ,tob_b

      setnull(b1)

      m_row=dw_1.getrow()

      if m_row>0 then

      st_1.text=dw_1.object.id[m_row]

      m_ml=trim(sle_1.text)

      m_id=trim(st_1.text)

      m_hz=right(m_id,3)

      m_file=m_ml+"/"+m_id

      if DirectoryExists(m_ml)=false then

      messagebox(,指定下載目錄不存在!)

      return

      end if

      messagebox(,開始下載!)

      selectblob photo into :b1 from test_photo where id=:m_id;

      //messagebox(sqlca.SQLCode,sqlca.SQLCode )

      if not isnull(b1) then

      li_FileNum = FileOpen(m_file , StreamMode!, Write!, Shared!, replace!)

      li_bytes=len(b1)

      //messagebox(,string(li_bytes))

      jj= FileWriteex(li_FileNum, b1)

      fileclose(li_FileNum)

      messagebox(,文件+m_file+下載完畢!)

      else

      messagebox(,無(wú)文件內(nèi)容!)

      end if

      end if

      打開按扭的代碼(先下載,再打開)

      long ii,jj ,li_filenum ,li_bytes ,loops,m_row

      integer rtn

      string m_id,m_hz,m_ml,s2,m_file

      blob b1 ,tob_b

      setnull(b1)

      m_row=dw_1.getrow()

      if m_row>0 then

      st_1.text=dw_1.object.id[m_row]

      m_ml=trim(sle_1.text) //取出默認(rèn)下載路徑

      m_id=trim(st_1.text)

      m_hz=right(m_id,3)

      m_file=m_ml+"/aaaa."+m_hz

      choose case upper(m_hz) //根據(jù)不同類型使用不同語(yǔ)句打開

      case doc

      ole_1.insertclass(word.document)

      case xls

      ole_1.insertclass(excel.sheet)

      case else

      messagebox(抱歉,本程序只能自動(dòng)打開doc文件或xls文件,其他類型文件請(qǐng)下載后再在程序外打開。)

      return

      end choose

      selectblob photo into :b1 from test_photo where id=:m_id; //導(dǎo)出bolb字段內(nèi)容

      if not isnull(b1) then

      li_filenum = fileopen(m_file , streammode!, write!, shared!, replace!)

      li_bytes=len(b1)

      jj= filewriteex(li_filenum, b1) //將bolb變量?jī)?nèi)容寫成文件

      // filewriteex命令可以寫入大于32765字節(jié)的文件

      fileclose(li_filenum)

      ole_1.insertfile(m_ml + m_id) //利用ole打開文檔

      ole_1.doverb(7)

      filedelete(m_file)

      else

      messagebox(,無(wú)文件內(nèi)容!)

      end if

      end if

      3結(jié)束語(yǔ)

      該方法有四大優(yōu)點(diǎn):

      1)更新及時(shí)。若采取文件拷貝的方式,則不一定保證自己手上的文檔內(nèi)容是最新的版本。而采用在程序中下載或打開的方法,則可以保證看到的是最新更新的文件;

      2)保密性強(qiáng)。在服務(wù)器端,文件是以二進(jìn)制的形式存儲(chǔ)在數(shù)據(jù)庫(kù)里,比起用文件形式的存放,保密性當(dāng)然提高了很多;在客戶端,則可以在程序中設(shè)置權(quán)限,決定哪些文件給哪些人看,保密性也同樣增強(qiáng)了;

      3)易分類保存和查詢??梢栽O(shè)置一些輔助字段,如文件類型、文件名、上傳人、上傳時(shí)間、說(shuō)明及備注等,便于查詢和分類統(tǒng)計(jì);

      4)易于備份。Blog字段可以跟oracle普通的字段一起,通過(guò)exp命令導(dǎo)出,形成dmp文件進(jìn)行備份;

      該軟件的不足之處是Client/Server類型的程序,每臺(tái)客戶端都要安裝軟件。

      參考文獻(xiàn):

      [1]丁鉞,廖小平.powerbuilder7.0,高級(jí)開發(fā)指南[M].北京:人民郵電出版社,2000.

      [2]互聯(lián)網(wǎng)在PowerBuilder中操作BLOB數(shù)據(jù)的技巧-PB編程技巧-華軟源碼[EB/OL]. http://www.hur.cn/Article/2002/3121.html.

      猜你喜歡
      二進(jìn)制字段語(yǔ)句
      圖書館中文圖書編目外包數(shù)據(jù)質(zhì)量控制分析
      用二進(jìn)制解一道高中數(shù)學(xué)聯(lián)賽數(shù)論題
      重點(diǎn):語(yǔ)句銜接
      有趣的進(jìn)度
      二進(jìn)制在競(jìng)賽題中的應(yīng)用
      精彩語(yǔ)句
      CNMARC304字段和314字段責(zé)任附注方式解析
      無(wú)正題名文獻(xiàn)著錄方法評(píng)述
      如何搞定語(yǔ)句銜接題
      關(guān)于CNMARC的3--字段改革的必要性與可行性研究
      庆阳市| 芷江| 临湘市| 吴旗县| 沁阳市| 赤城县| 石门县| 通州区| 邓州市| 南投市| 崇信县| 峨眉山市| 瓦房店市| 木兰县| 房山区| 周宁县| 利川市| 长兴县| 华阴市| 新野县| 滁州市| 台中县| 荥阳市| 镇远县| 射洪县| 元氏县| 临朐县| 岳普湖县| 宜章县| 中山市| 平阴县| 繁昌县| 汾阳市| 郧西县| 化隆| 正镶白旗| 大足县| 甘洛县| 定远县| 黄梅县| 明光市|