利用XCode 20行代碼搞定任何數據庫的遷移


      本博客所有文章分類的總目錄:http://www.cnblogs.com/asxinyu/p/4288836.html

Newlife XCode組件相關文章目錄:http://www.cnblogs.com/asxinyu/p/4329747.html

先說明一下,本文使用的Xcode不是Mac的Xcode,而且Newlife團隊開發的一個.NET開發組件。其歷史也有將近10年,因此大家不要誤會。
新生命開發團隊的相關信息:
QQ群:1600800
博客:http://nnhy.cnblogs.com
論壇:http://www.53wb.com
     前面2篇博客,使用Xcode進行了數據庫反向工程以及自動向數據庫插入測試數據的功能,其實上面的學習過程是為了今天的這個東西-數據庫遷移工具。利用昨天的測試數據,今天將利用Xcode編寫一段代碼,進行數據庫之間的轉換和遷移,不僅包括數據庫架構,同時包括數據庫中的數據記錄。下面記錄一下開發過程:

1.為什么要進行數據庫遷移

這是一個很常見的需求。現在數據庫眾多,有時候開發和部署的數據庫不一樣,或者說在軟件運行過程中,由於某些原因要換數據庫等得。對於程序員來說提到切換數據庫,可能對一部分人來說是噩夢,雖然很多工具實現了通過切換配置文件,來切換數據庫,但仍然需要建立好數據庫才行,或者利用SQL語句,先在新的數據庫平台建立數據庫。這樣程序是不變,但數據庫還是有變化,還得動手去數據庫做點東西。那么使用Xcode的目的是什么,就是利用Xcode,不用在數據庫做任何東西,包括新的數據庫,只需要改變一個配置文件即可。

2.功能要求

1.同樣是要使用Xcode,前面博客已經實現了一些數據庫操作的功能,如數據庫反向工程,插入隨機數據等。
2.不需要手動在外部數據庫平台做任何事情,只需要修改數據庫連接字符串,以及為了考慮轉換速度,設置幾個參數。
3.適用於任何2種數據庫之間的遷移轉換,據我所知,目前支持的數據庫有:MSSQL,Mysql,Oracle,Access,Sqlite,PostgreSQL,Firebird等等,當然還有接口,給你最大的自由支持其他網絡數據庫。
4.數據庫遷移包括數據庫架構(表、字段等全部信息)和所有數據記錄。
5.不需要生成實體類。 
6.下一步開發數據庫備份功能(備份數據庫架構和數據記錄),這樣備份的數據可以導入到任何數據庫中(這一點是不是也很強悍),這不是簡單的導出SQL語句,畢竟導出的SQL,數據庫之間通用性不那么高。

 

這些東西還不夠吸引你嗎?而上面的前5個功能,在Newlife.Xcode的支持下只需要短短20行代碼。呵呵,有點噓頭,當然對上千萬條數據的數據庫還要考慮性能,這里面也只稍微考慮一下。看看過程吧。

 3. 開發過程  

     首先開發思路,如果了解前2篇博客,就會很容易得到這個思路:利用Xcode獲取源數據庫的架構信息,然后利用反向工程在新數據庫平台建立數據庫(遷移架構信息),然后對每個表,獲取實體操作接口,並批量分頁獲取數據,並將這些數據插入到新的數據庫表中。很簡單,前后實現代碼20行左右。如下所示,有注釋:

View Code
 1   ///   <summary>
 2           ///  拷貝數據庫,只需要數據庫連接字符串和源數據庫即可
 3           ///   </summary>
 4           ///   <param name="originConn"> 源數據庫連接字符串 </param>
 5           ///   <param name="desConn"> 目的數據庫連接字符串 </param>
 6           ///   <param name="perCount"> 每次獲取的記錄數目,如果默認-1則會自動調用函數計算一個合理值 </param>
 7          public  static  void CopyDataBase( string originConn, string desConn, int perCount = - 1)
 8         {
 9              // 思路:通過源數據庫獲取架構信息,然后反向工程,然后導出數據            
10             DAL dal = DAL.Create(originConn);
11             List<IDataTable> tableList = dal.Tables; // 獲取源數據庫的架構信息
12             tableList.RemoveAll(t => t.IsView); // 過濾掉視圖
13               // 首先拷貝數據庫架構            
14             DAL desDal = DAL.Create(desConn); // 要在配置文件中啟用數據庫架構才行 
15             desDal.Db.CreateMetaData().SetTables(tableList.ToArray());               
16              // 然后依次拷貝每個表中的數據
17              foreach ( var item  in tableList)
18             {
19                  // 首先根據表名稱獲取當前表的實體操作接口
20                 IEntityOperate Factory = dal.CreateOperate(item.Name);
21                  // 分頁獲取數據,並更新到新的數據庫,通過更改數據庫連接來完成
22                  int allCount = Factory.FindCount ();
23                  if (perCount <  0) perCount = GetDataRowsPerConvert (allCount );
24                  int pages = ( int)Math.Ceiling (( double)(( double )allCount/( double )perCount));
25                  for ( int i =  0; i < pages ; i++)
26                 {
27                     Factory.ConnName = originConn;
28                     IEntityList modelList = Factory.FindAll( string.Empty,  string.Empty,  string.Empty, i * perCount, perCount);
29                     Factory.ConnName = desConn;
30                     modelList.Insert( true);
31                 }
32                 Console.WriteLine( " 數據庫{0} 數據轉移完成! ",item.Name );
33             }
34         }
35 
36          ///   <summary>
37           ///  根據數據表的記錄總數來設置一個合理的每次轉換數目。數據量大,一次性導出導入不合理
38           ///   </summary>
39           ///   <param name="allCount"> 數據表記錄總數 </param>
40           ///   <returns> 每次轉換的記錄數 </returns>
41          private  static  int GetDataRowsPerConvert( int allCount)
42         {
43              if (allCount <  1000return  200;
44              else  if (allCount <  5000return  500;
45              else  if (allCount <  50000return  1000;
46              else  return  1500;
47         }

    實現上面功能時出了點小問題,導致數據插入不了新數據庫,因為我使用的是Save(),而不是Insert(),這2個東西還是有點差別,呵呵,多調試了2個小時,最后還是石頭指出來的。

上面代碼我測試了一下,從MSSQL 2005 遷移到 Mysql5.1,順利完成。只測試了300條數據。也沒有出現任何錯誤。應該算是沒什么大問題,小問題的話,需要的人拿過去,修改下。這里只提供個思路,可以集成到自己的開發工具和應用軟件中去,如加一個異步處理,多線程之類的。下一步打算做數據庫備份,就是上面要求的最后一個,這個對於小型數據庫來說,還是比較容易的,關鍵是大數據庫有點難辦,希望大家也給點意見啊。
4.改進  
      這幾篇博客都只是一個思路,從中可以看出Xcode操作數據庫的便利性和其通用性。數據庫遷移功能已經實現了最基本的功能(轉移數據庫架構和數據記錄),但運行效率,大量數據的運行情況等都需要完善。另外,有了這個思路,可以做數據庫備份,而且數據庫備份數據庫,可以導入到任何數據庫中。呵呵,想想是不是這么回事?這個功能也應該花不了多少時間。有時間繼續做做。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM