資料轉換衝突及轉換過程中大物件的處理

idba發表於2008-06-04

資料轉換衝突:

在資料轉換過程中,要想實現嚴格的等價轉換是比較困難的。必須要確定兩種模型中所存在的各種語法和語義上的衝突,這些衝突可能包括:

(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允許在應用程式語句執行時,把引數或欄位送到驅動程式。該函式用來把字元或二進位制數值送到。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1384/viewspace-332321/,如需轉載,請註明出處,否則將追究法律責任。

相關文章