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

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

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

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    數據轉換中關鍵技術及難點(zhuan)

    本文介紹了數據轉換沖突及處理,讀取數據源的元數據,數據類型轉換,數據轉換過程中大對象的處理等方法,請讀者慢慢體會。

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

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

    2 讀取數據源的元數據
    2.1 數據源的元數據類型
    數據源的元數據類型如表3所示:
    表3數據源的元數據類型
    元數據種類 元數據信息 用途
    數據源連接信息 數據庫名,驅動器,服務器,DSN名,數據源描述,用戶名等 用于連接源數據源和目的數據源
    表信息 表名,表屬主,表模式,表類型 用于數據轉換中創建表
    列信息 列名,類型,寬度,精度,標度,是否為空 用于數據轉換中表的創建以及列映射
    類型信息 類型名,最大列寬度,最大最小標度,前后綴字符,是否接受空,關鍵字列表 用于數據轉換中表的創建以及類型映射
    鍵信息 主鍵名,主鍵列,外鍵名,外鍵列,外鍵關聯列 用于數據轉換中表模式的轉換
    其它對象信息 索引信息,存儲過程信息,權限信息等 用于數據轉換中數據庫對象的轉換

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

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

    3.2 數據類型轉換方法一(設計類型映射表)
    為了實現相互數據轉換,必須設計多個相應的雙向數據轉換程序并且解決不同的數據類型匹配問題。當增加一個數據庫系統時,相應要解決該數據庫系統與已存在的多個異構庫的數據類型匹配問題,并增加多個對應轉換程序。為了實現程序的擴展性,可以通過設計類型映射表來解決類型轉換問題。
    將不同數據庫系統數據類型的對應關系和相應的數據轉換處理程序分離開,使數據轉換程序相對獨立,而把類型轉換關系在專門的表結構中存儲。通過對不同數據庫系統之間的數據類型進行詳細而深入的分析,找出了不同數據庫系統不同版本的各個不同類型之間缺省的類型對應關系及可能存在的對應關系,將這些數據預先存入類型映射表中。

    3.3 數據類型轉換方法二(利用ODBC SQL類型)
    存儲在數據源中的數據都有一個數據類型,稱為數據源數據類型或SQL數據類型。SQL數據類型是按照SQL-92標準由每一個DBMS定義,可以是某個數據源特有的。驅動程序在ODBC SQL語法及驅動程序數據類型中也定義了一套數據類型稱為ODBC SQL數據類型(以SQL前綴開頭的數據類型)。每個驅動程序負責映射特定數據來源的SQL數據類型到ODBC SQL數據類型標識符。因此,不同的數據源在進行數據轉換的過程中可以通過ODBC SQL數據類型標識符作為基準來得到數據類型的缺省映射關系。驅動程序通過函數SQLGetTypelnfo返回數據源的SQL數據類型和ODBC SQL數據類型的映射關系,在函數SQLCo1Attributes,SQLDescribeCol和 SQLDescribeParm中,驅動程序還用ODBC SQL數據類型來描述列和參數的數據類型。
    此外,ODBC還提供一套以SQL_C前綴開頭的ODBC C數據類型。ODBC C數據類型指出了在應用程序中用于存儲數據的C緩沖區的數據類型。所有驅動程序必須支持所有的C數據類型,而且支持所有C類型到相應的SQL類型的轉換,并且所有的驅動程序至少支持字符SQL類型,使得DBMS的數據類型都能映射到一種C語言的數據類型,這樣在傳遞過程中不會改變數據。每一個SQL數據類型與一個ODBC C數據類型相適應。在從數據源返回數據之前,驅動程序將它轉換到指定的C數據類型。在發送數據到數據來源之前,驅動程序將它從指定C數據類型轉換到SQL數據類型。

    4 數據轉換過程中大對象的處理
    4.1 大對象類型概述
    大對象類型BLOB全稱為Binary Large Objects,即二進制大對象。可以把BLOB區別為三種形式:聲像數據、二進制數據和大文本數據。因此,最常見的應用就是存儲圖形、聲音等對象,此外大二進制對象、OLE對象也可以通過BLOB類型存入數據庫,如果文本對象過大,超出了文本類型的規定長度,則必須用BLOB字段進行存儲。我們在經常使用的編程環境中并不能直接支持BLOB字段,因此需要調用相應的函數完成BLOB的使用。
    不同的數據庫系統對大對象類型的支持不同,常用數據庫系統支持的大對象數據類型如表4所示:
    表4數據庫系統支持的大對象數據類型
    數據庫系統 大對象類型
    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 大對象的存取方法
    1)利用MFC提供的CLongBinary類
    VC存取大對象數據有眾多方法,如OLE、ActiveX等,而VC的MFC提供的CLongBinary類可以方便地實現存取BLOB字段。使用CLongBinary類可以存取超過MAXINT數目的數據,最大為可以得到的內存容量。但數據完全保存在內存中,對超大量數據消耗太大。
    2)利用ODBC的SQLGetData和SQLPutData函數
    對于不能存儲在單一緩沖區中的數據,在行中的其他數據已被獲取之后,可以直接用SQLGetData分批從驅動程序檢索這些數據。為了從一列檢索長數據,應用程序首先調用SQLFetchScroll或SQLFetch移動一行,并且調用SQLGetData獲取綁定列的數據。SQLPutData允許在應用程序語句執行時,把參數或字段送到驅動程序。該函數用來把字符或二進制數值送到字符、二進制或數據源指定類型的字段。它可以傳遞任何類型的數據,但對字符和二進制數據可傳遞部分數據、綁定緩沖區并讓驅動器從緩沖區中檢索數據。

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

    4.3 數據轉換過程中大對象處理方法
    在數據轉換中,首先取出源數據源的元數據,判斷源數據源和目的數據源中是否存在字段為大對象的類型。對于源數據源中的每個大對象字段的數據,選擇相應的大對象讀取方法,把此大對象數據取出后保留在一個臨時文件中,然后在目的數據庫插入數據,遇到大對象字段時,選擇相應的大對象存取方法,再從臨時文件中依次讀出數據插入到指定字段中。

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

    主站蜘蛛池模板: 波多野结衣免费视频观看| 18勿入网站免费永久| 一本久到久久亚洲综合| 亚洲一日韩欧美中文字幕在线| 国产成人精品免费视| 亚洲精品亚洲人成在线麻豆| 222www免费视频| 亚洲无限乱码一二三四区| 精品国产sm捆绑最大网免费站| 亚洲综合激情视频| 欧美日韩国产免费一区二区三区| 99久久婷婷国产综合亚洲| 国国内清清草原免费视频99| 亚洲精品综合在线影院| 最近的免费中文字幕视频| 亚洲综合在线一区二区三区| 免费看的一级毛片| 亚洲AV网一区二区三区| 亚洲人成网站观看在线播放| 精品97国产免费人成视频| 亚洲成a人片在线观看无码专区| 无码人妻精品中文字幕免费| 亚洲国产成人九九综合| 免费羞羞视频网站| 国产免费一级高清淫曰本片| 久久亚洲国产精品| 日韩欧美一区二区三区免费观看| 亚洲av乱码一区二区三区按摩| 亚洲成?v人片天堂网无码| 国内永久免费crm系统z在线| 亚洲一区二区三区在线| 免费看一级做a爰片久久| 国产亚洲精品免费视频播放| 中文字幕亚洲精品资源网| 成人毛片免费观看视频| selaoban在线视频免费精品| 久久精品国产亚洲av麻豆小说 | 成年在线观看网站免费| 亚洲av无码无线在线观看| 色噜噜AV亚洲色一区二区| 免费黄色网址网站|