国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

Oracle 數(shù)據(jù)庫向 MS SQL Server 7.0 的遷移(5)

2024-08-31 00:52:02
字體:
供稿:網(wǎng)友

  使用 ODBC
  本節(jié)提供 Oracle 和 SQL Server 使用 ODBC 的方式的信息,以及使用 ODBC 開發(fā)和遷移應(yīng)用程序的信息。
  
  將應(yīng)用程序代碼從 Oracle 轉(zhuǎn)換到 SQL Server 時(shí),請(qǐng)使用下面的過程:
  
  假如應(yīng)用程序用 Oracle PRo*C 或 Oracle 調(diào)用接口 (OCI) 寫成,請(qǐng)考慮將應(yīng)用程序轉(zhuǎn)換為 ODBC。
  了解 SQL Server 默認(rèn)結(jié)果集和游標(biāo)選項(xiàng),并選擇對(duì)應(yīng)用程序最有效的提取策略。
  如必要,將 Oracle ODBC SQL 數(shù)據(jù)類型重新映射到 SQL Server ODBC SQL 數(shù)據(jù)類型。
  使用 ODBC Extended SQL 擴(kuò)展,創(chuàng)建通用的 SQL 語句。
  確定 SQL Server 應(yīng)用程序是否需要手動(dòng)提交模式。
  測(cè)試應(yīng)用程序的性能,并在需要時(shí)修改程序。
   Oracle 數(shù)據(jù)庫向 MS SQL Server 7.0 的遷移(5)(圖一)
  Microsoft 提供 16 位和 32 位版本的 ODBC SQL Server 驅(qū)動(dòng)程序。32 位的 ODBC SQL Server 驅(qū)動(dòng)程序是線程安全的。驅(qū)動(dòng)程序?qū)⒍鄠€(gè)線程共享的訪問串行送到共享的語句句柄 (hstmt),連接句柄 (hdbc) 和環(huán)境句柄 (henv)。即使程序使用多個(gè)線程時(shí),ODBC 程序仍負(fù)責(zé)將語句和連接空間中的操作保持為正確的順序。
  
  因?yàn)?Oracle ODBC 驅(qū)動(dòng)程序可由多個(gè)可能的廠商之一提供,對(duì)于體系結(jié)構(gòu)和操作,就會(huì)有許多可能的方案。必須與廠商聯(lián)系,確保 ODBC 驅(qū)動(dòng)程序能夠滿足您的應(yīng)用程序的需要。
  
  在大多數(shù)情況下,Oracle ODBC 驅(qū)動(dòng)程序使用 SQL*Net,與 Oracle RDBMS 連接。與 Personal Oracle 連接時(shí),可以不使用 SQL*Net。
  
  下圖給出了 32 位環(huán)境的應(yīng)用程序/驅(qū)動(dòng)程序體系結(jié)構(gòu)。
   Oracle 數(shù)據(jù)庫向 MS SQL Server 7.0 的遷移(5)(圖二)
  “形式-實(shí)在轉(zhuǎn)換”一詞是指一個(gè)函數(shù)調(diào)用,它是一個(gè)非凡處理,在 16 位和 32 位代碼間進(jìn)行轉(zhuǎn)換,然后將控制轉(zhuǎn)移給目標(biāo)函數(shù)。注重,ODBC 游標(biāo)庫是如何有選擇地在驅(qū)動(dòng)程序治理器及其驅(qū)動(dòng)程序之間駐留的。此庫在僅支持只能前進(jìn)的游標(biāo)的驅(qū)動(dòng)程序上,提供了可滾動(dòng)游標(biāo)服務(wù)。
  
  Oracle 和 SQL Server 處理結(jié)果集和游標(biāo)方式不同。要成功地將客戶應(yīng)用程序從 Oracle 遷移到 SQL Server,并以最佳狀態(tài)運(yùn)行,了解這些差異是至關(guān)重要的。
  
  在 Oracle 中,當(dāng)在客戶應(yīng)用程序中被提取時(shí),任何 SELECT 命令的結(jié)果集都被作為只能前進(jìn)的游標(biāo)處理。不管使用 ODBC、OCI,還是嵌入式 SQL 作為開發(fā)工具都是如此。
  
  默認(rèn)情況下,要返回一行,客戶程序(例如,ODBC 中的 SQLFetch)執(zhí)行的每個(gè) Oracle FETCH 命令都產(chǎn)生一個(gè)通過網(wǎng)絡(luò)到達(dá)服務(wù)器的往返。假如客戶應(yīng)用程序要每次通過網(wǎng)絡(luò)提取不止一行,則必須在其程序中建立一個(gè)數(shù)組,并使用數(shù)組提取。
  
  由于 Oracle 的多版本并發(fā)性模型,對(duì)于只讀游標(biāo),在提取間隙服務(wù)器上不保持鎖定。當(dāng)程序使用 FOR UPDATE 子句指定一個(gè)可更新的游標(biāo)時(shí),語句打開時(shí),SELECT 命令中請(qǐng)求的所有行均被鎖定。在程序發(fā)出 COMMIT 或 ROLLBACK 請(qǐng)求前,這些行級(jí)鎖定均有效。
  
  在 SQL Server 中,SELECT 語句并不總是與服務(wù)器上的游標(biāo)關(guān)聯(lián)。默認(rèn)情況下,SQL Server 只是把 SELECT 語句的結(jié)果集合行依次返回給客戶。SELECT 一執(zhí)行,數(shù)據(jù)流就開始了。結(jié)果集數(shù)據(jù)流也可以由存儲(chǔ)過程的 SELECT 語句返回。此外,對(duì)于單個(gè) EXECUTE 語句,單個(gè)存儲(chǔ)過程或一批命令可能返回多個(gè)結(jié)果集。
  
  一旦這些默認(rèn)結(jié)果集可用,SQL Server 客戶就負(fù)責(zé)提取它們。對(duì)于默認(rèn)結(jié)果集,客戶的提取不產(chǎn)生到服務(wù)器的往返。相反地,對(duì)默認(rèn)結(jié)果集的提取可將數(shù)據(jù)從網(wǎng)絡(luò)緩沖區(qū)讀取到程序變量中。默認(rèn)結(jié)果集模型創(chuàng)建了一種有效的機(jī)制,在通過網(wǎng)絡(luò)的一次往返,向客戶機(jī)返回多行數(shù)據(jù)。將網(wǎng)絡(luò)往返次數(shù)最小化,通常是改善客戶/服務(wù)器應(yīng)用程序性能最重要的因素。
  
  和 Oracle 游標(biāo)相比,默認(rèn)結(jié)果集賦予了 SQL Server 客戶應(yīng)用程序更多的職責(zé)。SQL Server 客戶應(yīng)用程序必須立即提取 EXECUTE 語句返回的所有結(jié)果集行。假如應(yīng)用程序需要逐步地將行提供給程序的其它部分,它必須將行緩存在一個(gè)內(nèi)部數(shù)組中。假如它未能提取所有的結(jié)果集行,則與 SQL Server 連接仍然保持繁忙。
  
  假如發(fā)生這種情況,在所有結(jié)果集行被提取或客戶取消請(qǐng)求之前,在連接上不能執(zhí)行其它工作。而且,在提取完成之前,服務(wù)器繼續(xù)保持表數(shù)據(jù)頁上的共享鎖定。
正是基于提取完成之前,這些共享鎖定始終保持這一事實(shí),您必須盡快提取所有的行。這與 Oracle 應(yīng)用程序中常見的逐步提取方式形成了鮮明的對(duì)比。
  
  Microsoft SQL Server 提供了“服務(wù)器游標(biāo)”,來滿足通過網(wǎng)絡(luò)逐步提取結(jié)果集的需要??赏ㄟ^調(diào)用 SQLSetStmtOption 設(shè)定 SQL_CURSOR_TYPE 選項(xiàng),在應(yīng)用程序中請(qǐng)求服務(wù)器游標(biāo)。
  
  當(dāng) SELECT 語句作為服務(wù)器游標(biāo)執(zhí)行時(shí),EXECUTE 語句只返回游標(biāo)標(biāo)識(shí)符。隨后的提取請(qǐng)求把游標(biāo)標(biāo)識(shí)符和指定一次提取行數(shù)的參數(shù)一起傳回給服務(wù)器。服務(wù)器返回請(qǐng)求的行數(shù)。
  
  在提取請(qǐng)求的間隙,連接保持空閑,以執(zhí)行其它命令,包括其它游標(biāo)的 OPEN 或 FETCH 請(qǐng)求。在 ODBC 術(shù)語中,它是指服務(wù)器游標(biāo)答應(yīng) SQL Server 驅(qū)動(dòng)程序在單個(gè)連接上支持多個(gè)活動(dòng)語句。
  
  此外,在提取請(qǐng)求間隙,服務(wù)器游標(biāo)通常不保持鎖定,所以在提取間隙可隨時(shí)暫停等候用戶輸入,而不會(huì)影響其他用戶。可以使用樂觀開放沖突檢測(cè)或悲觀滾動(dòng)鎖定并發(fā)性選項(xiàng),來更新服務(wù)器游標(biāo)。
  
  盡管有了這些功能,對(duì) Oracle 開發(fā)人員而言,使用服務(wù)器游標(biāo)編程比默認(rèn)結(jié)果集更熟悉,但是這也不是沒有代價(jià)的。和默認(rèn)結(jié)果集相比:
  
  從服務(wù)器資源角度講,服務(wù)器游標(biāo)更昂貴,因?yàn)樵诜?wù)器上使用了臨時(shí)存儲(chǔ)空間,來維護(hù)游標(biāo)狀態(tài)信息。
  用服務(wù)器游標(biāo)檢索給定結(jié)果集的數(shù)據(jù)更昂貴,因?yàn)?EXECUTE 語句和服務(wù)器游標(biāo)中的每個(gè)檢索請(qǐng)求均需要一個(gè)不同的到服務(wù)器的往返。
  在支持批處理和存儲(chǔ)過程方面,服務(wù)器游標(biāo)靈活性較差。這是因?yàn)榉?wù)器游標(biāo)每次只執(zhí)行一個(gè) SELECT 語句,而默認(rèn)結(jié)果集可用于批處理和存儲(chǔ)過程,其返回多個(gè)結(jié)果集或包含 SELECT 語句以外的其它語句。
  由于這些原因,最好將服務(wù)器游標(biāo)的使用限定在需要其功能的應(yīng)用程序部分。使用服務(wù)器游標(biāo)的一個(gè)例子可以在 Ssdemo.cpp 示例 SQL Server ODBC 程序文件的 LIST_STUDENTS 函數(shù)中找到。
  
  Oracle RDBMS 只支持前滾游標(biāo)。每行均是按照查詢中指定的順序提取到應(yīng)用程序中。Oracle 不支持后移到上一個(gè)提取行的請(qǐng)求。向后移動(dòng)的唯一辦法是,關(guān)閉游標(biāo)再重新打開。但遺憾的是,您會(huì)被重定位到活動(dòng)查詢集的第一行。
  
  因?yàn)?SQL Server 支持可滾動(dòng)游標(biāo),所以可將 SQL Server 游標(biāo)定位到任何行??梢韵蚯昂拖蚝鬂L動(dòng)。對(duì)于許多涉及用戶界面的應(yīng)用程序,可滾動(dòng)性是一個(gè)很有用的功能。有了可滾動(dòng)游標(biāo),應(yīng)用程序可以一次提取一整屏的行,并且可按照用戶請(qǐng)求,只提取附加行。
  
  盡管 Oracle 并不直接支持可滾動(dòng)游標(biāo),但是可以使用一個(gè) ODBC 選項(xiàng),將這一限制減至最小。例如,一些 Oracle ODBC 驅(qū)動(dòng)程序(例如與 Microsoft Developer Studio 可視化開發(fā)系統(tǒng)一起發(fā)行的 Oracle ODBC 驅(qū)動(dòng)程序)可在驅(qū)動(dòng)程序中提供基于客戶的可滾動(dòng)游標(biāo)。
  
  另外,對(duì)于任何符合兼容性級(jí)別 Level One 的 ODBC 驅(qū)動(dòng)程序,ODBC 游標(biāo)庫均支持塊可滾動(dòng)游標(biāo)。通過使用 RDBMS 僅向前提取,以及將結(jié)果集數(shù)據(jù)緩存在內(nèi)存或磁盤上,這兩種客戶游標(biāo)選項(xiàng)均能支持滾動(dòng)。當(dāng)請(qǐng)求數(shù)據(jù)時(shí),驅(qū)動(dòng)程序根據(jù)需要從 RDBMS 或本地緩存中檢索數(shù)據(jù)。
  
  對(duì)于 SELECT 語句產(chǎn)生的結(jié)果集,基于客戶的游標(biāo)還支持定位 UPDATE 和 DELETE 語句。游標(biāo)庫使用 WHERE 子句構(gòu)造 UPDATE 或 DELETE 語句,該子句為行中的每列均指定了緩存值。
  
  假如需要可滾動(dòng)游標(biāo),且要為 Oracle 和 SQL Server 實(shí)現(xiàn)保持相同的源代碼,那么,ODBC 游標(biāo)庫就是一個(gè)很有用的選擇。有關(guān) ODBC 游標(biāo)庫的具體信息,請(qǐng)參見 ODBC 文檔。
  
  由于 SQL Server 提供的提取數(shù)據(jù)選項(xiàng)很多,有時(shí)很難決定使用哪個(gè)選項(xiàng),以及何時(shí)使用。以下是一些有用的指導(dǎo)原則:
  
  默認(rèn)結(jié)果集始終是將整個(gè)數(shù)據(jù)集從 SQL Server 移到客戶最快捷的方法。在應(yīng)用程序中尋找可使用這一功能的可能性。例如,批量報(bào)告生成通常將整個(gè)結(jié)果集處理完,在處理過程中沒有用戶交互和更新。
  假如程序需要可更新的游標(biāo),使用服務(wù)器游標(biāo)。使用定位 UPDATE 或 DELETE 語句時(shí),默認(rèn)結(jié)果集絕不可以更新。此外,服務(wù)器游標(biāo)比基于客戶的游標(biāo)更適于更新,后者必須構(gòu)建對(duì)等的 UPDATE 或 DELETE 語句,來模擬定位 UPDATE 或 DELETE。
  假如程序需要可滾動(dòng)的、只讀的游標(biāo),ODBC 游標(biāo)庫和服務(wù)器游標(biāo)都是很好的選擇。ODBC 游標(biāo)庫提供 SQL Server 與 Oracle 之間的兼容行為;在每次通過網(wǎng)絡(luò)提取多少數(shù)據(jù)方面,服務(wù)器游標(biāo)則具有更大的靈活性。
  當(dāng)使用默認(rèn)結(jié)果集或構(gòu)建在默認(rèn)結(jié)果集之上的 ODBC 游標(biāo)庫游標(biāo)時(shí),要保證盡快地將結(jié)果集提取完,應(yīng)避免在服務(wù)器上保持共享鎖定。
  使用服務(wù)器游標(biāo)時(shí),要確保使用 SQLExtendedFetch,每次提取整塊的行,而不是每次一行。這和 Oracle 應(yīng)用程序中的數(shù)組類型提取是一樣的。服務(wù)器游標(biāo)上的每個(gè)提取請(qǐng)求均需要在網(wǎng)絡(luò)上從應(yīng)用程序到 RDBMS 的一個(gè)往返。
  購買日用雜貨提供了一個(gè)類比。假定您在食品雜貨店購買了 10 袋食品,把一袋食品裝上車,開回家,卸下來,再返回食品雜貨店取下一袋。在現(xiàn)實(shí)生活中,這種場(chǎng)景是不太可能發(fā)生的,但是,SQL Server 和程序從服務(wù)器游標(biāo)單行提取數(shù)據(jù),就是這種情形。
  
  假如程序只要求只能向前、只讀的游標(biāo),但依靠一個(gè)連接上多個(gè)打開的游標(biāo),當(dāng)知道可將整個(gè)結(jié)果集立即提取到程序變量中時(shí),則使用默認(rèn)結(jié)果集。當(dāng)不知道可否馬上提取所有的行時(shí),使用服

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 河北省| 饶阳县| 南澳县| 杭锦旗| 汝南县| 盐源县| 肃北| 利川市| 云南省| 邵东县| 花垣县| 文昌市| 海城市| 综艺| 家居| 罗山县| 丰宁| 马尔康县| 常宁市| 天柱县| 土默特右旗| 灵宝市| 台东市| 林周县| 民勤县| 虎林市| 黑龙江省| 望城县| 五原县| 大理市| 都江堰市| 红河县| 崇义县| 凌源市| 山东省| 炉霍县| 柳江县| 德化县| 萨迦县| 南川市| 宿松县|