转自:http://www.2cto.com/database/201312/265514.html

最近完成了一个(IBatis.Net+MVC)项目的数据库+代码迁移工作,可把我折腾得~~~

IBatis.Net是一个ORM框架,具体介绍可以问度娘。我之前没用ORM框架使用经验,所以这一路我不是走来的,而是爬出一个坑又掉入另外一个坑~~~

项目原来用的是Sqlserver2008,现在要转到Oracle,所以我先完成数据迁移,然后是代码迁移。

数据库迁移

1、数据库安装与配置

略过。

2、表结构迁移

1)用PowerDesigner创建一个PhysicalDataModel,DBMS选择Sqlserver2008;

2)选择DataBase->Connect… ,连上Sqlserver数据库;

3)选择DataBase->Update Model from DataBase…,获取Sqlserver数据库的表结构和视图,不获取约束关系等(会影响数据导入);

4)选择DataBase->Change Current DBMS…,选择new DBMS为Oracle10gR2 ;

5)修改用户,将原始dbo,修改成我们oracle的方案名(用户名)。

90%的工作PowerDesigner已经为我完成了,剩下来就是修改字段类型和长度工作了。

修改字段类型和长度的部分,主要包括:

1)将转换后的NUMBER和INTEGER类型都改成NUMBER(10)。sqlserver自增序列转化后默认是NUMBER(6),这个肯定是不够的;

2)将转化后的FLOAT类型改为NUMBER(12,2);

3)将VARCHAR2长度都增加1倍,如sqlserver中的varchar(50),在oracle中就设置为varchar2(100)(注意:varchar(50)与varchar2(50)是有区别的)。

表字段类型和长度都修改完毕后,就是表的批量创建了。

3、数据导入

通过Sqlserver2008的DTS进行数据导入,数据导入失败一般有以下几种情况:

1)目标表中字段类型长度不够;

2)表之间存在约束关系,如先在子表中导入数据,而主表又没数据。

DTS导入完毕后,没有返回到上一步功能,除非导入出错。这个太不人性化了,太不厚道了~~~

4、主要工作已经完成,剩下就是创建序列和存储过程的事情了。数据库这部分基本搞定。在类型字段长度上,我返工了1次-_-有100多张表,坑啊~~~

项目的代码迁移

1、IBatis的配置文件修改

providers.config文件中加入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<provider
name="oracleClient1.0"
description="Oracle, Microsoft provider V1.0.5000.0"
enabled="true"
assemblyName="System.Data.OracleClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.OracleClient.OracleConnection"
commandClass="System.Data.OracleClient.OracleCommand"
parameterClass="System.Data.OracleClient.OracleParameter"
parameterDbTypeClass="System.Data.OracleClient.OracleType"
parameterDbTypeProperty="OracleType"
dataAdapterClass="System.Data.OracleClient.OracleDataAdapter"
commandBuilderClass="System.Data.OracleClient.OracleCommandBuilder"
usePositionalParameters="false"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="false"
parameterPrefix=":"
allowMARS="false"
/>

注意enable="true",并设置其余的provider节点 enable=“false”。

SqlMap.config文件中的连接字符串设置

1
2
3
4
<database>
  <provider name="oracleClient1.0" />
  <dataSource name="ORCL" connectionString="Data Source=ORCL;user=用户名;password=密码"/>
</database>

这个oracleClient1.0的连接字符串找了很久,开始一直以为是USER ID=用户名。

2、Oracle客户端的安装

开始一直以为Oracle9i精简版客户端就可以搞定,结果老提示:Unable to open connection to "Oracle, Microsoft provider V1.0.5000.0"。于是下载并安装了oracle10gR2的客户端,还是不行。于是我在网上找了个ibatis.net+oracle的winform版demo,测试正常,可以确认不是配置文件和连接字符串的问题了。可将代码移植到web项目上就不行了,即使部署到IIS上并模拟32位运行(开发机是win7x64系统)也是出错。32位模式运行的时候会提示要求更高的客户端版本。难道是新安装的客户端的时候在环境变量中新增加的Path没生效?于是抱抱试试看的心态,重启了电脑,终于老天是眷顾程序猿的~~~搞定。

3、SQL语句代码修改

1)dbType=Int 都换成dbType=Number

2)遇到<等会破坏XML文件格式的符号,将其放在<![CDATA[……]]>中

3)Oracle的自增序列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<insert id="Insert" parameterClass="Account">
       <selectKey property="UserID" resultClass="int" type="pre">
         SELECT SEQ_ACCOUNT_ID.NEXTVAL AS VALUE FROM DUAL
       </selectKey>
       INSERT INTO Account (
       USERID
       ,Name
       , AccountNo
       , MobileNo
       , Password
       ) VALUES (
       #UserID#
       ,#Name,dbType=VarChar#
       , #AccountNo,dbType=VarChar#
       , #MobileNo,dbType=VarChar#
       , #Password,dbType=VarChar#
       )
     </insert>

注意:自增序列的值,上面代码段中我用的是UserId,这个要与XML中向对应,我之前都用了ID,结果踩到坑了。

1
2
3
<resultMaps>
       <resultMap id="FullResultMap" class="Account">
           <result property="UserID" column="UserID" dbType="Int"/>

4)select top的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
<select id="XXXXXXXX" parameterClass="Hashtable" resultMap="NonLobResultMap">
  SELECT * FROM (
  SELECT rownum as rn
  ,ID
  , Title
  FROM Article
  WHERE (OwnerID = #OwnerID,dbType=Number#)
  ORDER BY CreateTime DESC
  ) tb
  <![CDATA[
  where rn <= $ReturnCount$
  ]]>
</select>

5)分页的实现

1
2
3
4
5
6
7
8
9
10
11
<select id="Search" parameterClass="Hashtable" resultMap="FullResultMap">
  SELECT *
  From(
  SELECT rownum as RowNumber,Article.*
  FROM  Article
  <include refid="SearchWhere"></include>
  <![CDATA[
  order by ID DESC
  )  tb where RowNumber >=( ($PageIndex$ - 1) * $PageSize$ + 1) and RowNumber<=( $PageIndex$ * $PageSize$)
  ]]>
</select>

6)like模糊查询

1
2
3
<select id="XXX" parameterClass="Citys" resultMap="FullResultMap" extends="FindAll">
      where  (Namelike '%'|| #Name,dbType=VarChar#||'%')
    </select>

7)存储过程返回游标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<parameterMaps>
  <!-- 存储过程参数 -->
  <parameterMap id="parm_sp_XXXXXX" class="Hashtable">
    <parameter property="AAAAAA" column="IN_AAAAAA" direction="Input" />
    <parameter property="BBBBBB" column="IN_BBBBBB" direction="Input" />
    <parameter property="Result" column="OUT_REF_CUR" dbType="Cursor" direction="Output" />
  </parameterMap>
</parameterMaps>
 
<statements>
  <!-- 存储过程 -->
  <procedure id="GetXXXXXXXXXXXX" parameterMap="parm_sp_XXXXXX" resultMap="YYYYYYYYYYYYY">
    proc_存储过程名称
  </procedure>
 
</statements>

8)Oracle对字段取别名可以用as,但是对表就不能用as

9)select * ,然后增加其他字段,就需要在*前面加上表名,如t.*

10)然后把一些SQL命令改成Oracle的命令

11)SQL语句的脚本文件中,建议将存储过程、参数、序列等都用大写表示。

总结

初次接触Ibatis.Net,通过代码生成器为我们完成大部分工程,开发上确实很方便,在后期做数据库迁移的时候,工作量比传统的工厂模式或IOC少很多,修改的时候直接在对应的XML上修改,非常直观方便。

【转】IBatis.Net项目数据库SqlServer迁移至Oracle的更多相关文章

  1. IBatis.Net项目数据库SqlServer迁移至Oracle经验

    最近完成了一个(IBatis.Net+MVC)项目的数据库+代码迁移工作,可把我折腾得~~~ IBatis.Net是一个ORM框架,具体介绍可以问度娘.我之前没用ORM框架使用经验,所以这一路我不是走 ...

  2. 折腾了1周把程序从sqlserver迁移到oracle上了,每折腾一次需要耗费1周时间

    主要花费时间的事情: 1:安装配套的服务器,安装操作系统,安装数据库,配置远程访问等等,一般会耗费1天时间,甚至2天时间,若手头安装盘不齐全,需要耗费更多时间. 2:远程传输安装文件.特别是开发环境等 ...

  3. 通过Oracle sql developer从sqlserver迁移数据到oracle

    通过Oracle sql developer工具从sqlserver迁移数据到oracle 序言 一般情况下,sqlserver数据迁移到oracle,我们可以使用ODI来进行.但ODI的安装.配置. ...

  4. SQL迁移到ORACLE实例

    nohup ./command.sh > output 2>&1 & SQL迁移到ORACLE实例 日常运维中,我们经常会有数据库不同类型的迁移,比较多的就是从sql se ...

  5. SQL SERVER 2000/2005/2008数据库数据迁移到Oracle 10G细述

    最近参与的一个系统涉及到把SQL Server 2k的数据迁移到Oracle 10G这一非功能需求.特将涉及到相关步骤列举如下供大家参考: 环境及现有资源: 1.OS: Windows 7 Enter ...

  6. 将数据从MySQL迁移到Oracle的注意事项

    将数据从MySQL迁移到Oracle的注意事项1.自动增长的数据类型处理MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值.ORACLE没有自动增长的数据类型,需要建立一个自动 ...

  7. 各种主流 SQLServer 迁移到 MySQL 工具对比

          我之所以会写这篇对比文章,是因为公司新产品研发真实经历过这个痛苦过程(传统基于SQL Server开发的C/S产品转为MySQL云产品).首次需要数据转换是测试环节,当时为了快速验证新研发 ...

  8. 从 Microsoft SQL Server 迁移到 Oracle

    来源于:http://www.oracle.com/technetwork/cn/database/migration/sqlserver-095136-zhs.html Oracle SQL Dev ...

  9. SqlServer中创建Oracle连接服务器

    转自太祖元年的:http://www.cnblogs.com/jirglt/archive/2012/06/10/2544025.html参考:http://down.51cto.com/data/9 ...

随机推荐

  1. PHP生成一个六位数的邀请码

    PHP生成一个六位数的邀请码 $unique_no = substr(base_convert(md5(uniqid(md5(microtime(true)),true)), 16, 10), 0, ...

  2. 出现java.lang.NoSuchMethodError错误的原因

    作为Java开发者我们都遇到过java.lang.NoSuchMethodError错误,究其根源,是JVM的"双亲委托模型"引发的问题.如果在类路径下放置了多个不同版本的类包,如 ...

  3. mybatis报错:sql中有条件语句时出现属性没有getter的异常

    Mybatis问题:在使用条件语句动态设置SQL语句时出现如下错误 Caused by: org.apache.ibatis.reflection.ReflectionException: There ...

  4. Qt on Android 蓝牙通信开发

    版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...

  5. python 函数 练习

    # 2.写函数,接收n个数字,求这些参数数字的和. def sum_func(*args): total = 0 for i in args: total += i return total prin ...

  6. 完全数--Python

    如果一个数恰好等于它的因子之和,则称该数为“完全数” [1]  .各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数(Perfect num ...

  7. mybatis报表,动态列与查询参数+行列转换

    这是报表原型,在这张报表中,使用了动态的列与动态查询参数,动态列与动态查询参数全部使用map将参数传入 map参数: //拼接查询时间 for (String month : monthList) { ...

  8. HyperLedger Fabric 1.4 超级账本起源(5.1)

    至比特币开源以来,无数技术人员对其进行研究,并且对该系统经过了无数次改进,超级账本项目(Hyperledger)最初也是用来改善比特币的底层技术,最终由Linux基金会组织发展起来.       开放 ...

  9. hdu 1394 Minimum Inversion Number(线段树)

    参考:http://blog.sina.com.cn/s/blog_691ce2b70101ldmm.html https://blog.csdn.net/wiking__acm/article/de ...

  10. 最短路径算法 4.SPFA算法(1)

    今天所说的就是常用的解决最短路径问题最后一个算法,这个算法同样是求连通图中单源点到其他结点的最短路径,功能和Bellman-Ford算法大致相同,可以求有负权的边的图,但不能出现负回路.但是SPFA算 ...