对于异构数据库表的导入导出方法(Access与SQL Server)

      如果工作中遇到需要从SQL Server中导出一些表到Access数据库。那么可使用的方法有很多,如果只是偶尔需要导出,则可以使用SQL Server的导入导出功能。还可以使用DTS(数据传输服务)包,SQL Server 2005也可以使用SSIS。但如果这个导入导出操作需要在程序中作为一个功能操作,这就有各种方法实现了。

      这里跟大家分享一下Access与SQL Server的表导入导出操作。每个解决方案需要根据实际情况来确定是否可行。

情况1:Access中的表与SQL Server中的表架构完全相同(列的数据类型与数目一致)

          这种情况应该最为容易解决,可以将整个导入导出的操作提交给SQL Server执行,而代码量则比较少,比较容易维护:

     Access 的表 tblTest(c1,c2,c3)

     SQL     的表 tblTest(c1,c2,c3)

     代码可以这样写:

    

 

我们把访问Access数据库的操作丢给SQL Server做了,这样做的好处是代码维护简单。但要注意,代码里并没有明确指定表的列顺序,如果列的排列顺序不一样或者是列的数目不一样就需要明确指定导出那些列了。而且还有一个危险,OpenDataSource只能在32位的Windows环境下使用,如果是64位的Vista或Windows Server就不行,因为在64位的环境下SQL Server 找不到 OLEDB.Jet 这个驱动。但是如果你在代码里用OleDBConnection来链接的话则可以访问这个Access数据库(如果不能访问需打补丁)。

 

上面说的是最简单的情况,如果Access中的表与SQL Server中的表在结构上不对应怎么导出?结构不同表现为列的数据类型不同或者是列的数目不同,或者两者皆有。如果列的数据类型相似的话也是可以用Opendatasource解决的,比如 Access中使用文本类型,而SQL Server中使用varchar,nvarchar,Text类型的话SQL会进行最大可能的转换尝试,一般这些数据类型都可以成功转换。但要注意,Access中的文本类型只能存255个文字,如果SQL Server中的varchar类型保存的内容超过这个数目,就会有数据丢失的可能。所以在实际应用时要充分考虑清楚。

 

如果有些表不能直接从SQL里导出,而是需要先进行一些操作然后再导入Access,这种情况需要根据实际来确定,如果在SQL Server里能完成这些操作,就直接写SQL语句扔给SQL Server执行就可以了,如果不能,那我们可以先把要处理的数据加载到DataTable里,然后执行必要的操作,最后再根据情况看是写入SQL Server还是写入Access。例如:

 

这种情况的处理逻辑可能会根据情况复杂一些。不过总体还是容易理解的。

 

还有一种情况,如果在64位的系统上,OpenDataSource不能用,而且要导出的表也很多,部分表需要做特殊处理,那怎么办? 还有一点,就是SQL Server中的GUID在Access中表现位同步复制ID。但如果你直接导入的话就会发生类型转换错误,因为 一个GUID在SQL Server里不必用大括号“{}”包起来,而Access需要这样做。这种情况我的解决方法是一条条记录导出。但不必为每个表都写不同的导出操作,可以编写一个函数模仿Opendatasouce功能。这个方法无论是导入或导出都是相通的,而且也不必担心64位平台的问题,可以说在通用性和灵活性上都有不错的表现。下面是我写的代码:

 

我先说明一下,conAccess是Access数据库链接,AccessSchemaSQL是代表Access数据表架构的select语句,accessInsertSQL 是具体Access表的Insert语句,而selectSQL是需要导出的SQL Server表的select语句。函数的主要功能是根据Access的表架构来确定预插入Access数据表的列的数据类型和数目。这样可以做到各表通用这个函数。实际的调用代码是这样的:

 

这样做不要担心性能会比OpenDataSource差,我的实际操作是比OpenDataSource要快,而且各种不同的表都可以调用SQLToAccess函数来统一输出到Access中。但是大家要注意,SQLToAccess函数存在安全隐患,并不是很健壮,这里我就不提示了,大家讨论一下吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值