熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

用 VC 開 發 Oracle 數 據 庫 應 用 程 序

2013-11-13 15:48:54  來源: Oracle 

  ____Oracle公司於年推出的Oracle 數據庫以其支持大數據庫多用戶的高性能事務處理支持業界各項工業標准完整的安全和完整性控制支持分布式數據庫和分布處理具有可移植性可兼容性和可連接性等突出優點倍受用戶喜愛而在客戶端的開發工具方面Visual C++也因其強大的功能和高度的靈活性等特點深受廣大程序員的喜愛本文旨在介紹使用Visual C++開發基於Oracle數據庫應用程序的兩種方法
  
  ____使用PRO*C開發數據庫應用
  
  ____PRO*C工作原理
  
  ____PRO系列是Oracle公司提供的在第三代高級程序設計語言中嵌入SQL語句來訪問數據庫的一套預編譯程序包括PRO*AdaPRO*CPRO*COBOLPRO*FortranPRO*Pascal和P RO*PL/I六種程序員用相應的高級語言編寫嵌入SQL語句的PRO源程序(若用C語言則稱為 PRO*C源程序)然後運行相應的預編譯程序把嵌入的SQL語句轉換為標准的Oracle調用並生成目標源程序即純高級語言格式的源程序最後將這些源程序加入用戶的程序中調用 (其處理過程如下圖)
  
  
  
  圖
  
  ____Oracle預編譯程序提供如下功能:
  
  ____能用六種通用的高級程序設計語言中的任何一種編寫應用程序
  
  ____遵循ANSI標准在高級語言中嵌入SQL語句
  
  ____可采用動態SQL方法讓程序在運行時接受或構造一個有效的SQL語句
  
  ____實現Oracle內部數據類型和高級語言數據類型之間的自動轉換
  
  ____可通過在應用程序中嵌入PL/SQL事物處理塊來改進性能
  
  ____能在程序行和命令行上指定所需要的預編譯可選項並可在預編譯的過程中改變它們的值
  
  ____能全面檢查嵌入的SQL數據操縱語句和PL/SQL塊的文法和語義
  
  ____可用SQL*Net並行存取多個地點的Oracle數據庫
  
  ____可把數組作為輸入和輸出程序變量使用
  
  ____能對應用程序中的代碼段進行條件預編譯
  
  ____提供了較強的異常處理功能
  
  ____由此可見通過預編譯程序與其它高級語言的結合既可以利用SQL強有力的功能和靈活性為數據庫應用系統的開發提供強有力的手段又可以充分利用高級語言自身在系統開發方面的優勢從而提供一個完備的基於Oracle數據庫應用程序的開發解決方案
  
  ____在VC中使用PRO*C
  
  ____每個PRO*C源文件一般由程序頭和程序體兩部分組成程序頭包含宿主變量(SQL語句中所包含的變量)說明通訊區定義和C外部表示符的說明等程序體一般是由若干函數組成這些函數內含有SQL語句(以EXEC SQL起頭的語句)
  
  ____PRO*C支持的數據類型包括:VARCHAR(變長字符串)NUMBER(二進制數)INTGER(有符號整數)FLOAT(浮點數)STRING(以NULL結尾的字符串)VARNUM(變長二進制數) LONG(變長字符串)VARCHAR(變長字符串)ROWID(二進制值)DATE(定長日期/時間值 )VARRAW(變長二進制數據)RAW(定長二進制數據) LONGRAW(變長二進制數據)UN SIGNED(無符號整數)LONGVARCHAR(變長字符串)LONGVARRAW(變長二進制數據)CHA R(定長字符串)CHARZ(C中定長以NULL結尾的字符串)MLSLABEL(變長二進制數據)
  
  ____在PRO*C中不能使用lu作詞尾或x作詞頭修飾常量;在SQL語句中使用單引號來定義字符串用雙引號來定義特殊的或小寫字符的標識符(如表名等);SQL語句中不允許使用C中的尋址間接位邏輯復合賦值?=++%<<、>>操作符並且用NOTANDOR=來分別代替!&&||==
  
  ____下面的程序是一個連接數據庫的PRO*C源程序例子
  
  ____#include //聲明SQL通訊區
  
  ____#include
  
  ____#include
  
  ____EXEC SQL BEGIN DECLARE SECTION;
  
  ____VARCHAR username[]; //聲明宿主變量
  
  ____VARCHAR password[];
  
  ____VARCHAR dbname[];
  
  ____EXEC SQL END DECLARE SECTION;
  
  ____void db_connect()
  
  ____{
  
  ____strcpy((char *)usernamearrSCOTT);
  
  ____usernamelen = strlen((char *)usernamearr);
  
  ____strcpy((char *)passwordarrTIGER);
  
  ____passwordlen = strlen((char *)passwordarr);
  
  ____strcpy((char *)dbnamearrSUNDB);
  
  ____dbnamelen = strlen((char *)dbnamearr);
  
  ____EXEC SQL WHENEVER SQLERROR STOP;
  
  ____//隱式異常處理
  
  ____EXEC SQL CONNECT :usernameIDENTIFIED BY :password USING :dbname;
  
  ____/*if (sqlcasqlcode != ) //顯式異常處理
  
  ____{
  
  ____AfxMessageBox(\n與 Oracle 數據庫連接失敗!);
  
  ____return;
  
  ____}*/
  
  ____}
  
  ____在VC中使用PRO*C時先用PRO*C編寫所需的操作數據庫的子程序再運行PRO*C預編譯程序把PRO*C源程序轉成相應的CPP源程序將該程序插入到用戶工程文件中並在需要對插入函數進行調用的模塊中說明函數然後就可以在此模塊中調用所需的函數
  
  ____使用ODBC中間件訪問數據庫
  
  ____ODBC工作原理
  
  ____ODBC是Open Database Connect(開放數據庫互連)的簡稱它是由Microsoft公司於 年提出的一個用於訪問數據庫的統一界面標准是應用程序和數據庫系統之間的中間件它通過使用相應應用平台上和所需數據庫對應的驅動程序與應用程序的交互來實現對數據庫的操作避免了在應用程序中直接調用與數據庫相關的操作從而提供了數據庫的獨立性
  
  ____ODBC主要由驅動程序和驅動程序管理器組成驅動程序是一個用以支持ODBC函數調用的模塊(在WIN下通常是一個DLL)每個驅動程序對應於相應的數據庫當應用程序從基於一個數據庫系統移植到另一個時只需更改應用程序中由ODBC管理程序設定的與相應數據庫系統對應的別名即可驅動程序管理器(包含在ODBCDLL中)可鏈接到所有ODBC 應用程序中它負責管理應用程序中ODBC函數與DLL中函數的綁定
  
  ____ODBC使用層次的方法來管理數據庫在數據庫通信結構的每一層對可能出現依賴數據庫產品自身特性的地方ODBC都引入一個公共接口以解決潛在的不一致性從而很好地解決了基於數據庫系統應用程序的相對獨立性這也是ODBC一經推出就獲得巨大成功的重要原因之一
  
  ____從結構上分ODBC分為單束式和多束式兩類
  
  ____單束式驅動程序
  
  圖
  
  ____單束式驅動程序介於應用程序和數據庫之間像中介驅動程序一樣數據提供一個統一的數據訪問方式
  
  ____當用戶進行數據庫操作時應用程序傳遞一個ODBC函數調用給ODBC驅動程序管理器 由ODBC API判斷該調用是由它直接處理還是送交驅動程序執行
  
  ____可見單束式驅動程序本身是一個數據庫引擎由它直接可完成對數據庫的操作盡管該數據庫可能位於網絡的任何地方
  
  ____多束式驅動程序
  
  圖
  
  ____多束式驅動程序負責在數據庫引擎和客戶應用程序之間傳送命令和數據它本身並不執行數據處理操作而用於遠程操作的網絡通信協議的一個界面
  
  ____前端應用程序提出對數據庫處理的請求該請求轉給ODBC驅動程序管理器驅動程序管理器依據請求的情況就地完成或傳給多束驅動程序多束式驅動程序將請求翻譯為特定廠家的數據庫通信接口(如Oracle的SQLNet)所能理解的形式並交於接口去處理接口把請求經網絡傳送給服務器上的數據引擎服務器處理完後把結果發回給數據庫通信接口 數據庫接口將結果傳給多束式ODBC驅動程序再由驅動程序將結果傳給應用程序
  
  ____在VC中使用ODBC
  
  ____Visual C++中提供了CDatabaseCRecordsetCRecordViewCDBException和CFie ldExchange五個類這些類封裝了ODBC SDK函數從而使用戶可以無需了解SDK函數就可以很方便地操作支持ODBC的數據庫
  
  ____CDatabase類封裝了與數據庫建立連接控制事務的提交和回滾及執行SQL語句的方法
  
  ____CRecordset類封裝了大部分操縱數據庫的方法包括浏覽修改記錄控制游標移動排序等操作
  
  ____CRecordView類提供了與Recordset對象相連接的視圖可以建立視中的控件與數據庫數據的對應同時支持移動游標修改記錄等操作
  
  ____CDBException類提供了對數據庫操作的異常處理可以獲得操作異常的相關返回代碼
  
  ____CFieldExchange類提供了用戶變量與數據庫字段之間的數據交換如果不需要使用自定義類型將不用直接調用該類的函數MFC Wizard將自動為程序員建立鏈接
  
  ____兩種方法的比較
  
  ____綜上所述使用這兩種方法在Visual C++中都可以很方便地開發出基於Oracle數據庫的應用程序同時這兩種方法又各有其優缺點ODBC由於有MFC強大的類庫支持而使得編程實現非常方便同時可移植性也很強在異構數據庫之間移植也只需更改很少一部分程序但是由ODBC的實現機制我們可以看到與PRO*C相比應用程序需要經過ODBC驅動程序管理器和ODBC驅動程序兩層才能和數據庫通信接口建立聯系而PRO*C是直接與通信接口聯系因此建立在ODBC上應用程序的執行效率會相對低一些PRO*C具有執
From:http://tw.wingwit.com/Article/program/Oracle/201311/17341.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.