XCode讀取Excel數(shù)據(jù)并適用于任何數(shù)據(jù)庫(kù)
XCode讀取Excel數(shù)據(jù)并適用于任何數(shù)據(jù)庫(kù)是本文要介紹的內(nèi)容,不多說(shuō),直接進(jìn)入話題。雖然是充血模型,雖然是強(qiáng)類型,XCode同樣支持遍歷任何數(shù)據(jù)庫(kù)結(jié)構(gòu),并以強(qiáng)類型(相對(duì)于DataSet等字典訪問(wèn))方式讀取數(shù)據(jù)。
要遍歷數(shù)據(jù)庫(kù)結(jié)構(gòu)是很容易的事情,絕大多數(shù)Orm都支持。
但是在沒有實(shí)體類的情況下以強(qiáng)類型方式讀取數(shù)據(jù),就稍微有些復(fù)雜。XCode的原理是為每張表動(dòng)態(tài)創(chuàng)建繼承自Entity<>的實(shí)體類,然后通過(guò)接口來(lái)操作實(shí)體類。
代碼中有了快速反射,雖然沒有性能損耗,但是用起來(lái)挺別扭的,這里說(shuō)明了XCode對(duì)于實(shí)體類元數(shù)據(jù)的動(dòng)態(tài)訪問(wèn)支持還不夠。
- // 添加一個(gè)連接
- DAL.AddConnStr("test", "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=Test.xls;" + "Extended Properties=Excel 8.0;", null, null);
- DAL dal = DAL.Create("test");
- // 遍歷所有表
- foreach (XTable table in dal.Tables)
- {
- Console.WriteLine("表 {0}:", table.Name);
- // 創(chuàng)建一個(gè)實(shí)體操作者,這里會(huì)為數(shù)據(jù)表動(dòng)態(tài)生成一個(gè)實(shí)體類,并使用CodeDom編譯
- IEntityOperate op = dal.CreateOperate(table.Name.Replace("$", null));
- // 因?yàn)閯?dòng)態(tài)生成代碼的缺陷,表名中的$已經(jīng)被去掉,并且Excel的查詢總必須給表名加上方括號(hào),還是因?yàn)橛?
- // 下面通過(guò)快速反射設(shè)置Meta.TableName
- Type type = op.GetType();
- type = typeof(Entity<>.Meta).MakeGenericType(type);
- PropertyInfoX.Create(type, "TableName").SetValue("[" + table.Name + "]");
- // 如果沒有記錄,跳過(guò)
- if (op.FindCount() < 1) continue;
- // 輸出表頭
- foreach (FieldItem item in op.Fields)
- {
- if (item.Name.StartsWith("F")) break;
- Console.Write("{0}\t", item.Name);
- }
- Console.WriteLine();
- // 查找所有數(shù)據(jù)
- EntityList<IEntity> list = op.FindAll();
- //DataSet ds = list.ToDataSet();
- // 輸出數(shù)據(jù)
- foreach (IEntity entity in list)
- {
- foreach (FieldItem item in op.Fields)
- {
- if (item.Name.StartsWith("F")) break;
- Console.Write("{0}\t", entity[item.Name]);
- }
- Console.WriteLine();
- }
- }
小結(jié):XCode讀取Excel數(shù)據(jù)并適用于任何數(shù)據(jù)庫(kù)的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!