<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Dict.CN 在線詞典, 英語(yǔ)學(xué)習(xí), 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統(tǒng)計(jì)

    留言簿(23)

    積分與排名

    優(yōu)秀學(xué)習(xí)網(wǎng)站

    友情連接

    閱讀排行榜

    評(píng)論排行榜

    數(shù)據(jù)轉(zhuǎn)換中關(guān)鍵技術(shù)及難點(diǎn)(zhuan)

    本文介紹了數(shù)據(jù)轉(zhuǎn)換沖突及處理,讀取數(shù)據(jù)源的元數(shù)據(jù),數(shù)據(jù)類型轉(zhuǎn)換,數(shù)據(jù)轉(zhuǎn)換過程中大對(duì)象的處理等方法,請(qǐng)讀者慢慢體會(huì)。

    1 數(shù)據(jù)轉(zhuǎn)換沖突及處理
    1.1 數(shù)據(jù)轉(zhuǎn)換沖突
    在數(shù)據(jù)轉(zhuǎn)換過程中,要想實(shí)現(xiàn)嚴(yán)格的等價(jià)轉(zhuǎn)換是比較困難的。必須要確定兩種模型中所存在的各種語(yǔ)法和語(yǔ)義上的沖突,這些沖突可能包括:
    1)命名沖突:源數(shù)據(jù)源的標(biāo)識(shí)符可能是目的數(shù)據(jù)源中的保留字。
    2)格式?jīng)_突:同一種數(shù)據(jù)類型可能有不同的表示方法和語(yǔ)義差異。
    3)結(jié)構(gòu)沖突:如果兩種DBMS之間的數(shù)據(jù)定義模型不同,如為關(guān)系模型和層次模型,則需要重新定義實(shí)體屬性和聯(lián)系,以防止屬性或聯(lián)系信息的丟失。
    4)類型沖突:不同數(shù)據(jù)庫(kù)的同一種數(shù)據(jù)類型存在精度之間的差異。
    5)其他沖突:不同數(shù)據(jù)庫(kù)的大對(duì)象類型存在不同的約束,而且存在一些特殊類型。如SQL SERVER中一個(gè)表中有多于一個(gè)TEXT或IMAGE的字段時(shí),出現(xiàn)錯(cuò)誤。而ORACLE也不允許一個(gè)表中的BLOB和LONG類型多于一個(gè)。

    1.2 沖突處理方法
    對(duì)于以上數(shù)據(jù)轉(zhuǎn)換中的沖突,可進(jìn)行相應(yīng)的沖突處理。
    對(duì)于命名沖突,可以先檢查數(shù)據(jù)源中的保留字,建立保留字集合,對(duì)于保留字中的命名沖突,根據(jù)需要重新命名。
    對(duì)于格式?jīng)_突,可以根據(jù)ODBC SQL類型從數(shù)據(jù)源的驅(qū)動(dòng)程序中取出相對(duì)應(yīng)的數(shù)據(jù)源的數(shù)據(jù)類型后,對(duì)一些特定的類型進(jìn)行特殊的處理。對(duì)于字符型數(shù)據(jù)中含有“'”字符的情況,在數(shù)據(jù)轉(zhuǎn)換過程中需通過轉(zhuǎn)義符作特殊處理,否則會(huì)把它誤當(dāng)作字符串分隔符。
    對(duì)于不同數(shù)據(jù)庫(kù)的同一數(shù)據(jù)類型的精度沖突,類型轉(zhuǎn)換中將ODBC SQL類型和精度結(jié)合起來決定源數(shù)據(jù)類型和目標(biāo)數(shù)據(jù)類型的映射關(guān)系。找出目的數(shù)據(jù)源中與源數(shù)據(jù)源類型的精度最匹配的數(shù)據(jù)類型作為缺省的映射關(guān)系。
    轉(zhuǎn)換過程中的數(shù)據(jù)類型匹配,日期型數(shù)據(jù)最好先轉(zhuǎn)換成字符型,然后根據(jù)不同的目標(biāo)數(shù)據(jù)源分別作不同的處理。如ORACLE中使用TO_DATE函數(shù),而FOXPRO中使用CTOD函數(shù)將日期格式的字符串轉(zhuǎn)換成日期。
    對(duì)于SQL SERVER中的TEXT、IMAGE類型,在進(jìn)行轉(zhuǎn)換時(shí)需要做出選擇,或者把TEXT鏡像為VARCHAR2(4000),或者鏡像為L(zhǎng)ONG 類型,但Long 類型一個(gè)表里只能有一個(gè)。對(duì)于ORACLE,TEXT類型可以映像為CLOB類型,而IMAGE可以鏡像為BLOB。CLOB類型可以在一個(gè)ORACLE表里有多列。

    2 讀取數(shù)據(jù)源的元數(shù)據(jù)
    2.1 數(shù)據(jù)源的元數(shù)據(jù)類型
    數(shù)據(jù)源的元數(shù)據(jù)類型如表3所示:
    表3數(shù)據(jù)源的元數(shù)據(jù)類型
    元數(shù)據(jù)種類 元數(shù)據(jù)信息 用途
    數(shù)據(jù)源連接信息 數(shù)據(jù)庫(kù)名,驅(qū)動(dòng)器,服務(wù)器,DSN名,數(shù)據(jù)源描述,用戶名等 用于連接源數(shù)據(jù)源和目的數(shù)據(jù)源
    表信息 表名,表屬主,表模式,表類型 用于數(shù)據(jù)轉(zhuǎn)換中創(chuàng)建表
    列信息 列名,類型,寬度,精度,標(biāo)度,是否為空 用于數(shù)據(jù)轉(zhuǎn)換中表的創(chuàng)建以及列映射
    類型信息 類型名,最大列寬度,最大最小標(biāo)度,前后綴字符,是否接受空,關(guān)鍵字列表 用于數(shù)據(jù)轉(zhuǎn)換中表的創(chuàng)建以及類型映射
    鍵信息 主鍵名,主鍵列,外鍵名,外鍵列,外鍵關(guān)聯(lián)列 用于數(shù)據(jù)轉(zhuǎn)換中表模式的轉(zhuǎn)換
    其它對(duì)象信息 索引信息,存儲(chǔ)過程信息,權(quán)限信息等 用于數(shù)據(jù)轉(zhuǎn)換中數(shù)據(jù)庫(kù)對(duì)象的轉(zhuǎn)換

    2.2 數(shù)據(jù)源的元數(shù)據(jù)讀取方法
    1)調(diào)用ODBC API函數(shù)
    可以直接調(diào)用ODBC API函數(shù)讀取數(shù)據(jù)源的元數(shù)據(jù)。即分別調(diào)用以下函數(shù)SQLTables,SQLColumns, SQLDescribeCol,SQLGetTypeInfo,SQLForeignKeys,SQLPrimaryKeys,SQLProcedureColumns,SQLProcedures, SQLStatistics,SQLTablePrivileges,SQLColumnPrivileges獲得數(shù)據(jù)源中的表信息,列信息,類型信息,鍵信息以及其他對(duì)象信息等。其主要步驟是連接數(shù)據(jù)源,分配語(yǔ)句句柄,然后調(diào)用ODBC API來獲取各種元數(shù)據(jù)信息。
    然而直接調(diào)用ODBC API函數(shù)比較復(fù)雜,各種參數(shù)不易理解,且直接獲取返回的數(shù)據(jù)較困難。VC++的MFC類庫(kù)對(duì)ODBC的API進(jìn)行封裝,部分簡(jiǎn)化了ODBC調(diào)用(尤其是對(duì)數(shù)據(jù)庫(kù)記錄集的操作),但單純利用MFC類獲取異構(gòu)型數(shù)據(jù)庫(kù)的結(jié)構(gòu)信息仍然比較困難,因此需要將MFC和直接調(diào)用ODBC API方法結(jié)合起來。利用ODBC接口函數(shù)重載了MFC中CRecordset類的部分成員函數(shù),創(chuàng)建CTable,CColumns,CTypes,CPrimaryKeys等類。利用這些新創(chuàng)建的類,可以很方便的獲取異構(gòu)型數(shù)據(jù)庫(kù)結(jié)構(gòu)信息。
    2) 通過ADO對(duì)象
    通過ADO中CONNECTION對(duì)象的GetTableNames 方法可以得到數(shù)據(jù)源的表信息,而通過ADO中RECORDSET對(duì)象中的FieldDefs屬性可以得到數(shù)據(jù)集的各種列信息和類型信息。在得到數(shù)據(jù)源的元數(shù)據(jù)前,必須先創(chuàng)建CONNECTION對(duì)象連接數(shù)據(jù)源,并通過數(shù)據(jù)集對(duì)象RECORDSET來打開相應(yīng)的數(shù)據(jù)表,之后即可以取得相應(yīng)的數(shù)據(jù)源的元數(shù)據(jù)。

    3 數(shù)據(jù)類型轉(zhuǎn)換
    3.1 異構(gòu)數(shù)據(jù)源數(shù)據(jù)類型概述
    對(duì)不同數(shù)據(jù)庫(kù)系統(tǒng),每個(gè)DBMS都定義了一套自己的數(shù)據(jù)類型,但不論數(shù)據(jù)類型在各個(gè)系統(tǒng)中如何變化,其功能都滿足用戶的數(shù)據(jù)處理基本要求,如數(shù)值型,包括整型、實(shí)型、浮點(diǎn)型、雙精度型等;字符型,包括定長(zhǎng)、變長(zhǎng)等;日期型,包括年、月、日和小時(shí)、分、秒等;長(zhǎng)字符型,包括文本類型,還有錢幣型等。隨著數(shù)據(jù)庫(kù)系統(tǒng)的不斷發(fā)展和版本的不斷升級(jí),數(shù)據(jù)類型的種類也不斷增多,如超文本和二進(jìn)制處理多媒體和大文本的數(shù)據(jù)類型。這些帶有共性的東西,給系統(tǒng)間的數(shù)據(jù)轉(zhuǎn)換帶來了可能和方便,但不同的數(shù)據(jù)庫(kù)的數(shù)據(jù)類型也是有差異的。其自身定義和擴(kuò)充之間的區(qū)別,也給系統(tǒng)間的數(shù)據(jù)轉(zhuǎn)換帶來了許多困難。例如,DBMS返回的日期和時(shí)間數(shù)據(jù)格式在各個(gè)DBMS中有很大的不同。有些系統(tǒng)以8字節(jié)整數(shù)格式返回日期和時(shí)間,另外一些以浮點(diǎn)數(shù)格式返回。并且有的DBMS含有LONG類型,其它DBMS無(wú)此類型。所以異種數(shù)據(jù)庫(kù)數(shù)據(jù)類型轉(zhuǎn)換的關(guān)鍵是找出其中的對(duì)應(yīng)關(guān)系。

    3.2 數(shù)據(jù)類型轉(zhuǎn)換方法一(設(shè)計(jì)類型映射表)
    為了實(shí)現(xiàn)相互數(shù)據(jù)轉(zhuǎn)換,必須設(shè)計(jì)多個(gè)相應(yīng)的雙向數(shù)據(jù)轉(zhuǎn)換程序并且解決不同的數(shù)據(jù)類型匹配問題。當(dāng)增加一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)時(shí),相應(yīng)要解決該數(shù)據(jù)庫(kù)系統(tǒng)與已存在的多個(gè)異構(gòu)庫(kù)的數(shù)據(jù)類型匹配問題,并增加多個(gè)對(duì)應(yīng)轉(zhuǎn)換程序。為了實(shí)現(xiàn)程序的擴(kuò)展性,可以通過設(shè)計(jì)類型映射表來解決類型轉(zhuǎn)換問題。
    將不同數(shù)據(jù)庫(kù)系統(tǒng)數(shù)據(jù)類型的對(duì)應(yīng)關(guān)系和相應(yīng)的數(shù)據(jù)轉(zhuǎn)換處理程序分離開,使數(shù)據(jù)轉(zhuǎn)換程序相對(duì)獨(dú)立,而把類型轉(zhuǎn)換關(guān)系在專門的表結(jié)構(gòu)中存儲(chǔ)。通過對(duì)不同數(shù)據(jù)庫(kù)系統(tǒng)之間的數(shù)據(jù)類型進(jìn)行詳細(xì)而深入的分析,找出了不同數(shù)據(jù)庫(kù)系統(tǒng)不同版本的各個(gè)不同類型之間缺省的類型對(duì)應(yīng)關(guān)系及可能存在的對(duì)應(yīng)關(guān)系,將這些數(shù)據(jù)預(yù)先存入類型映射表中。

    3.3 數(shù)據(jù)類型轉(zhuǎn)換方法二(利用ODBC SQL類型)
    存儲(chǔ)在數(shù)據(jù)源中的數(shù)據(jù)都有一個(gè)數(shù)據(jù)類型,稱為數(shù)據(jù)源數(shù)據(jù)類型或SQL數(shù)據(jù)類型。SQL數(shù)據(jù)類型是按照SQL-92標(biāo)準(zhǔn)由每一個(gè)DBMS定義,可以是某個(gè)數(shù)據(jù)源特有的。驅(qū)動(dòng)程序在ODBC SQL語(yǔ)法及驅(qū)動(dòng)程序數(shù)據(jù)類型中也定義了一套數(shù)據(jù)類型稱為ODBC SQL數(shù)據(jù)類型(以SQL前綴開頭的數(shù)據(jù)類型)。每個(gè)驅(qū)動(dòng)程序負(fù)責(zé)映射特定數(shù)據(jù)來源的SQL數(shù)據(jù)類型到ODBC SQL數(shù)據(jù)類型標(biāo)識(shí)符。因此,不同的數(shù)據(jù)源在進(jìn)行數(shù)據(jù)轉(zhuǎn)換的過程中可以通過ODBC SQL數(shù)據(jù)類型標(biāo)識(shí)符作為基準(zhǔn)來得到數(shù)據(jù)類型的缺省映射關(guān)系。驅(qū)動(dòng)程序通過函數(shù)SQLGetTypelnfo返回?cái)?shù)據(jù)源的SQL數(shù)據(jù)類型和ODBC SQL數(shù)據(jù)類型的映射關(guān)系,在函數(shù)SQLCo1Attributes,SQLDescribeCol和 SQLDescribeParm中,驅(qū)動(dòng)程序還用ODBC SQL數(shù)據(jù)類型來描述列和參數(shù)的數(shù)據(jù)類型。
    此外,ODBC還提供一套以SQL_C前綴開頭的ODBC C數(shù)據(jù)類型。ODBC C數(shù)據(jù)類型指出了在應(yīng)用程序中用于存儲(chǔ)數(shù)據(jù)的C緩沖區(qū)的數(shù)據(jù)類型。所有驅(qū)動(dòng)程序必須支持所有的C數(shù)據(jù)類型,而且支持所有C類型到相應(yīng)的SQL類型的轉(zhuǎn)換,并且所有的驅(qū)動(dòng)程序至少支持字符SQL類型,使得DBMS的數(shù)據(jù)類型都能映射到一種C語(yǔ)言的數(shù)據(jù)類型,這樣在傳遞過程中不會(huì)改變數(shù)據(jù)。每一個(gè)SQL數(shù)據(jù)類型與一個(gè)ODBC C數(shù)據(jù)類型相適應(yīng)。在從數(shù)據(jù)源返回?cái)?shù)據(jù)之前,驅(qū)動(dòng)程序?qū)⑺D(zhuǎn)換到指定的C數(shù)據(jù)類型。在發(fā)送數(shù)據(jù)到數(shù)據(jù)來源之前,驅(qū)動(dòng)程序?qū)⑺鼜闹付–數(shù)據(jù)類型轉(zhuǎn)換到SQL數(shù)據(jù)類型。

    4 數(shù)據(jù)轉(zhuǎn)換過程中大對(duì)象的處理
    4.1 大對(duì)象類型概述
    大對(duì)象類型BLOB全稱為Binary Large Objects,即二進(jìn)制大對(duì)象。可以把BLOB區(qū)別為三種形式:聲像數(shù)據(jù)、二進(jìn)制數(shù)據(jù)和大文本數(shù)據(jù)。因此,最常見的應(yīng)用就是存儲(chǔ)圖形、聲音等對(duì)象,此外大二進(jìn)制對(duì)象、OLE對(duì)象也可以通過BLOB類型存入數(shù)據(jù)庫(kù),如果文本對(duì)象過大,超出了文本類型的規(guī)定長(zhǎng)度,則必須用BLOB字段進(jìn)行存儲(chǔ)。我們?cè)诮?jīng)常使用的編程環(huán)境中并不能直接支持BLOB字段,因此需要調(diào)用相應(yīng)的函數(shù)完成BLOB的使用。
    不同的數(shù)據(jù)庫(kù)系統(tǒng)對(duì)大對(duì)象類型的支持不同,常用數(shù)據(jù)庫(kù)系統(tǒng)支持的大對(duì)象數(shù)據(jù)類型如表4所示:
    表4數(shù)據(jù)庫(kù)系統(tǒng)支持的大對(duì)象數(shù)據(jù)類型
    數(shù)據(jù)庫(kù)系統(tǒng) 大對(duì)象類型
    SQL SERVER "sql_variant","ntext","image","varbinary","binary","text"
    ORACLE "BLOB","LONG RAW","BFILE","RAW","CLOB","LONG"
    SYBASE "LONG VARCHAR"
    VFP "MEMO"
    ACCESS "OLE OBJECT","MEMO"
    KINGBASE "blob","text","bytea","varbinary","binary","text"

    4.2 大對(duì)象的存取方法
    1)利用MFC提供的CLongBinary類
    VC存取大對(duì)象數(shù)據(jù)有眾多方法,如OLE、ActiveX等,而VC的MFC提供的CLongBinary類可以方便地實(shí)現(xiàn)存取BLOB字段。使用CLongBinary類可以存取超過MAXINT數(shù)目的數(shù)據(jù),最大為可以得到的內(nèi)存容量。但數(shù)據(jù)完全保存在內(nèi)存中,對(duì)超大量數(shù)據(jù)消耗太大。
    2)利用ODBC的SQLGetData和SQLPutData函數(shù)
    對(duì)于不能存儲(chǔ)在單一緩沖區(qū)中的數(shù)據(jù),在行中的其他數(shù)據(jù)已被獲取之后,可以直接用SQLGetData分批從驅(qū)動(dòng)程序檢索這些數(shù)據(jù)。為了從一列檢索長(zhǎng)數(shù)據(jù),應(yīng)用程序首先調(diào)用SQLFetchScroll或SQLFetch移動(dòng)一行,并且調(diào)用SQLGetData獲取綁定列的數(shù)據(jù)。SQLPutData允許在應(yīng)用程序語(yǔ)句執(zhí)行時(shí),把參數(shù)或字段送到驅(qū)動(dòng)程序。該函數(shù)用來把字符或二進(jìn)制數(shù)值送到字符、二進(jìn)制或數(shù)據(jù)源指定類型的字段。它可以傳遞任何類型的數(shù)據(jù),但對(duì)字符和二進(jìn)制數(shù)據(jù)可傳遞部分?jǐn)?shù)據(jù)、綁定緩沖區(qū)并讓驅(qū)動(dòng)器從緩沖區(qū)中檢索數(shù)據(jù)。

    3)使用ADO存取BLOB數(shù)據(jù)
    可以使用ADO中的AppendChunk函數(shù)來存取BLOB數(shù)據(jù)。AppendChunk包含在Field對(duì)象中,原型如下:HRESULT AppendChunk (const_variant_t & Data );從函數(shù)原型中可以看到關(guān)鍵的問題是需把二進(jìn)制數(shù)據(jù)賦值給VARIANT類型的變量。對(duì)應(yīng)于保存數(shù)據(jù)時(shí)我們所使用的AppendChunk函數(shù),讀取數(shù)據(jù)應(yīng)該使用GetChunk函數(shù),GetChunk的原型如下:_variant_t GetChunk (long Length );給出數(shù)據(jù)的長(zhǎng)度后GetChunk將返回包含數(shù)據(jù)的VARIANT類型變量,然后我們可以利用SafeArrayAccessData函數(shù)得到VARIANT變量中指向數(shù)據(jù)的char *類型的指針,以方便處理。

    4.3 數(shù)據(jù)轉(zhuǎn)換過程中大對(duì)象處理方法
    在數(shù)據(jù)轉(zhuǎn)換中,首先取出源數(shù)據(jù)源的元數(shù)據(jù),判斷源數(shù)據(jù)源和目的數(shù)據(jù)源中是否存在字段為大對(duì)象的類型。對(duì)于源數(shù)據(jù)源中的每個(gè)大對(duì)象字段的數(shù)據(jù),選擇相應(yīng)的大對(duì)象讀取方法,把此大對(duì)象數(shù)據(jù)取出后保留在一個(gè)臨時(shí)文件中,然后在目的數(shù)據(jù)庫(kù)插入數(shù)據(jù),遇到大對(duì)象字段時(shí),選擇相應(yīng)的大對(duì)象存取方法,再?gòu)呐R時(shí)文件中依次讀出數(shù)據(jù)插入到指定字段中。

    posted on 2006-12-30 10:07 都市淘沙者 閱讀(295) 評(píng)論(0)  編輯  收藏 所屬分類: Oracle/Mysql/Postgres/

    主站蜘蛛池模板: 亚洲AV无码久久精品蜜桃| 亚洲色偷偷色噜噜狠狠99网| 狼群影院在线观看免费观看直播| 亚洲五月综合缴情婷婷| 亚洲AV无码一区二三区| 日韩电影免费在线观看| 亚洲精品天堂无码中文字幕| 日韩一卡2卡3卡4卡新区亚洲| 国产精品视频免费观看| 人妖系列免费网站观看| 亚洲va精品中文字幕| 亚洲国产精品狼友中文久久久| 99久久人妻精品免费一区| 羞羞视频免费观看| 亚洲精品中文字幕无码AV| 亚洲精品偷拍视频免费观看| 亚洲免费网站在线观看| fc2免费人成为视频| 精品丝袜国产自在线拍亚洲| 精品国产_亚洲人成在线高清| 全免费a级毛片免费看无码| 无码精品国产一区二区三区免费| 午夜亚洲WWW湿好爽| 亚洲一区二区三区四区视频| 亚洲欧洲精品无码AV| 免费一级毛片在线观看| 一个人免费观看在线视频www| 国产一级一毛免费黄片| 国产成人亚洲精品电影| 亚洲 暴爽 AV人人爽日日碰| 亚洲国产综合专区电影在线| 久久久久亚洲AV无码专区桃色| 毛片a级毛片免费播放100| 99精品视频在线免费观看| a级毛片免费观看在线| 久久亚洲精品无码gv| 亚洲国产日韩在线| 色播亚洲视频在线观看| 亚洲国产成人一区二区三区| 亚洲精品国产日韩无码AV永久免费网| 成人毛片免费观看视频大全|