標籤:
轉自: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檔案中加入
?
| 1234567891011121314151617 |
<providername="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檔案中的連接字串設定
?
| 1234 |
<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的自增序列
?
| 123456789101112131415161718 |
<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,結果踩到坑了。
?
| 123 |
<resultMaps> <resultMap id="FullResultMap" class="Account"> <result property="UserID" column="UserID" dbType="Int"/> |
4)select top的實現
?
| 12345678910111213 |
<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)分頁的實現
?
| 1234567891011 |
<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模糊查詢
?
| 123 |
<select id="XXX" parameterClass="Citys" resultMap="FullResultMap" extends="FindAll"> where (Namelike ‘%‘|| #Name,dbType=VarChar#||‘%‘) </select> |
7)預存程序返回遊標
?
| 12345678910111213141516 |
<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