本博客所有文章分類的總目錄:http://www.cnblogs.com/asxinyu/p/4288836.html
Newlife XCode組件相關文章目錄:http://www.cnblogs.com/asxinyu/p/4329747.html
上一篇介紹了Xcode的數據庫反向工程的相關知識后,今天正好使用Xcode向數據庫插入隨機數據,特地記下,方便后來學習的人。
有關Xcode的基礎使用知識,還請大家自行到開源的網站和論壇去,也可以在論壇提問。下面進入正題:
1、為什么要向數據庫隨機插入數據
今天寫程序,用昨天的數據庫反向工程生成了數據庫,但是里面沒有數據,又懶得動手去手動插入。想寫一個程序隨機插入測試數據,當然寫之前又在群里面喊了一下,看有沒有人已經做過,可是一群友說,原話不記得了,反正意思就是說:"這么簡單還來問,自己For一個不就行了"。當然這個群友說得沒錯,但是說實話 這個想法太幼稚了點,一個程序員或者開發人員每次想到問題,不是去抽象,不是盡量去做得通用點,每次都重復的For,那也太悲催了。雖然我不是很專業開發人員,但是我還是想寫一個通用點的程序,來方便的插入隨機數據,而不是每一次,每一個表都去For。
2.功能要求
1.使用Xcode,強大就不用說了,可以完全屏蔽數據庫的差異,而且也很容易對數據庫架構信息進行操作 ;
2.要求只需要 ”使用數據庫連接字符串“,和插入數據條數,就可以進行數據插入,不需要實體類,當然你的數據庫已經存在了(不存在就先設計好,或者說反向工程建好);
3.要求更加字段類型和長度,隨機插入對應類型的數據
3.開發過程
其實上面要求挺簡單的,可能大家認為主要對第2個要求比較難,因為只需要數據庫連接字符串和數據庫就來進行,當然需要Xcode.下面直接貼代碼吧,代碼里面有注釋:
按照大石頭提出的意見,對程序進行了修改:

2 /// 隨機填充指定數據庫連接字符串中的所有表
3 /// </summary>
4 /// <param name="connStr"> 數據庫連接字符串 </param>
5 /// <param name="needCount"> 填充的記錄數目 </param>
6 public static void FillDataForDb( string connStr, int needCount = 50)
7 {
8 DAL dal = DAL.Create(connStr); // 根據數據庫連接字符串創建數據訪問對象
9 List<IDataTable> tableList = dal.Tables; // 獲取數據庫的所有表和架構信息
10 tableList.RemoveAll(t => t.IsView); // 過濾掉視圖
11 foreach ( var item in tableList)
12 {
13 // 首先根據表名稱獲取當前表的實體操作接口
14 IEntityOperate entity = dal.CreateOperate(item.Name);
15 for ( int i = 0; i < NeedCount; i++)
16 {
17 IEntity model = entity.Create(); // 創建數據實體接口
18 FieldItem[] filds = entity.Fields; // 獲取所有的字段信息
19 foreach ( var fild in entity.Fields)
20 {
21 if (!fild.IsIdentity)
22 model.SetItem(fild.Name, GetRandomValue(fild));
23 }
24 model.Save(); // 保存數據
25 }
26 }
27 }
詳細的不解釋了,有什么問題,大家到論壇去提問,論壇地址在后面。主要一個說明的是有一個GetRandomValue(FieldItem fild) 函數,它會根據字段信息來獲取對應類型的隨機值,這段代碼比較簡陋,先貼出來吧,感覺應該有更簡單的方法去操作,希望知道的人提醒一下。【果然,本來開始用Switch的,結果不支持Type,原來是自己用錯了,大石頭提出來,呵呵,我順便更新了。

2 /// 根據字段類型和長度獲取對應類型的隨機數據
3 /// </summary>
4 /// <param name="fild"> 字段對象 </param>
5 /// <returns> 對應的隨機數據 </returns>
6 public static object GetRandomValue(FieldItem fild)
7 {
8 switch (Type.GetTypeCode(fild.Field.DataType))
9 {
10 case TypeCode.Boolean: return RandomHelper.GetRandomBool();
11 case TypeCode.Byte: return RandomHelper.GetRandomByte();
12 case TypeCode.Char: return RandomHelper.GetRandomChar();
13 case TypeCode.DateTime: return RandomHelper.GetRandomDateTime();
14 case TypeCode.Decimal: return RandomHelper.GetRandomDouble( 0, NeedCount* 10.1);
15 case TypeCode.Double: return RandomHelper.GetRandomDouble( 0, NeedCount* 10.1);
16 case TypeCode.Int16: return RandomHelper.GetRandomInt( 1,UInt16.MaxValue );
17 case TypeCode.Int32: return RandomHelper.GetRandomInt( 1,NeedCount * 50);
18 case TypeCode.Int64: return RandomHelper.GetRandomInt( 1,NeedCount* 100);
19 case TypeCode.SByte: return RandomHelper.GetRandomInt( 1, 127);
20 case TypeCode.Single: return RandomHelper.GetRandomDouble( 0, NeedCount* 10.1);
21 case TypeCode.String: return RandomHelper.GetRandomString(( int )(fild.Length*RandomHelper.GetRandomDouble ( 0.2, 0.7)));
22 case TypeCode.UInt16: return RandomHelper.GetRandomInt( 1,UInt16.MaxValue );
23 case TypeCode.UInt32: return RandomHelper.GetRandomInt( 1,NeedCount * 50);
24 case TypeCode.UInt64: return RandomHelper.GetRandomInt( 1,NeedCount* 100);
25 default:
26 return string.Empty;
27 }
RandomHelper這個常用類大家都有,也比較簡單,就不貼了,就是這個思路。
4.改進
如果說改進,那就是要是能夠插入一些更人性化的數據就好了,呵呵,以后再考慮。寫起來很簡單,當然也要Xcode的支持。下面是相關網址,大家去看看:附上大石頭的博客和Xcode開源網址:
技術支持QQ群:1600800