本博客所有文章分類的總目錄:http://www.cnblogs.com/asxinyu/p/4288836.html
Newlife XCode組件相關文章目錄:http://www.cnblogs.com/asxinyu/p/4329747.html
QQ群:1600800
博客:http://nnhy.cnblogs.com
論壇:http://www.53wb.com
1.為什么要進行數據庫遷移
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
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 < 1000) return 200;
44 else if (allCount < 5000) return 500;
45 else if (allCount < 50000) return 1000;
46 else return 1500;
47 }
實現上面功能時出了點小問題,導致數據插入不了新數據庫,因為我使用的是Save(),而不是Insert(),這2個東西還是有點差別,呵呵,多調試了2個小時,最后還是石頭指出來的。
這幾篇博客都只是一個思路,從中可以看出Xcode操作數據庫的便利性和其通用性。數據庫遷移功能已經實現了最基本的功能(轉移數據庫架構和數據記錄),但運行效率,大量數據的運行情況等都需要完善。另外,有了這個思路,可以做數據庫備份,而且數據庫備份數據庫,可以導入到任何數據庫中。呵呵,想想是不是這么回事?這個功能也應該花不了多少時間。有時間繼續做做。
