IBatis.Net项目数据库SqlServer迁移至Oracle经验
最近完成了一个(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文件中加入
<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文件中的连接字符串设置
<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的自增序列
<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,结果踩到坑了。
<resultMaps>
<resultMap id="FullResultMap" class="Account">
<result property="UserID" column="UserID" dbType="Int"/>
4)select top的实现
<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)分页的实现
<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$ - ) * $PageSize$ + ) and RowNumber<=( $PageIndex$ * $PageSize$)
]]>
</select>
6)like模糊查询
<select id="XXX" parameterClass="Citys" resultMap="FullResultMap" extends="FindAll">
where (Namelike '%'|| #Name,dbType=VarChar#||'%')
</select>
7)存储过程返回游标
<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经验的更多相关文章
- 【转】IBatis.Net项目数据库SqlServer迁移至Oracle
转自:http://www.2cto.com/database/201312/265514.html 最近完成了一个(IBatis.Net+MVC)项目的数据库+代码迁移工作,可把我折腾得~~~ IB ...
- 折腾了1周把程序从sqlserver迁移到oracle上了,每折腾一次需要耗费1周时间
主要花费时间的事情: 1:安装配套的服务器,安装操作系统,安装数据库,配置远程访问等等,一般会耗费1天时间,甚至2天时间,若手头安装盘不齐全,需要耗费更多时间. 2:远程传输安装文件.特别是开发环境等 ...
- 通过Oracle sql developer从sqlserver迁移数据到oracle
通过Oracle sql developer工具从sqlserver迁移数据到oracle 序言 一般情况下,sqlserver数据迁移到oracle,我们可以使用ODI来进行.但ODI的安装.配置. ...
- 各种主流 SQLServer 迁移到 MySQL 工具对比
我之所以会写这篇对比文章,是因为公司新产品研发真实经历过这个痛苦过程(传统基于SQL Server开发的C/S产品转为MySQL云产品).首次需要数据转换是测试环节,当时为了快速验证新研发 ...
- SQL迁移到ORACLE实例
nohup ./command.sh > output 2>&1 & SQL迁移到ORACLE实例 日常运维中,我们经常会有数据库不同类型的迁移,比较多的就是从sql se ...
- SQL SERVER 2000/2005/2008数据库数据迁移到Oracle 10G细述
最近参与的一个系统涉及到把SQL Server 2k的数据迁移到Oracle 10G这一非功能需求.特将涉及到相关步骤列举如下供大家参考: 环境及现有资源: 1.OS: Windows 7 Enter ...
- [工具] 各种主流 SQLServer 迁移到 MySQL 工具对比
我之所以会写这篇对比文章,是因为公司新产品研发真实经历过这个痛苦过程(传统基于SQL Server开发的C/S产品转为MySQL云产品). 首次需要数据转换是测试环节,当时为了快速验证新研发云产品性能 ...
- 【数据库】各种主流 SQLServer 迁移到 MySQL 工具对比
在部署前期,首要任务就是考虑如何快速把基于 SQL Server 数据库的应用程序移植到阿里云的 MySQL 数据库.由于程序是基于 O/R mapping 编写,并且数据库中没有使用存储过程.用户函 ...
- 将数据从MySQL迁移到Oracle的注意事项
将数据从MySQL迁移到Oracle的注意事项1.自动增长的数据类型处理MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值.ORACLE没有自动增长的数据类型,需要建立一个自动 ...
随机推荐
- 深入学习jQuery事件绑定
× 目录 [1]bind [2]trigger [3]delegate[4]on[5]one 前面的话 javascript有HTML.DOM0级.DOM2级和IE这四种事件处理程序,而jQuery对 ...
- 深入理解DOM事件机制系列第一篇——事件流
× 目录 [1]历史 [2]事件冒泡 [3]事件捕获[4]事件流 前面的话 javascript操作CSS称为脚本化CSS,而javascript与HTML的交互是通过事件实现的.事件就是文档或浏览器 ...
- tn文本分析语言(四) 实现自然语言计算器
tn是desert和tan共同开发的一种用于匹配,转写和抽取文本的语言.解释器使用Python实现,代码不超过1000行. github地址:https://github.com/ferventdes ...
- 在ubuntu上面配置nginx实现反向代理和负载均衡
上一篇文章(http://www.cnblogs.com/chenxizhang/p/4684260.html),我做了一个实验,就是利用Visual Studio,基于Nancy框架,开发了一个自托 ...
- sublime3破解版sublime3注册码
Sublime Text 3 官方网址:http://www.sublimetext.com/ Mac下载地址: http://c758482.r82.cf2.rackcdn.com/Sublime% ...
- Masonry 当需要把某个控件进行隐藏的时候有警告的解决方案
//查看全文 [self.moreBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo (self.conten ...
- 把《c++ primer》读薄(4-1 c和c++数组)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. c和c++的数组和指针都属于低级的复合数据类型,比如c++的数组,类似vector容器,指针类似迭代器.低级的数据类型优势是速度 ...
- DG环境数据库RMAN备份策略制定
DG环境数据库RMAN备份策略制定: 主库(Primary) 全库备份 归档备份 删除历史文件夹 备库(Standby) 删除归档 引用说明 主库(Primary) $ crontab -l 0 1 ...
- OpenCV,计算两幅图像的单应矩阵
平面射影变换是关于其次3维矢量的一种线性变换,可以使用一个非奇异的$3 \times 3$矩阵H表示,$X' = HX$,射影变换也叫做单应(Homography).计算出两幅图像之间的单应矩阵H,那 ...
- IntelliJ IDEA 转移C盘.IntelliJIdea(索引目录)
转移原因: C盘是机械硬盘,并且容量不多的情况下,建议转移. 转移步骤: 找到索引目录 win10系统下默认路径:C:\Users\asus\.IntelliJIdea2016.2 *复制或剪切到新的 ...