1 前言
開發高水平的“管理信息系統”,選擇性能優越的數據庫是最重要的一環,我們經過多方面的調研和分析,選擇了ORACLE7數據庫,成功地開發了本系統。實踐證明,本系統設計科學、合理、運行穩定,本文將具體闡述一下系統中應用Oracle7數據庫的方法和技術。
2 系統的開發、運行環境
本系統在CLIENT/SERVER結構上運行,SERVER為CDC4360小型機,和快速FDDI環網相接,內裝有UNIX操作系統和Oracle7數據庫,系統總體網絡協議為TCP/IP。
CLIENT端為486以上微機,16M以上內存,硬盤足夠大,通過HUB、路由器、MODEM和SERVER連接。開發、運行平台是WIN95,安裝了網絡軟件ONNET、OracleCDE產品SQL*NETV2。開發工具是POWERBULDER5.0(以下簡稱PB5)、VB4等。
3 Oracle7在系統中的各種應用
3.1一般性的數據管理
一般性的數據管理用數據窗口管理最方便,可以在數據窗口中進行表的增、刪、改、查詢等操作,下邊是一些具體例子(PB5):
3.1.1連通Oracle庫,並將數據裝入數據窗口:
dw_1.SetTransObject(sqlca) dw_1.RetrIEve()
3.1.2增加一條記錄
dw_1.InsertRow(dw_1.GetRow()+1) 3.1.3刪除一條記錄(當前記錄) dw_1.DeleteRow(0)
3.1.4將數據提交入庫(存盤)
dw_1.Update() commit;
3.1.5打印數據窗口(表)中的數據
dw_1.print()
3.2文字類數據管理
3.2.1文本入庫和查詢
文本入庫和查詢可采用PB5的MLE(多行編輯器)作界面,編輯完成後存入Oracle7的LONG字段中,查詢時從LONG字段中取出,放入MLE中查詢,下邊是一個例子:
//文本的預處理(以去除文本文件中的回車換行符為例說明) //將文件讀入BLOB型變量 text中fn=fileopen(txtname,streammode!) iffn<>-1then fileread(fn,text) fileclose(fn) //並轉換為文本 article=string(text) s=len(article) forv=1tos t=pos(article,char(13)+char(10),v) ift>0then article=replace(article,t,2,"") else endif next mle_1.text=article //將處理後的文件c:\bb.txt存盤, 文件中的回車換行符已全部去掉 text1=blob(article) filname="c:\bb.txt" fn=fileopen(filname,streammode!, write!,lockwrite!,replace!) iffn<>-1then filewrite(fn,text1) fileclose(fn) endif //文本入庫 nr1=blob(mle_1.text) updateblobgljwJSetnr=:nr1wherebh=:pass_parm andzwrq=:fsjandwjbs=:fl5usingsqlca; commit; //放入MLE中查詢 selectblobnrinto:nr1fromgljwjwherebh=:pass_parm andwjbs=:fl5andzwrq=:fsjusingsqlca; mle_1.text=blob(nr1)
3.2.2從庫中重新生成文本文件filename.txt並存盤
selectnrinto:filenfromfwgswherebh=:bh1 andlwrq=:zwrq1usingsqlca; fname="c:\filename.txt" fh=fileopen(fname,streammode!,write!,lockwrite!,replace!) iffh<>-1then filewrite(fh,filen) fileclose(fh) endif
3.3處理圖象文件(大的二進制文件)
圖象文件(一般為BMP位圖文件)是二進制文件,將其以數據流方式存入Oracle7的LONG字段中,查詢時從LONG字段中取出,放入圖象框(如p_1)中查詢,下邊是一個例子:
//將圖象文件讀入BLOB型變量pict中 fn=fileopen(picname,streammode!) iffn<>-1then fileread(fn,pict) fileclose(fn) //將圖象放入圖象框p_1內查看 setpicture(p_1,pict) endif //將圖象存入表pic的LONG字段bmpt中 updateblobpicsetbmpt=:pict; commit;
較大的圖象文件一次不能入庫,可采取分割圖形的方式,分塊存入,因為LONG字段所存放的數據大小一般是沒限制的(可存放2G的內容)。
4開發應用經驗
4.1建議CLIENT端通過SQL*NETV2進行Oracle數據通信(不用SQL*NETTCPV1產品)
因為在ORACLE7推出以後,SQL*NETV1就沒有做一些改進工作,繼續支持到ORACLE7.2,ORACLE7.3以後的產品將不支持SQL*NETTCPV1,所以,Oracle7用戶應立即改用SQL*NETV2,不然會影響到庫的運行穩定性。
ORACLECDE2和Developer2000提供了CLIENT端Oracle產品的安裝程序ORAINST.EXE,運行該文件來安裝SQL*NETV2,選擇的產品有:
aOracleTCP/IPADPTER2.1.4.1.3 bsql*net2.1.4.1.4
在WIN95下,網絡軟件產品(Tcp/IPVendor)選擇MicrosoftWindowsNTTcp/IP3.1,按提示說明裝入就可以了,另外還要做以下工作:
將SERVER上的tnsnames.ora文件復制到CLIENT端c:\orawin\network\admin目錄下:
ora7=(DESCRIPTION= (ADDRESS= (PROTOCOL=TCP) (HOST=111.1.1.1) (PORT=1521) ) (CONNECT_DATA=(SID=ora7)) )
可在SQLPLUS下鍵入連接命令scott/tiger@ora7測試連接情況。
首先要作好這三件工作:
4.2采取數據加密技術
對用戶來說,查詢信息是有權限的,若想查詢某項保密數據,需正確地鍵入密碼,才能查到。面對同一台微機,誰能正確地鍵入密碼,誰就能做查詢,該系統通過自定義一些復雜的函數運算產生密碼,從表(TABLE)中找不到密碼數據,通過這種精密的設計處理,達到了數據保密要求。下邊是密碼修改和識別的一段程序(PB5):
password=sle_1.text a8=pos(sle_1.text,"/") ifa8>=1then password=left(sle_1.text,a8-1) newpassword=mid(sle_1.text,a8+1,len(sle_1.text)-a8) endif selectdwbminto:dmfromdwwheremm=:password; sle_1.text="" ifsqlca.sqlcode<>0then messagebox("警告:","口令錯!") pw=pw+1 ifpw>=3then close(w_bg_main) endif else mm=dm ifa8>=1then a7=messagebox("提示信息","確定要修改口令嗎(y/n)? ",information!,YesNo!,2) ifa7=1then selectdwbminto:a9fromdwwheremm=:newpassword; ifsqlca.sqlcode<>100ornewpassword=""then messagebox("提示信息","新口令錯!") gotoend1 else updatedwsetmm=:newpassword wheremm=:password; messagebox("請記住新口令",string(newpassWord)) commit; endif endif endif
4.3用Excel輸出精美表格
用VC或PB5將Oracle庫中的數據生成文本或EXCEL文件,再通過EXCEL的數據鏈接,將對應數據調入事先定義好的Excel標准輸出表中,按用戶的要求輸出。
PB5生成EXCEL格式文件的SCRIPT語句舉例如下:dw_1.SaveAs("c:\glxx.xls",Excel!,true)
4.4正確使用日期型數據
在庫操作過程中,若日期變量的值定義錯了,將提示SQL語句出錯信息,錯誤現象非常隱蔽,不好察覺,這是編程過程中的常見錯誤,在此特別強調一下。舉一個例子:
若日期數據為常量,要按下列格式賦值(用一update語句說明):
updatetabsetrq='1-Feb-96'; commit;
5結束語
該系統的開發和應用,使我們更加體會到了Oracle數據庫的優越性,本系統的開發成功與此是分不開的,我們將做進一步探索,用先進的開發工具和升級的Oracle8開發面向網絡的和多媒體的“管理信息系統”。