0514-86177077
9:00-17:00(工作日)
數(shù)據(jù)轉(zhuǎn)換沖突及處理 數(shù)據(jù)轉(zhuǎn)換沖突: 在數(shù)據(jù)轉(zhuǎn)換過程中,要想實現(xiàn)嚴格的等價轉(zhuǎn)換是比較困難的。必須要確定兩種模型中所存在的各種語法和語義上的沖突,這些沖突可能包括: (1)命名沖突:源數(shù)據(jù)源的標識符可能是目的數(shù)據(jù)源中的保留字。 (2)格式?jīng)_突:同一種數(shù)據(jù)類型可能有不同的表示方法和語義差異。 (3)結(jié)構(gòu)沖突:如果兩種DBMS之間的數(shù)據(jù)定義模型不同,如為關系模型和層次模型,則需要重新定義實體屬性和聯(lián)系,以防止屬性或聯(lián)系信息的丟失。 (4)類型沖突:不同數(shù)據(jù)庫的同一種數(shù)據(jù)類型存在精度之間的差異。 (5)其他沖突:不同數(shù)據(jù)庫的大對象類型存在不同的約束,而且存在一些特殊類型。如SQL SERVER中一個表中有多于一個TEXT或IMAGE的字段時,出現(xiàn)錯誤。而ORACLE也不允許一個表中的BLOB和LONG類型多于一個。 沖突處理方法: 對于以上數(shù)據(jù)轉(zhuǎn)換中的沖突,可進行相應的沖突處理。 對于命名沖突,可以先檢查數(shù)據(jù)源中的保留字,建立保留字集合,對于保留字中的命名沖突,根據(jù)需要重新命名。 對于格式?jīng)_突,可以根據(jù)ODBC SQL類型從數(shù)據(jù)源的驅(qū)動程序中取出相對應的數(shù)據(jù)源的數(shù)據(jù)類型后,對一些特定的類型進行特殊的處理。對于字符型數(shù)據(jù)中含有“'”字符的情況,在數(shù)據(jù)轉(zhuǎn)換過程中需通過轉(zhuǎn)義符作特殊處理,否則會把它誤當作字符串分隔符。 對于不同數(shù)據(jù)庫的同一數(shù)據(jù)類型的精度沖突,類型轉(zhuǎn)換中將ODBC SQL類型和精度結(jié)合起來決定源數(shù)據(jù)類型和目標數(shù)據(jù)類型的映射關系。找出目的數(shù)據(jù)源中與源數(shù)據(jù)源類型的精度最匹配的數(shù)據(jù)類型作為缺省的映射關系。 轉(zhuǎn)換過程中的數(shù)據(jù)類型匹配,日期型數(shù)據(jù)最好先轉(zhuǎn)換成字符型,然后根據(jù)不同的目標數(shù)據(jù)源分別作不同的處理。如ORACLE中使用TO_DATE函數(shù),而FOXPRO中使用CTOD函數(shù)將日期格式的字符串轉(zhuǎn)換成日期。 對于SQL SERVER中的TEXT、IMAGE類型,在進行轉(zhuǎn)換時需要做出選擇,或者把TEXT鏡像為VARchar2(4000),或者鏡像為LONG 類型,但Long 類型一個表里只能有一個。對于ORACLE,TEXT類型可以映像為CLOB類型,而IMAGE可以鏡像為BLOB。CLOB類型可以在一個ORACLE表里有多列。 讀取數(shù)據(jù)源的元數(shù)據(jù) 數(shù)據(jù)源的元數(shù)據(jù)類型 元數(shù)據(jù)種類 元數(shù)據(jù)信息 用途 數(shù)據(jù)源連接信息 數(shù)據(jù)庫名,驅(qū)動器, 用于連接源數(shù)據(jù)源和目的數(shù)據(jù)源 服務器,DSN名, 數(shù)據(jù)源描述,用戶名等 表信息 表名,表屬主, 用于數(shù)據(jù)轉(zhuǎn)換中創(chuàng)建表 表模式,表類型 列信息 列名,類型,寬度, 用于數(shù)據(jù)轉(zhuǎn)換中表的創(chuàng)建以及列映射 精度,標度,是否為空 類型信息 類型名,最大列寬度, 用于數(shù)據(jù)轉(zhuǎn)換中表的創(chuàng)建以及類型映射 最大最小標度, 前后綴字符, 是否接受空, 關鍵字列表 鍵信息 主鍵名,主鍵列, 用于數(shù)據(jù)轉(zhuǎn)換中表模式的轉(zhuǎn)換 外鍵名,外鍵列, 外鍵關聯(lián)列 其它對象信息:索引信息,存儲過程信息,權限信息等 用于數(shù)據(jù)轉(zhuǎn)換中數(shù)據(jù)庫對象的轉(zhuǎn)換。 數(shù)據(jù)源的元數(shù)據(jù)讀取方法: ?。?)調(diào)用ODBC API函數(shù): 可以直接調(diào)用ODBC API函數(shù)讀取數(shù)據(jù)源的元數(shù)據(jù)。即分別調(diào)用以下函數(shù)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獲得數(shù)據(jù)源中的表信息,列信息,類型信息,鍵信息以及其他對象信息等。其主要步驟是連接數(shù)據(jù)源,分配語句句柄,然后調(diào)用ODBC API來獲取各種元數(shù)據(jù)信息。 然而直接調(diào)用ODBC API函數(shù)比較復雜,各種參數(shù)不易理解,且直接獲取返回的數(shù)據(jù)較困難。VC++的MFC類庫對ODBC的API進行封裝,部分簡化了ODBC調(diào)用(尤其是對數(shù)據(jù)庫記錄集的操作),但單純利用MFC類獲取異構(gòu)型數(shù)據(jù)庫的結(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ù)庫結(jié)構(gòu)信息。 ?。?)通過ADO對象: 通過ADO中CONNECTION對象的GetTableNames 方法可以得到數(shù)據(jù)源的表信息,而通過ADO中RECORDSET對象中的FieldDefs屬性可以得到數(shù)據(jù)集的各種列信息和類型信息。在得到數(shù)據(jù)源的元數(shù)據(jù)前,必須先創(chuàng)建CONNECTION對象連接數(shù)據(jù)源,并通過數(shù)據(jù)集對象RECORDSET來打開相應的數(shù)據(jù)表,之后即可以取得相應的數(shù)據(jù)源的元數(shù)據(jù)。 數(shù)據(jù)類型轉(zhuǎn)換 3異構(gòu)數(shù)據(jù)源數(shù)據(jù)類型概述: 對不同數(shù)據(jù)庫系統(tǒng),每個DBMS都定義了一套自己的數(shù)據(jù)類型,但不論數(shù)據(jù)類型在各個系統(tǒng)中如何變化,其功能都滿足用戶的數(shù)據(jù)處理基本要求,如數(shù)值型,包括整型、實型、浮點型、雙精度型等;字符型,包括定長、變長等;日期型,包括年、月、日和小時、分、秒等;長字符型,包括文本類型,還有錢幣型等。隨著數(shù)據(jù)庫系統(tǒng)的不斷發(fā)展和版本的不斷升級,數(shù)據(jù)類型的種類也不斷增多,如超文本和二進制處理多媒體和大文本的數(shù)據(jù)類型。這些帶有共性的東西,給系統(tǒng)間的數(shù)據(jù)轉(zhuǎn)換帶來了可能和方便,但不同的數(shù)據(jù)庫的數(shù)據(jù)類型也是有差異的。其自身定義和擴充之間的區(qū)別,也給系統(tǒng)間的數(shù)據(jù)轉(zhuǎn)換帶來了許多困難。例如,DBMS返回的日期和時間數(shù)據(jù)格式在各個DBMS中有很大的不同。有些系統(tǒng)以8字節(jié)整數(shù)格式返回日期和時間,另外一些以浮點數(shù)格式返回。并且有的DBMS含有LONG類型,其它DBMS無此類型。所以異種數(shù)據(jù)庫數(shù)據(jù)類型轉(zhuǎn)換的關鍵是找出其中的對應關系。 數(shù)據(jù)類型轉(zhuǎn)換方法一:(設計類型映射表) 為了實現(xiàn)相互數(shù)據(jù)轉(zhuǎn)換,必須設計多個相應的雙向數(shù)據(jù)轉(zhuǎn)換程序并且解決不同的數(shù)據(jù)類型匹配問題。當增加一個數(shù)據(jù)庫系統(tǒng)時,相應要解決該數(shù)據(jù)庫系統(tǒng)與已存在的多個異構(gòu)庫的數(shù)據(jù)類型匹配問題,并增加多個對應轉(zhuǎn)換程序。為了實現(xiàn)程序的擴展性,可以通過設計類型映射表來解決類型轉(zhuǎn)換問題。 將不同數(shù)據(jù)庫系統(tǒng)數(shù)據(jù)類型的對應關系和相應的數(shù)據(jù)轉(zhuǎn)換處理程序分離開,使數(shù)據(jù)轉(zhuǎn)換程序相對獨立,而把類型轉(zhuǎn)換關系在專門的表結(jié)構(gòu)中存儲。通過對不同數(shù)據(jù)庫系統(tǒng)之間的數(shù)據(jù)類型進行詳細而深入的分析,找出了不同數(shù)據(jù)庫系統(tǒng)不同版本的各個不同類型之間缺省的類型對應關系及可能存在的對應關系,將這些數(shù)據(jù)預先存入類型映射表中。 數(shù)據(jù)類型轉(zhuǎn)換方法二:(利用ODBC SQL類型) 存儲在數(shù)據(jù)源中的數(shù)據(jù)都有一個數(shù)據(jù)類型,稱為數(shù)據(jù)源數(shù)據(jù)類型或SQL數(shù)據(jù)類型。SQL數(shù)據(jù)類型是按照SQL-92標準由每一個DBMS定義,可以是某個數(shù)據(jù)源特有的。驅(qū)動程序在ODBC SQL語法及驅(qū)動程序數(shù)據(jù)類型中也定義了一套數(shù)據(jù)類型稱為ODBC SQL數(shù)據(jù)類型(以SQL前綴開頭的數(shù)據(jù)類型)。每個驅(qū)動程序負責映射特定數(shù)據(jù)來源的SQL數(shù)據(jù)類型到ODBC SQL數(shù)據(jù)類型標識符。因此,不同的數(shù)據(jù)源在進行數(shù)據(jù)轉(zhuǎn)換的過程中可以通過ODBC SQL數(shù)據(jù)類型標識符作為基準來得到數(shù)據(jù)類型的缺省映射關系。驅(qū)動程序通過函數(shù)SQLGetTypelnfo返回數(shù)據(jù)源的SQL數(shù)據(jù)類型和ODBC SQL數(shù)據(jù)類型的映射關系,在函數(shù)SQLCo1Attributes,SQLDescribeCol和 SQLDescribeParm中,驅(qū)動程序還用ODBC SQL數(shù)據(jù)類型來描述列和參數(shù)的數(shù)據(jù)類型。 此外,ODBC還提供一套以SQL_C前綴開頭的ODBC C數(shù)據(jù)類型。ODBC C數(shù)據(jù)類型指出了在應用程序中用于存儲數(shù)據(jù)的C緩沖區(qū)的數(shù)據(jù)類型。所有驅(qū)動程序必須支持所有的C數(shù)據(jù)類型,而且支持所有C類型到相應的SQL類型的轉(zhuǎn)換,并且所有的驅(qū)動程序至少支持字符SQL類型,使得DBMS的數(shù)據(jù)類型都能映射到一種C語言的數(shù)據(jù)類型,這樣在傳遞過程中不會改變數(shù)據(jù)。每一個SQL數(shù)據(jù)類型與一個ODBC C數(shù)據(jù)類型相適應。在從數(shù)據(jù)源返回數(shù)據(jù)之前,驅(qū)動程序?qū)⑺D(zhuǎn)換到指定的C數(shù)據(jù)類型。在發(fā)送數(shù)據(jù)到數(shù)據(jù)來源之前,驅(qū)動程序?qū)⑺鼜闹付–數(shù)據(jù)類型轉(zhuǎn)換到SQL數(shù)據(jù)類型。 數(shù)據(jù)轉(zhuǎn)換過程中大對象的處理 大對象類型概述: 大對象類型BLOB全稱為Binary Large Objects,即二進制大對象。可以把BLOB區(qū)別為三種形式:聲像數(shù)據(jù)、二進制數(shù)據(jù)和大文本數(shù)據(jù)。因此,最常見的應用就是存儲圖形、聲音等對象,此外大二進制對象、OLE對象也可以通過BLOB類型存入數(shù)據(jù)庫,如果文本對象過大,超出了文本類型的規(guī)定長度,則必須用BLOB字段進行存儲。我們在經(jīng)常使用的編程環(huán)境中并不能直接支持BLOB字段,因此需要調(diào)用相應的函數(shù)完成BLOB的使用。 不同的數(shù)據(jù)庫系統(tǒng)對大對象類型的支持不同,常用數(shù)據(jù)庫系統(tǒng)支持的大對象數(shù)據(jù)類型如表4所示: 數(shù)據(jù)庫系統(tǒng)支持的大對象數(shù)據(jù)類型: 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存取大對象數(shù)據(jù)有眾多方法,如OLE、ActiveX等,而VC的MFC提供的CLongBinary類可以方便地實現(xiàn)存取BLOB字段。使用CLongBinary類可以存取超過MAXINT數(shù)目的數(shù)據(jù),最大為可以得到的內(nèi)存容量。但數(shù)據(jù)完全保存在內(nèi)存中,對超大量數(shù)據(jù)消耗太大。 (2)利用ODBC的SQLGetData和SQLPutData函數(shù): 對于不能存儲在單一緩沖區(qū)中的數(shù)據(jù),在行中的其他數(shù)據(jù)已被獲取之后,可以直接用SQLGetData分批從驅(qū)動程序檢索這些數(shù)據(jù)。為了從一列檢索長數(shù)據(jù),應用程序首先調(diào)用SQLFetchScroll或SQLFetch移動一行,并且調(diào)用SQLGetData獲取綁定列的數(shù)據(jù)。SQLPutData允許在應用程序語句執(zhí)行時,把參數(shù)或字段送到驅(qū)動程序。該函數(shù)用來把字符或二進制數(shù)值送到。
標簽:美容院 呼和浩特 福建 珠海 天水 西寧 商洛 泉州
上一篇:SQL 提權 常用命令
下一篇:SQLServer 數(shù)據(jù)庫開發(fā)頂級技巧
Copyright ? 1999-2012 誠信 合法 規(guī)范的巨人網(wǎng)絡通訊始建于2005年
蘇ICP備15040257號-8