数据转换冲突与处理
数据转换冲突:
在数据转换过程中,很难实现严格的等价转换,必须确定两种模型中存在的各种语法和语义冲突,其中可能包括:
(1)命名冲突:源数据源的标识符可能是目的地数据源中的保留字。
(2)格式冲突:相同的数据类型可能有不同的表示方法和语义差异。
(3)结构冲突:如果两个DBMS之间的数据定义模型不同,例如关系模型和层次模型,我们需要重新定义实体属性和关系,以防止属性或连接信息丢失。
(4)类型冲突:不同数据库的同一数据类型之间的精度差异。
(5)其他冲突:不同数据库的大对象类型有不同的约束,并且有一些特殊类型。当SQL Server中的表中有多个文本或图像时,就会出现一个错误。
冲突处理方法:
对于上述数据转换中的冲突,可以进行相应的冲突处理。
对于命名冲突,我们首先检查数据源中的保留字,设置保留字集,并根据需要重命名保留词中的命名冲突。
格式冲突,我们可以根据ODBC SQL类型从数据源驱动程序对应的数据源的数据类型,并为某些特定类型做一些特殊处理。对于字符数据包含的字符,我们需要通过数据转换过程的转义字符进行特殊处理,否则会被误认为是字符串分隔符。
针对不同数据库的精度冲突,结合ODBC SQL类型和精度,确定源数据类型与目标数据类型之间的映射关系,找出与目标数据源中源数据源类型的精度相匹配的数据类型作为缺省映射关系。
数据类型转换过程匹配,日期型数据转换为字符型是最好的,然后根据不同的目标数据源的处理方式不同。例如,在to_date函数用于在Oracle和CTOD函数用FoxPro转换日期格式字符串的日期。
在SQL Server中的文本和图像的类型,我们需要做出选择时,我们变换,或镜像文本为VARCHAR2(4000),或镜为长型,长型只能有一个内部和外部,Oracle,文本类型可以反映到CLOB类型,和图像的镜子BLOB,CLOB类型可以在Oracle表有多个列。
读取数据源的元数据
数据源的元数据类型
元数据类型元数据信息使用
数据源连接信息数据库名称、驱动器,用于连接源数据源和目的地数据源
服务器的DSN名称,
数据源描述、用户名等。
表信息表名,属于主表,用于在数据转换中创建表。
表类型、表类型
用于在数据转换和列映射中创建表的列名、类型和宽度
准确度,刻度,或不
类型信息类型名称、最大列宽度、用于数据转换表创建和类型映射
最大最小尺度,
前缀字符,
是否接受空,
关键词列表
在数据转换中转换表模式的关键信息主键名称、主键列
外键名,外键列,
外键关联列
其他对象信息:索引信息、存储过程信息、权限信息等,用于在数据转换中对数据库对象进行转换。
数据源元数据读取方法:
(1)调用ODBC API函数:
你可以直接调用ODBC API函数读取数据源的元数据,即调用以下功能:SQL表,SQL列,SQL describecol,SQL得到TypeInfo、SQL外键,SQLPrimary Keys,procedurecolumns SQL,SQL程序,SQL统计,SQL tableprivileges,SQL列权限数据源中的信息,得到一个表的分类信息,类型信息,关键信息和其他对象的信息等。主要步骤是连接数据源,分配语句句柄,然后调用ODBC API来获取各种元数据信息。
然而,直接调用ODBC API函数比较复杂,参数不易理解,很难直接得到返回的数据。包VC++的MFC库的ODBC API、ODBC调用简化(特别是数据库的记录集,但操作简单结构)利用MFC类获得一个异构数据库仍然是很困难的,所以你需要调用ODBC API MFC和直接相结合的方法,在MFC CRecordset类的部分成员函数重载与ODBC接口函数和类ctable、CColumns、CTypes、CPrimaryKeys等创建。使用这些新创建的类,异构数据库结构信息可以很容易地获得。
(2)通过ADO对象:
通过对ADO连接对象的gettablenames方法,数据源表的信息可以得到,和各种各样的栏目信息和数据集的类型信息可以通过fielddefs在ADO的Recordset对象的属性,在数据源的元数据,我们必须先创建连接对象连接数据源,通过数据集对象的记录集打开相应的数据表,并得到相应的数据源的元数据。
数据类型转换
3异构数据源数据类型综述:
对不同数据库系统,每个DBMS定义了一套自己的数据类型,但不管如何在各系统中的数据类型的变化,其功能可以满足用户的数据处理要求,如数值类型,包括整数、房、双精度浮点型,等等;性格,包括长度、可变长度;日期,月,日和年,包括小时、分钟、秒;长的字符,包括文本型、钱币型等。随着数据库系统的不断发展和版本升级,数据类型也越来越多,如超文本和二进制处理、多媒体和大文本数据类型的这些共同的东西。系统间的数据转换是可能的,方便,但数据类型PES不同的数据库也不同。自己定义和扩展之间的差异也在系统之间的数据转换带来许多困难。例如,日期和时间格式的数据返回数据库在每个DBMS非常不同。有些系统返回的日期和时间格式的8字节的整数,而浮点格式回别人。和一些数据库包含长型,和其他的数据库系统没有这种类型的。所以对异种数据库的数据类型转换的关键是找出对应关系。
数据类型转换方法1:(设计类型映射表)
为了实现相互之间的数据转换,需要设计一些相应的双向数据转换程序和解决不同数据类型的匹配问题。添加一个数据库系统时,我们应该解决的数据库系统和现有的异构库之间的数据类型的匹配问题,并添加多个相应的转换程序。为了实现程序的可扩展性,类型转换问题可以通过类型映射表的设计解决了。
不同的数据库系统和相应的数据转换处理程序数据类型之间的对应关系是分离的,所以数据转换程序是相对独立的,和类型转换关系存储在特殊的表结构,详细和深入的基于不同数据库之间的数据的系统分析,从中找到的违约和可能的不同类型之间的不同的版本,不同的数据库系统之间的通信类型之间的对应关系,将这些数据存储在映射表式。
数据类型转换方法二:(使用ODBC SQL类型)
存储在数据源中的数据有一个数据类型,称为数据源类型或SQL数据类型的SQL数据类型是根据SQL-92标准由每个DBMS定义,可以具体到一个数据源。司机还定义了一组在ODBC SQL语法和驱动器的数据类型数据类型,称为ODBC SQL数据类型(数据类型SQL前缀开头)。每个司机负责映射特定数据源ODBC SQL数据类型标识符的SQL数据类型。因此,不同的数据源可以通过ODBC SQL数据类型标识符作为基准数据类型的默认映射关系的司机。返回数据源通过功能sqlgettypelnfo SQL数据类型和SQL数据类型的映射关系N的函数,sqldescribecol和sqlco1attributes SQLDescribeParm之间,驱动ODBC是用来描述SQL数据类型的列和参数的数据类型。
此外,还提供了一套ODBC ODBC C数据类型与sql_c前缀开始。ODBC C数据类型表示C缓冲区用于在应用程序中存储数据的数据类型。所有的司机都必须支持所有的C数据类型,并支持相应的SQL类型转换所有类型C,和所有的司机至少支持SQL字符型,DBMS数据类型可以映射到C的数据类型,这个数据不会在传输过程中的变化。每个SQL数据类型适应ODBC C数据类型。之前的数据从数据源返回,司机将其转换为指定的C数据类型。在发送数据到数据源的驱动程序,将它从指定的C数据类型的SQL数据类型。
数据转换过程中大对象的处理
大对象类型概述:
大对象类型的斑点被称为二进制大对象,即二进制大object.blob可以区分为三种形式:声音、图像数据、二进制数据和大文本数据。因此,最常见的应用是存储对象,如图形、声音和其他对象。此外,大型二进制对象和OLE对象也可以通过数据库类型存储在数据库中。如果文本对象太大,超过了文本类型的指定长度,则必须将其存储在内存字段中。
不同的数据库系统对大型对象类型有不同的支持,数据库系统通常使用的大型对象数据类型如表4所示。
数据库系统支持的大对象数据类型:
SQL Serversql_variant

SybaseLONG VARCHAR
VFP备忘录
访问OLE对象
KingBase滴
大型对象的访问方法:
(1)利用MFC CLongBinary类:
VC访问大型对象数据有许多方法,如OLE、ActiveX等,和VC的MFC提供的CLongBinary类可以很容易地访问BLOB字段。的CLongBinary类的使用可以访问的数据的数量超过最大整数值,可用内存容量的最大量。但数据完全存储在内存中,过多的消耗大量的数据。
(2)利用ODBC和sqlputdata SQLGetData函数:
对于无法存储在一个行缓冲和其他数据的数据已经被获得,它可以从分批SQLGetData司机收回。为了获取一列长的数据,应用程序首先调用SQLFetch SQLFetchScroll或移动一行,并调用SQLGetData获取绑定的column.sqlputdata数据允许参数或字段被发送到驱动程序当程序语句执行。此功能用于发送字符或二进制值。