【轉】IBatis.Net項目資料庫SqlServer遷移至Oracle

來源:互聯網
上載者:User

標籤:

轉自: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

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。