程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> 數據轉換沖突及轉換過程中大對象的處理

數據轉換沖突及轉換過程中大對象的處理

編輯:更多數據庫知識

數據轉換沖突及處理
  數據轉換沖突:
  在數據轉換過程中,要想實現嚴格的等價轉換是比較困難的。必須要確定兩種模型中所存在的各種語法和語義上的沖突,這些沖突可能包括:
  (1)命名沖突:源數據源的標識符可能是目的數據源中的保留字。
  (2)格式沖突:同一種數據類型可能有不同的表示方法和語義差異。
  (3)結構沖突:如果兩種DBMS之間的數據定義模型不同,如為關系模型和層次模型,則需要重新定義實體屬性和聯系,以防止屬性或聯系信息的丟失。
  (4)類型沖突:不同數據庫的同一種數據類型存在精度之間的差異。
  (5)其他沖突:不同數據庫的大對象類型存在不同的約束,而且存在一些特殊類型。如SQL SERVER中一個表中有多於一個TEXT或IMAGE的字段時,出現錯誤。而ORACLE也不允許一個表中的BLOB和LONG類型多於一個。
  沖突處理方法:
  對於以上數據轉換中的沖突,可進行相應的沖突處理。
  對於命名沖突,可以先檢查數據源中的保留字,建立保留字集合,對於保留字中的命名沖突,根據需要重新命名。
  對於格式沖突,可以根據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表裡有多列。
  讀取數據源的元數據
  數據源的元數據類型
  元數據種類 元數據信息 用途
  數據源連接信息 數據庫名,驅動器, 用於連接源數據源和目的數據源
  服務器,DSN名,
  數據源描述,用戶名等
  表信息 表名,表屬主, 用於數據轉換中創建表
  表模式,表類型
  列信息 列名,類型,寬度, 用於數據轉換中表的創建以及列映射
  精度,標度,是否為空
  類型信息 類型名,最大列寬度, 用於數據轉換中表的創建以及類型映射
  最大最小標度,
  前後綴字符,
  是否接受空,
  關鍵字列表
  鍵信息 主鍵名,主鍵列, 用於數據轉換中表模式的轉換
  外鍵名,外鍵列,
  外鍵關聯列
  其它對象信息:索引信息,存儲過程信息,權限信息等 用於數據轉換中數據庫對象的轉換。
  數據源的元數據讀取方法:
  (1)調用ODBC API函數:
  可以直接調用ODBC API函數讀取數據源的元數據。即分別調用以下函數SQL Tables,SQL Columns, SQL DescribeCol,SQL Get TypeInfo,SQL Foreign Keys,SQLPrimary Keys,SQL ProcedureColumns,SQL Procedures, SQL Statistics,SQL TablePrivileges,SQL Column Privileges獲得數據源中的表信息,列信息,類型信息,鍵信息以及其他對象信息等。其主要步驟是連接數據源,分配語句句柄,然後調用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異構數據源數據類型概述:
  對不同數據庫系統,每個DBMS都定義了一套自己的數據類型,但不論數據類型在各個系統中如何變化,其功能都滿足用戶的數據處理基本要求,如數值型,包括整型、實型、浮點型、雙精度型等;字符型,包括定長、變長等;日期型,包括年、月、日和小時、分、秒等;長字符型,包括文本類型,還有錢幣型等。隨著數據庫系統的不斷發展和版本的不斷升級,數據類型的種類也不斷增多,如超文本和二進制處理多媒體和大文本的數據類型。這些帶有共性的東西,給系統間的數據轉換帶來了可能和方便,但不同的數據庫的數據類型也是有差異的。其自身定義和擴充之間的區別,也給系統間的數據轉換帶來了許多困難。例如,DBMS返回的日期和時間數據格式在各個DBMS中有很大的不同。有些系統以8字節整數格式返回日期和時間,另外一些以浮點數格式返回。並且有的DBMS含有LONG類型,其它DBMS無此類型。所以異種數據庫數據類型轉換的關鍵是找出其中的對應關系。
  數據類型轉換方法一:(設計類型映射表)
  為了實現相互數據轉換,必須設計多個相應的雙向數據轉換程序並且解決不同的數據類型匹配問題。當增加一個數據庫系統時,相應要解決該數據庫系統與已存在的多個異構庫的數據類型匹配問題,並增加多個對應轉換程序。為了實現程序的擴展性,可以通過設計類型映射表來解決類型轉換問題。
  將不同數據庫系統數據類型的對應關系和相應的數據轉換處理程序分離開,使數據轉換程序相對獨立,而把類型轉換關系在專門的表結構中存儲。通過對不同數據庫系統之間的數據類型進行詳細而深入的分析,找出了不同數據庫系統不同版本的各個不同類型之間缺省的類型對應關系及可能存在的對應關系,將這些數據預先存入類型映射表中。
  數據類型轉換方法二:(利用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數據類型。
  數據轉換過程中大對象的處理
  大對象類型概述:
  大對象類型BLOB全稱為Binary Large Objects,即二進制大對象。可以把BLOB區別為三種形式:聲像數據、二進制數據和大文本數據。因此,最常見的應用就是存儲圖形、聲音等對象,此外大二進制對象、OLE對象也可以通過BLOB類型存入數據庫,如果文本對象過大,超出了文本類型的規定長度,則必須用BLOB字段進行存儲。我們在經常使用的編程環境中並不能直接支持BLOB字段,因此需要調用相應的函數完成BLOB的使用。
  不同的數據庫系統對大對象類型的支持不同,常用數據庫系統支持的大對象數據類型如表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"
  大對象的存取方法:
  (1)利用MFC提供的CLongBinary類:
  VC存取大對象數據有眾多方法,如OLE、ActiveX等,而VC的MFC提供的CLongBinary類可以方便地實現存取BLOB字段。使用CLongBinary類可以存取超過MAXINT數目的數據,最大為可以得到的內存容量。但數據完全保存在內存中,對超大量數據消耗太大。
  (2)利用ODBC的SQLGetData和SQLPutData函數:
  對於不能存儲在單一緩沖區中的數據,在行中的其他數據已被獲取之後,可以直接用SQLGetData分批從驅動程序檢索這些數據。為了從一列檢索長數據,應用程序首先調用SQLFetchScroll或SQLFetch移動一行,並且調用SQLGetData獲取綁定列的數據。SQLPutData允許在應用程序語句執行時,把參數或字段送到驅動程序。該函數用來把字符或二進制數值送到。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved