数据转换冲突及转换过程中大对象的处理

数据转换冲突及处理

  数据转换冲突:


  在数据转换过程中,要想实现严格的等价转换是比较困难的。必须要确定两种模型中所存在的各种语法和语义上的冲突,这些冲突可能包括:
  (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允许在应用程序语句执行时,把参数或字段送到驱动程序。该函数用来把字符或二进制数值送到。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlalche...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中,相信很多人在sqlmap之osshell怎么使用问题上存在疑惑,小编查阅了各式资料,整理出
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册表读取等system。是mssql的最高权限db权限:文件管理,数据库操作等 users-administratorspublic权限:数据库操作 guest-users2、sql server注入执行命令查
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看实际数据库中发生了什么事情,有必要定期进行查询优化和索引否则会影响我们后期的SQL的查询速度。那么针对这样的问题我们必须要知道SQL执行的计划,在本文中winwin7小编给大家分享下SQL执
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点应用非常广泛。不过在使用中,我们会遇到非常多的错误,面对这么庞大的数据库环境,当然会有精确的错误代码的对照季,下面小编分享的
SQL Server本地账户无法登陆出现错误提示:error:40-Could not open a connenction to SQL Server的问题很常见,对于初学者来说可能不知道如何解决,一起来看看下面的解决方案。解决步骤如下:1、这种情况需要开启 SQL Server service
微软推出的SQL2008是一款非常好用的数据库软件,它稳定、功能强大,为众多企业提供了最佳的数据库解决方案,那么我们如何在Windows中安装它呢,一些朋友对SQL Server 2008的安装过程还不是很熟悉,下面就一起来看看SQL Server 2008详细安装图解...
本页概要如果您使用的是 SQL Server 2005备份和还原Sp_detach_db 和 Sp_attach_db 存储过程关于排序规则的说明导入和导出数据(在 SQL Server 数据库之间复
DBCC CHECKIDENT 检查指定表的当前标识值,如有必要,还对标识值进行更正。 语法 DBCC CHECKIDENT ( 'table_name' [ , { NORESEED
这里对 SQL Server 字符串函数进行分门别类地列出,便于查阅和记忆,相信大家都在其它方面有高深的编程基础,从字面上来说大家都知道这些函数的意义,就不对这些函数作过多的解释了,主要谈些经验,具体
查询及删除重复记录的方法 1、查找表(people)中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select*frompeoplewherepeopleIdin(selectpe
微软发SQL Server 2008第二个CTP预览版from: http://news.csdn.net/n/20070807/107158.html8月7日消息,微软公司本周发布了SQL Serv
症状当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题。SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤。本文介绍了如何解决孤立用户问题。更多信息虽然术
当登录SQL Server 2005时可能碰到错误: 'No Process is on the Other End of the Pipe'。解决方法:(1)Open up SQL
概要本文描述如何映射标准登录和集成登录来解决在运行 SQL Server 的服务器之间移动数据库时的权限问题。更多信息当您将数据库从一个运行 SQL Server 的服务器移到另一个运行 SQL Se
----------------------------------------问题:该用户与可信的SQL SERVER 连接无关联使用sa用户或自建用户使用“SQL SERVER 身份认证”连接数据
更新日期: 2007 年 5 月 20 日 使用下表可以确定各种版本的 Microsoft SQL Server 2005 支持哪些功能。有关 SQL Server 2005 Enterprise E
当从Excel导入数据到Sql Sever中,可能会出现以下问题:
对于指定的缓冲区大小而言,源列的数据太大