IBatis.Net項目數據庫SqlServer遷移至Oracle經驗

  最近完成了一個(IBatis.Net+MVC)項目的數據庫+代碼遷移工做,可把我折騰得~~~web

  IBatis.Net是一個ORM框架,具體介紹能夠問度娘。我以前沒用ORM框架使用經驗,因此這一路我不是走來的,而是爬出一個坑又掉入另一個坑~~~sql

  項目原來用的是Sqlserver2008,如今要轉到Oracle,因此我先完成數據遷移,而後是代碼遷移。數據庫

  數據庫遷移oracle

  一、數據庫安裝與配置框架

  略過。ide

  二、表結構遷移sqlserver

      1)用PowerDesigner建立一個PhysicalDataModel,DBMS選擇Sqlserver2008;測試

      2)選擇DataBase->Connect… ,連上Sqlserver數據庫;ui

      3)選擇DataBase->Update Model from DataBase…,獲取Sqlserver數據庫的表結構和視圖,不獲取約束關係等(會影響數據導入);spa

      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)是有區別的)。

      表字段類型和長度都修改完畢後,就是表的批量建立了。

  三、數據導入

      經過Sqlserver2008的DTS進行數據導入,數據導入失敗通常有如下幾種狀況:

      1)目標表中字段類型長度不夠;

      2)表之間存在約束關係,如先在子表中導入數據,而主表又沒數據。

     DTS導入完畢後,沒有返回到上一步功能,除非導入出錯。這個太不人性化了,太不厚道了~~~

  四、主要工做已經完成,剩下就是建立序列和存儲過程的事情了。數據庫這部分基本搞定。在類型字段長度上,我返工了1次-_-有100多張表,坑啊~~~

  項目的代碼遷移

   一、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=用戶名。

   二、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沒生效?因而抱抱試試看的心態,重啓了電腦,終於老天是眷顧程序猿的~~~搞定。

   三、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$ - 1) * $PageSize$ + 1) 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上修改,很是直觀方便。     

相關文章
相關標籤/搜索