青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

         北京航空航天大學計算機科學與工程系   黎杰   麥中凡

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

  
  ORACLE 預編譯程序提供如下功能:
  
 ?、拍苡昧N通用的高級程序設計語言中的任何一種編寫應用程序。
  
  ⑵遵循ANSI 標準,在高級語言中嵌入SQL 語句。
  
 ?、强刹捎脛討BSQL 方法,讓程序在運行時接受或構造一個有效的SQL 語句。
  
 ?、葘崿FORACLE 內部數據類型和高級語言數據類型之間的自動轉換。
  
 ?、煽赏ㄟ^在應用程序中嵌入PL/SQL 事物處理塊來改進性能。
  
 ?、誓茉诔绦蛐泻兔钚猩现付ㄋ枰念A編譯可選項,并可在預編譯的過程中改變它們的
  
 ?、四苋鏅z查嵌入的SQL 數據操縱語句和PL/SQL 塊的文法和語義。
  
 ?、炭捎肧QL*Net 并行存取多個地點的ORACLE 數據庫。
  
 ?、涂砂褦到M作為輸入和輸出程序變量使用。
  
 ?、文軐贸绦蛑械拇a段進行條件預編譯。
  
 ?、咸峁┝溯^強的異常處理功能。
  
  由此可見,通過預編譯程序與其它高級語言的結合,既可以利用SQL 強有力的功能和靈活
性為數據庫應用系統的開發提供強有力的手段,又可以充分利用高級語言自身在系統開發方面
的優勢,從而提供一個完備的基于ORACLE 數據庫應用程序的開發解決方案。
  
  2.2 在VC 中使用PRO*C
  
  每個PRO*C 源文件一般由程序頭和程序體兩部分組成。程序頭包含宿主變量(SQL 語句中
所包含的變量)說明、通訊區定義和C 外部表示符的說明等。程序體一般是由若干函數組成,
這些函數內含有SQL 語句(以EXEC SQL 起頭的語句)。
  
  PRO*C 支持的數據類型包括VARCHAR2( 變長字符串)、NUMBER( 二進制數)、INTGER( 有
符號整數)、FLOAT( 浮點數)、STRING( 以NULL 結尾的字符串)、VARNUM( 變長二進制數)、
LONG( 變長字符串)、VARCHAR( 變長字符串)、ROWID( 二進制值)、DATE( 定長日期/ 時間值)
、VARRAW( 變長二進制數據)、RAW( 定長二進制數據) 、LONGRAW( 變長二進制數據)、
UNSIGNED( 無符號整數)、LONGVARCHAR( 變長字符串)、LONGVARRAW( 變長二進制數據)、
CHAR( 定長字符串)、CHARZ(C 中定長以NULL 結尾的字符串)、MLSLABEL( 變長二進制數據)。
     在PRO*C 中不能使用'l' 或'u' 作詞尾或?x' 作詞頭修飾常量;在SQL 語句中使用單引號來定義字符串,用雙引號來定義特殊的或小寫字符的標識符( 如表名等);SQL 語句中不允許使用C 中的尋址、間接、位邏輯、復合賦值、=、-、++、%、<<、>> 操作符并且用NOT、AND、OR、= 代替!、&&、||、==。
  
  下面的程序是一個聯結數據庫的PRO*C 源程序例子。
     #include  < sqlca.h > //聲明SQL通訊區
     #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數據庫連接失敗!");
  
  return;
  
  }*/
  
  }
  
  在VC 中使用PRO*C 時,先用PRO*C 編寫所需的操作數據庫的子程序,再運行PRO*C 預編
譯程序把PRO*C 源程序轉成相應的CPP 源程序
,將該程序插入到用戶工程文件中并在需要對插
入函數進行調用的模塊中說明函數,然后就可以在此模塊中調用所需的函數。
  
  3. 使用ODBC 中間件訪問數據庫
  
  3.1 ODBC 工作原理
  
  ODBC 是Open Database Connect 即開放數據庫互連的簡稱,它是由Microsoft 公司于
1991 年提出的一個用于訪問數據庫的統一界面標準,是應用程序和數據庫系統之間的中間件
。它通過使用相應應用平臺上和所需數據庫對應的驅動程序與應用程序的交互來實現對數據庫
的操作,避免了在應用程序中直接調用與數據庫相關的操作,從而提供了數據庫的獨立性。
  
  ODBC 主要由驅動程序和驅動程序管理器組成。驅動程序是一個用以支持ODBC 函數調用
的模塊(在WIN95 下通常是一個DLL),每個驅動程序對應于相應的數據庫,當應用程序從基
于一個數據庫系統移植到另一個時,只需更改應用程序中由ODBC 管理程序設定的與相應數據
庫系統對應的別名即可。驅動程序管理器(包含在ODBC32.DLL 中)可鏈接到所有ODBC 應用程
序中,它負責管理應用程序中ODBC 函數與DLL 中函數的綁定。
  
  ODBC 使用層次的方法來管理數據庫,在數據庫通信結構的每一層,對可能出現依賴數據
庫產品自身特性的地方,ODBC 都引入一個公共接口以解決潛在的不一致性,從而很好地解決
了基于數據庫系統應用程序的相對獨立性,這也是ODBC 一經推出就獲得巨大成功的重要原因
  
  從結構上分,ODBC 分為單束式和多束式兩類。
  
 ?、艈问津寗映绦?
  
  單束式驅動程序介于應用程序和數據庫之間,像中介驅動程序一樣數據提供一個統一的數
  
  當用戶進行數據庫操作時,應用程序傳遞一個ODBC 函數調用給ODBC 驅動程序管理器,
由ODBC API 判斷該調用是由它直接處理并將結果返回還是送交驅動程序執行并將結果返回。
  
  由上可見,單束式驅動程序本身是一個數據庫引擎,由它直接可完成對數據庫的操作,盡
  
 ?、贫嗍津寗映绦?
  
  多束式驅動程序負責在數據庫引擎和客戶應用程序之間傳送命令和數據,它本身并不執行
數據處理操作而用于遠程操作的網絡通信協議的一個界面。
  
  前端應用程序提出對數據庫處理的請求,該請求轉給ODBC 驅動程序管理器,驅動程序管
理器依據請求的情況,就地完成或傳給多束驅動程序,多束式驅動程序將請求翻譯為特定廠家
的數據庫通信接口(如Oracle 的SQLNet)所能理解的形式并交于接口去處理,接口把請求經
網絡傳送給服務器上的數據引擎,服務器處理完后把結果發回給數據庫通信接口,數據庫接口
將結果傳給多束式ODBC 驅動程序,再由驅動程序將結果傳給應用程序。
  
  3.2 在VC 中使用ODBC
  
  Visual C++ 中提供了CDatabase、CRecordset、CRecordView、CDBException 和
CFieldExchange 五個類,這些類封裝了ODBC SDK 函數
,從而使用戶可以無需了解SDK 函數
  
  CDatabase 類:封裝了與數據庫建立連接,控制事務的提交和回滾及執行SQL 語句的方法
  
  CRecordset 類:封裝了大部分操縱數據庫的方法,包括瀏覽、修改記錄,控制游標移動
  
  CRecordView 類:提供了與recordset 對象相連接的視,可以建立視中的控件與數據庫數
  
  CDBException 類:提供了對數據庫操作的異常處理,可以獲得操作異常的相關返回代碼
  
  CFieldExchange 類:提供了用戶變量與數據庫字段之間的數據交換,如果不需要使用自
定義類型,你將不用直接調用該類的函數,MFC Wizard 將自動為程序員建立連接。
  
  4. 兩種方法的比較
  
  綜上所述,使用這兩種方法在Visual C++ 中都可以很方便地開發出基于ORACLE 數據庫
的應用程序,同時,這兩種方法又各有其優缺點。ODBC 由于有MFC 強大的類庫支持而使得編
程實現非常方便,同時可移植性也很強,在異構的數據庫之間移植也只需更改很少的一部分程
序,但是,由ODBC 的實現機制我們可以看到,與PRO*C 相比,應用程序需要經過ODBC 驅動
程序管理器和ODBC 驅動程序兩層才能和數據庫通信接口建立聯系,而PRO*C 是直接與通信接
口聯系,因此建立在ODBC 上應用程序的執行效率會相對低一些。PRO*C 具有執行效率高,支
持嵌入式PL/SQL 塊等ORACLE 自身特有的優點,但正因為有了這些優點,使得用PRO*C 開發出
的應用程序無法向異構數據庫平臺移植。
posted on 2007-04-24 22:29 哈哈 閱讀(1726) 評論(1)  編輯 收藏 引用

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一级久久久久久久大片| 国产亚洲精品aa午夜观看| 亚洲风情亚aⅴ在线发布| 国产一区二区在线观看免费播放 | 亚洲尤物视频网| 欧美日韩成人综合在线一区二区| 亚洲国产一区二区三区青草影视| 日韩视频精品| 欧美国产日韩一区| 99www免费人成精品| 一区二区三区视频在线观看| 欧美日本一道本在线视频| 夜夜精品视频| 久久久人成影片一区二区三区 | 亚洲免费观看高清在线观看| 欧美日韩免费高清| 欧美一区二区三区精品 | 欧美激情一区二区三区全黄| 99re6热在线精品视频播放速度| 国产精品国产三级国产aⅴ无密码| 亚洲免费观看| 久久亚洲色图| 宅男噜噜噜66一区二区| 国产在线观看91精品一区| 牛人盗摄一区二区三区视频| 一本色道婷婷久久欧美| 久久综合久久久| 亚洲一卡二卡三卡四卡五卡| 国内精品一区二区| 欧美日本一区二区高清播放视频| 翔田千里一区二区| 亚洲国产精品成人| 欧美自拍偷拍| 一区二区三区欧美日韩| 国产一区二区你懂的| 欧美激情综合五月色丁香| 亚洲一区二区三区在线视频| 亚洲第一区在线观看| 欧美夜福利tv在线| 在线成人av| 国产精品爱久久久久久久| 欧美一区二区三区四区高清| 亚洲精品视频一区二区三区| 99日韩精品| 亚洲丰满在线| 裸体丰满少妇做受久久99精品| 亚洲午夜女主播在线直播| 在线播放中文一区| 国内精品99| 国产麻豆精品视频| 欧美性大战久久久久| 欧美大片免费| 久久九九国产精品| 亚洲欧美另类综合偷拍| 亚洲三级视频| 91久久精品国产91性色| 欧美大色视频| 农夫在线精品视频免费观看| 午夜精品久久| 亚洲欧美在线免费| 亚洲一区二区免费看| 99国产精品久久久久久久| 亚洲国产日韩欧美| 在线观看一区欧美| 在线观看日韩欧美| 黄色成人91| 国产午夜精品一区理论片飘花 | 中文欧美字幕免费| 亚洲乱码国产乱码精品精天堂| 亚洲国产精品成人va在线观看| 亚洲第一天堂av| 亚洲国产精品一区二区第一页| 欧美成人国产一区二区| 欧美刺激性大交免费视频| 噜噜噜在线观看免费视频日韩| 久久久久久久成人| 免费不卡在线观看av| 免费在线看成人av| 欧美高潮视频| 亚洲韩日在线| 亚洲精品久久久久久久久久久久久 | 欧美超级免费视 在线| 久久久久综合一区二区三区| 久久久久久久国产| 久久精品99| 免费不卡亚洲欧美| 欧美gay视频激情| 欧美区在线观看| 国产精品高精视频免费| 国产精品免费视频观看| 国产精品嫩草99a| 国产一区二区在线观看免费| 一区二区亚洲欧洲国产日韩| 亚洲茄子视频| 亚洲在线网站| 一区二区成人精品| 亚洲国产日韩欧美在线99| 久久成人免费电影| 亚洲精品孕妇| 在线视频免费在线观看一区二区| 久久这里只精品最新地址| 久久久久高清| 亚洲第一色在线| 日韩视频免费| 久久理论片午夜琪琪电影网| 亚洲国产精品一区二区尤物区| 欧美成人精品一区二区三区| 欧美一区久久| 亚洲一区二区3| 欧美日韩国内| 欧美黑人国产人伦爽爽爽| 久久人人97超碰人人澡爱香蕉 | 国产一区二区三区观看 | 欧美aa国产视频| 国产欧美精品一区aⅴ影院| 久久九九国产精品| 久久精品一区二区三区不卡牛牛| 欧美日韩一区二区三区在线视频| 久久久久天天天天| 亚洲精品一区二区在线| 欧美一二三视频| 亚洲一区视频| 一区二区三区精品视频在线观看| 亚洲手机在线| 亚洲免费电影在线| 亚洲国产精品t66y| 久久福利影视| 国产亚洲欧美日韩精品| 亚洲黄色毛片| 欧美一区二区三区四区在线 | 久久免费高清视频| 亚洲精品日韩激情在线电影| 亚洲精品专区| 一区二区三区视频在线看| 一区二区三区免费看| 99天天综合性| 午夜视频在线观看一区| 欧美a级大片| 国产精品激情电影| 韩日成人在线| 国模私拍视频一区| 久久九九国产| 久久精品二区| 欧美一区二区三区久久精品| 一本大道久久a久久精品综合| 在线日本成人| 91久久精品国产91久久性色tv | 亚洲人成在线观看网站高清| 国产情侣久久| 国产精品大片| 欧美久久电影| 国产精品永久| 欧美香蕉视频| 国产一区二区精品丝袜| 亚洲亚洲精品三区日韩精品在线视频| 91久久精品美女| 久久国产手机看片| 欧美精品久久久久久| 亚洲国产黄色| 欧美大片一区二区三区| 在线观看亚洲视频| 久久精品视频免费播放| 午夜在线视频一区二区区别| 欧美极品在线播放| 亚洲激情中文1区| 小辣椒精品导航| 欧美一区二区三区在线播放| 久久精品主播| 国产欧美 在线欧美| 亚洲欧洲久久| 小嫩嫩精品导航| 亚洲一区二区少妇| 模特精品在线| 免费成人性网站| 中文一区二区| 亚洲最黄网站| 亚洲图片在线| 欧美一区免费视频| 国产专区精品视频| 欧美1区3d| 欧美精品一区二区蜜臀亚洲| 亚洲国产精品尤物yw在线观看 | 午夜在线观看欧美| 韩国成人福利片在线播放| 六月婷婷久久| 欧美成人精品一区二区三区| 日韩亚洲综合在线| 亚洲一区二区精品在线| 国产精品亚发布| 美脚丝袜一区二区三区在线观看 | 欧美激情亚洲| 亚洲一区二区视频在线| 亚洲欧美日韩区| 久久躁狠狠躁夜夜爽| 久久综合久久综合久久综合| 欧美aa在线视频| 午夜精品视频一区| 久久久精品免费视频| 亚洲看片网站| 欧美一区二区三区视频|