資料轉換衝突及處理
資料轉換衝突:
在資料轉換過程中,要想實現嚴格的等價轉換是比較困難的。必須要確定兩種模型中所存在的各種文法和語義上的衝突,這些衝突可能包括:
(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允許在應用程式語句執行時,把參數或欄位送到驅動程式。該函數用來把字元或位元值送到。