• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
                     北京航空航天大學(xué)計算機科學(xué)與工程系   黎杰   麥中凡

              ORACLE 公司自1979 年推出基于SQL 標(biāo)準(zhǔn)的關(guān)系數(shù)據(jù)庫產(chǎn)品到1997 年版本8 的推出,
            ORACLE 數(shù)據(jù)庫以其支持大數(shù)據(jù)庫、多用戶的高性能事務(wù)處理,對業(yè)界各項工業(yè)標(biāo)準(zhǔn)的支持,
            完整的安全和完整性控制,支持分布式數(shù)據(jù)庫和分布處理,具有可移植性、可兼容性和可連接
            性等突出優(yōu)點倍受用戶喜愛,根據(jù)IDG1992 年全球UNIX 數(shù)據(jù)庫的市場報告,ORACLE 占市場
            銷售量的50%。而在客戶端的開發(fā)工具方面,Visual C++ 也因其強大的功能和高度的靈活性
            等特點深受廣大程序員的喜愛,因此本文旨在介紹使用Visual C++ 開發(fā)基于ORACLE 數(shù)據(jù)庫應(yīng)
            用程序的兩種方法.
              
              2. 使用PRO*C 開發(fā)數(shù)據(jù)庫應(yīng)用
              
              2.1 PRO*C 工作原理
              
              PRO 系列是ORACLE 公司提供的在第三代高級程序設(shè)計語言中嵌入SQL 語句來訪問數(shù)據(jù)庫
            的一套預(yù)編譯程序,包括PRO*Ada、PRO*C、PRO*COBOL、PRO*Fortran、PRO*Pascal 和
            PRO*PL/I 六種。程序員用相應(yīng)的高級語言編寫嵌入SQL 語句的PRO 源程序(若用C 語言則稱
            為PRO*C 源程序)后運行相應(yīng)的預(yù)編譯程序,把嵌入的SQL 語句轉(zhuǎn)換為標(biāo)準(zhǔn)的ORACLE 調(diào)用并
            生成目標(biāo)源程序,即純高級語言格式的源程序,然后就可以將這些源程序加入用戶的程序中調(diào)用.

              
              ORACLE 預(yù)編譯程序提供如下功能:
              
              ⑴能用六種通用的高級程序設(shè)計語言中的任何一種編寫應(yīng)用程序。
              
              ⑵遵循ANSI 標(biāo)準(zhǔn),在高級語言中嵌入SQL 語句。
              
              ⑶可采用動態(tài)SQL 方法,讓程序在運行時接受或構(gòu)造一個有效的SQL 語句。
              
              ⑷實現(xiàn)ORACLE 內(nèi)部數(shù)據(jù)類型和高級語言數(shù)據(jù)類型之間的自動轉(zhuǎn)換。
              
              ⑸可通過在應(yīng)用程序中嵌入PL/SQL 事物處理塊來改進(jìn)性能。
              
              ⑹能在程序行和命令行上指定所需要的預(yù)編譯可選項,并可在預(yù)編譯的過程中改變它們的
              
              ⑺能全面檢查嵌入的SQL 數(shù)據(jù)操縱語句和PL/SQL 塊的文法和語義。
              
              ⑻可用SQL*Net 并行存取多個地點的ORACLE 數(shù)據(jù)庫。
              
              ⑼可把數(shù)組作為輸入和輸出程序變量使用。
              
              ⑽能對應(yīng)用程序中的代碼段進(jìn)行條件預(yù)編譯。
              
              ⑾提供了較強的異常處理功能。
              
              由此可見,通過預(yù)編譯程序與其它高級語言的結(jié)合,既可以利用SQL 強有力的功能和靈活
            性為數(shù)據(jù)庫應(yīng)用系統(tǒng)的開發(fā)提供強有力的手段,又可以充分利用高級語言自身在系統(tǒng)開發(fā)方面
            的優(yōu)勢,從而提供一個完備的基于ORACLE 數(shù)據(jù)庫應(yīng)用程序的開發(fā)解決方案。
              
              2.2 在VC 中使用PRO*C
              
              每個PRO*C 源文件一般由程序頭和程序體兩部分組成。程序頭包含宿主變量(SQL 語句中
            所包含的變量)說明、通訊區(qū)定義和C 外部表示符的說明等。程序體一般是由若干函數(shù)組成,
            這些函數(shù)內(nèi)含有SQL 語句(以EXEC SQL 起頭的語句)。
              
              PRO*C 支持的數(shù)據(jù)類型包括VARCHAR2( 變長字符串)、NUMBER( 二進(jìn)制數(shù))、INTGER( 有
            符號整數(shù))、FLOAT( 浮點數(shù))、STRING( 以NULL 結(jié)尾的字符串)、VARNUM( 變長二進(jìn)制數(shù))、
            LONG( 變長字符串)、VARCHAR( 變長字符串)、ROWID( 二進(jìn)制值)、DATE( 定長日期/ 時間值)
            、VARRAW( 變長二進(jìn)制數(shù)據(jù))、RAW( 定長二進(jìn)制數(shù)據(jù)) 、LONGRAW( 變長二進(jìn)制數(shù)據(jù))、
            UNSIGNED( 無符號整數(shù))、LONGVARCHAR( 變長字符串)、LONGVARRAW( 變長二進(jìn)制數(shù)據(jù))、
            CHAR( 定長字符串)、CHARZ(C 中定長以NULL 結(jié)尾的字符串)、MLSLABEL( 變長二進(jìn)制數(shù)據(jù))。
                 在PRO*C 中不能使用'l' 或'u' 作詞尾或?x' 作詞頭修飾常量;在SQL 語句中使用單引號來定義字符串,用雙引號來定義特殊的或小寫字符的標(biāo)識符( 如表名等);SQL 語句中不允許使用C 中的尋址、間接、位邏輯、復(fù)合賦值、=、-、++、%、<<、>> 操作符并且用NOT、AND、OR、= 代替!、&&、||、==。
              
              下面的程序是一個聯(lián)結(jié)數(shù)據(jù)庫的PRO*C 源程序例子。
                 #include  < sqlca.h > //聲明SQL通訊區(qū)
                 #include  < string.h >
                 #include  < afxwin.h >
              
              EXEC SQL BEGIN DECLARE SECTION;
              
              VARCHAR username[20]; //聲明宿主變量
              
              VARCHAR password[20];
              
              VARCHAR dbname[20];
              
              EXEC SQL END DECLARE SECTION;
              
              void db_connect()
              
              {
              
              strcpy((char *)username.arr,"SCOTT");
              
              username.len = strlen((char *)username.arr);
              
              strcpy((char *)password.arr,"TIGER");
              
              password.len = strlen((char *)password.arr);

              
              strcpy((char *)dbname.arr,"SUNDB");
              
              dbname.len = strlen((char *)dbname.arr);

              
              EXEC SQL WHENEVER SQLERROR STOP; //隱式異常處理
              
              EXEC SQL CONNECT :username
              
              IDENTIFIED BY :password USING :dbname;
              
              /*if (sqlca.sqlcode != 0) //顯式異常處理
              
              {
              
              AfxMessageBox(" 與Oracle數(shù)據(jù)庫連接失敗!");
              
              return;
              
              }*/
              
              }
              
              在VC 中使用PRO*C 時,先用PRO*C 編寫所需的操作數(shù)據(jù)庫的子程序,再運行PRO*C 預(yù)編
            譯程序把PRO*C 源程序轉(zhuǎn)成相應(yīng)的CPP 源程序
            ,將該程序插入到用戶工程文件中并在需要對插
            入函數(shù)進(jìn)行調(diào)用的模塊中說明函數(shù),然后就可以在此模塊中調(diào)用所需的函數(shù)。
              
              3. 使用ODBC 中間件訪問數(shù)據(jù)庫
              
              3.1 ODBC 工作原理
              
              ODBC 是Open Database Connect 即開放數(shù)據(jù)庫互連的簡稱,它是由Microsoft 公司于
            1991 年提出的一個用于訪問數(shù)據(jù)庫的統(tǒng)一界面標(biāo)準(zhǔn),是應(yīng)用程序和數(shù)據(jù)庫系統(tǒng)之間的中間件
            。它通過使用相應(yīng)應(yīng)用平臺上和所需數(shù)據(jù)庫對應(yīng)的驅(qū)動程序與應(yīng)用程序的交互來實現(xiàn)對數(shù)據(jù)庫
            的操作,避免了在應(yīng)用程序中直接調(diào)用與數(shù)據(jù)庫相關(guān)的操作,從而提供了數(shù)據(jù)庫的獨立性。
              
              ODBC 主要由驅(qū)動程序和驅(qū)動程序管理器組成。驅(qū)動程序是一個用以支持ODBC 函數(shù)調(diào)用
            的模塊(在WIN95 下通常是一個DLL),每個驅(qū)動程序?qū)?yīng)于相應(yīng)的數(shù)據(jù)庫,當(dāng)應(yīng)用程序從基
            于一個數(shù)據(jù)庫系統(tǒng)移植到另一個時,只需更改應(yīng)用程序中由ODBC 管理程序設(shè)定的與相應(yīng)數(shù)據(jù)
            庫系統(tǒng)對應(yīng)的別名即可。驅(qū)動程序管理器(包含在ODBC32.DLL 中)可鏈接到所有ODBC 應(yīng)用程
            序中,它負(fù)責(zé)管理應(yīng)用程序中ODBC 函數(shù)與DLL 中函數(shù)的綁定。
              
              ODBC 使用層次的方法來管理數(shù)據(jù)庫,在數(shù)據(jù)庫通信結(jié)構(gòu)的每一層,對可能出現(xiàn)依賴數(shù)據(jù)
            庫產(chǎn)品自身特性的地方,ODBC 都引入一個公共接口以解決潛在的不一致性,從而很好地解決
            了基于數(shù)據(jù)庫系統(tǒng)應(yīng)用程序的相對獨立性,這也是ODBC 一經(jīng)推出就獲得巨大成功的重要原因
              
              從結(jié)構(gòu)上分,ODBC 分為單束式和多束式兩類。
              
              ⑴單束式驅(qū)動程序
              
              單束式驅(qū)動程序介于應(yīng)用程序和數(shù)據(jù)庫之間,像中介驅(qū)動程序一樣數(shù)據(jù)提供一個統(tǒng)一的數(shù)
              
              當(dāng)用戶進(jìn)行數(shù)據(jù)庫操作時,應(yīng)用程序傳遞一個ODBC 函數(shù)調(diào)用給ODBC 驅(qū)動程序管理器,
            由ODBC API 判斷該調(diào)用是由它直接處理并將結(jié)果返回還是送交驅(qū)動程序執(zhí)行并將結(jié)果返回。
              
              由上可見,單束式驅(qū)動程序本身是一個數(shù)據(jù)庫引擎,由它直接可完成對數(shù)據(jù)庫的操作,盡
              
              ⑵多束式驅(qū)動程序
              
              多束式驅(qū)動程序負(fù)責(zé)在數(shù)據(jù)庫引擎和客戶應(yīng)用程序之間傳送命令和數(shù)據(jù),它本身并不執(zhí)行
            數(shù)據(jù)處理操作而用于遠(yuǎn)程操作的網(wǎng)絡(luò)通信協(xié)議的一個界面。
              
              前端應(yīng)用程序提出對數(shù)據(jù)庫處理的請求,該請求轉(zhuǎn)給ODBC 驅(qū)動程序管理器,驅(qū)動程序管
            理器依據(jù)請求的情況,就地完成或傳給多束驅(qū)動程序,多束式驅(qū)動程序?qū)⒄埱蠓g為特定廠家
            的數(shù)據(jù)庫通信接口(如Oracle 的SQLNet)所能理解的形式并交于接口去處理,接口把請求經(jīng)
            網(wǎng)絡(luò)傳送給服務(wù)器上的數(shù)據(jù)引擎,服務(wù)器處理完后把結(jié)果發(fā)回給數(shù)據(jù)庫通信接口,數(shù)據(jù)庫接口
            將結(jié)果傳給多束式ODBC 驅(qū)動程序,再由驅(qū)動程序?qū)⒔Y(jié)果傳給應(yīng)用程序。
              
              3.2 在VC 中使用ODBC
              
              Visual C++ 中提供了CDatabase、CRecordset、CRecordView、CDBException 和
            CFieldExchange 五個類,這些類封裝了ODBC SDK 函數(shù)
            ,從而使用戶可以無需了解SDK 函數(shù)
              
              CDatabase 類:封裝了與數(shù)據(jù)庫建立連接,控制事務(wù)的提交和回滾及執(zhí)行SQL 語句的方法
              
              CRecordset 類:封裝了大部分操縱數(shù)據(jù)庫的方法,包括瀏覽、修改記錄,控制游標(biāo)移動
              
              CRecordView 類:提供了與recordset 對象相連接的視,可以建立視中的控件與數(shù)據(jù)庫數(shù)
              
              CDBException 類:提供了對數(shù)據(jù)庫操作的異常處理,可以獲得操作異常的相關(guān)返回代碼
              
              CFieldExchange 類:提供了用戶變量與數(shù)據(jù)庫字段之間的數(shù)據(jù)交換,如果不需要使用自
            定義類型,你將不用直接調(diào)用該類的函數(shù),MFC Wizard 將自動為程序員建立連接。
              
              4. 兩種方法的比較
              
              綜上所述,使用這兩種方法在Visual C++ 中都可以很方便地開發(fā)出基于ORACLE 數(shù)據(jù)庫
            的應(yīng)用程序,同時,這兩種方法又各有其優(yōu)缺點。ODBC 由于有MFC 強大的類庫支持而使得編
            程實現(xiàn)非常方便,同時可移植性也很強,在異構(gòu)的數(shù)據(jù)庫之間移植也只需更改很少的一部分程
            序,但是,由ODBC 的實現(xiàn)機制我們可以看到,與PRO*C 相比,應(yīng)用程序需要經(jīng)過ODBC 驅(qū)動
            程序管理器和ODBC 驅(qū)動程序兩層才能和數(shù)據(jù)庫通信接口建立聯(lián)系,而PRO*C 是直接與通信接
            口聯(lián)系,因此建立在ODBC 上應(yīng)用程序的執(zhí)行效率會相對低一些。PRO*C 具有執(zhí)行效率高,支
            持嵌入式PL/SQL 塊等ORACLE 自身特有的優(yōu)點,但正因為有了這些優(yōu)點,使得用PRO*C 開發(fā)出
            的應(yīng)用程序無法向異構(gòu)數(shù)據(jù)庫平臺移植。
            posted on 2007-04-24 22:29 哈哈 閱讀(1706) 評論(1)  編輯 收藏 引用

            評論:
            # re: 用VC 開發(fā)基于ORACLE數(shù)據(jù)庫應(yīng)用程序的兩種方法 2007-07-22 16:22 | oa
            能否給出使用ODBC 中間件訪問數(shù)據(jù)庫更詳細(xì)的介紹呢?比如連接和操作數(shù)據(jù)庫的具體代碼。謝謝  回復(fù)  更多評論
              

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            色欲av伊人久久大香线蕉影院 | 久久久久女人精品毛片| 久久只有这里有精品4| 日本欧美久久久久免费播放网| 国内精品久久久久影院一蜜桃| 亚洲国产精品久久久久婷婷老年| 久久91这里精品国产2020| 亚洲人成无码网站久久99热国产| 久久久精品国产免大香伊| 亚洲AV乱码久久精品蜜桃| 99久久99久久精品国产| 久久成人小视频| 久久久国产精品网站| 久久人妻AV中文字幕| 91精品国产综合久久四虎久久无码一级 | 婷婷久久香蕉五月综合加勒比| 一级做a爰片久久毛片人呢| 久久亚洲中文字幕精品一区| 91久久九九无码成人网站| 亚洲日本va午夜中文字幕久久| 久久久国产精品网站| 久久精品人人做人人爽电影| 国产成人精品综合久久久| 久久精品中文无码资源站| 伊人久久大香线蕉AV一区二区| 91秦先生久久久久久久| 成人国内精品久久久久一区| 国产精品久久久久久久人人看| 久久精品二区| 老司机国内精品久久久久| 欧洲成人午夜精品无码区久久| 久久综合久久综合亚洲| 久久99精品国产麻豆不卡| 亚洲一区中文字幕久久| 97视频久久久| 狠狠色婷婷久久综合频道日韩 | 久久人人爽人人澡人人高潮AV | 伊人久久国产免费观看视频 | 久久精品人人做人人妻人人玩| 久久久久久久女国产乱让韩| 伊人伊成久久人综合网777|