標籤:
轉自: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 |
<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檔案中的連接字串設定
?
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