MySoft组件之MySoft.Data更新日志
MySoft ORM組件
新版組件與之前版本不兼容,實體需要重新生成 
鑒于功能的擴展,某些類重構過,方法也有所變動,使用方法基本保持與之前一致 
生成工具可以直接生成對應的實體類,而不再需要新建一個項目 
原有的方式仍然保留,為了方便設計自定義接口 
版本號:1.6.0
1. MySoft.Data批處理和事務處理。
2. 將Trans更名為DbTrans,BeginTran方法更名為BeginTrans,新增DbBatch類。
??? public void AddMessages(Message[] msgs) 
??? { 
??????? //使用批處理 
??????? DbBatch batch = DbSession.Default.BeginBatch(); 
??????? for (int index = 0; index < msgs.Length; index++) 
??????? { 
??????????? batch.Save(msgs[index]); 
??????? } 
??????? batch.Process(); 
??????? //使用帶事務批處理 
??????? DbTrans tran = DbSession.Default.BeginTrans(); 
??????? DbBatch batch1 = tran.BeginBatch(); 
??????? for (int index = 0; index < msgs.Length; index++) 
??????? { 
??????????? batch1.Save(msgs[index]); 
??????? } 
??????? batch1.Process(); 
??????? tran.Commit(); 
??????? //使用單條處理 
??????? for (int index = 0; index < msgs.Length; index++) 
??????? { 
??????????? DbSession.Default.Save(msgs[index]); 
??????? } 
??????? //使用帶事務單條處理 
??????? DbTrans tran1 = DbSession.Default.BeginTrans(); 
??????? for (int index = 0; index < msgs.Length; index++) 
??????? { 
??????????? tran1.Save(msgs[index]); 
??????? } 
??????? tran1.Commit(); 
??? } 
版本號:1.7.6
??? 新增IDataPage類,通過此類來支持HtmlPager操作 
??? 使用如下: 
??? IDataPage<Message[]> msgInfo = new DataPage<Message[]>(5); 
??? msgInfo.RowCount = 15; 
??? msgInfo.DataSource = null; 
??? string linkFormat = "javascript:gotoPage($PageIndex);"; 
??? HtmlPager pager = new HtmlPager(msgInfo, linkFormat, 5); 
??? pager.NextPageTitle = "Next Page"; 
??? pager.PrevPageTitle = "Prev Page"; 
??? pageHtml = pager.ToString(); 
版本號:1.7.8
1. MySoft.Data修正Entity在Remoting中系列化的問題
2. 修正了OrderByClip和WhereClip在Remoting中生成sql不正確的問題
版本號:1.8.0.0
??? 修正了條件查詢時值存在’符號產生的錯誤!
版本號:2.0
1.MySoft.Data中新增了子查詢功能SubQuery操作 
??? DbSession.Default.From<Message>().SubQuery().Select(Message._.ID, Message._.PostTime.Max()).GroupBy(Message._.ID.GroupBy).ToArray(); 
??? 生成的SQL語句如下: 
??? select Message.id,max(Message.posttime) as posttime from(select *from Message) as Message 
??? DbSession.Default.From<Message>().SubQuery("c").Select(Message._.ID.At("c"), Message._.PostTime.At("c").Max()).GroupBy(Message._.ID.At("c").GroupBy).ToArray(); 
??? 生成的SQL語句如下: 
??? select c.id,max(c.posttime) as posttime from(select *from Message) as c 
??? group by c.id 
2.MySoft.Data中修正了枚舉類型從數據庫讀取后轉換的問題
版本號:2.1.0
??? ORM新增內存查詢功能 
??? MemoryFrom<Message> query = DbSession.Default.From<Message>().ToMemory();? //獲取主鍵為1的Message信息 
??? Message msg = query.Get(1);? //獲取ID為1,2,3的數組 
??? Message[] msgs1 = query.Where(Message._.ID.In(1,2,3)).ToArray(); 
??? //獲取按分頁,每頁10條中的第3頁,Message._.ID是必須的,可以指定為任意列 
??? Message[] msgs2 = query.GetPage(Message._.ID,10).ToArray(3); 
??? bool exist = query.Exists(Message._.ID == 1); 
??? object obj = query.Where(Message._.ID == 1).Sum(Message._.ID); 
版本號:2.1.5
1.新增Union操作及分頁處理,進行Union操作的實體同樣可以進行分頁操作
2.修正關聯實體對于多關聯在Access中的出錯的bug
3.全面修正Access中分頁查詢的bug
4.修正Join操作中如果用別名,不選擇字段出現表名不正確的bug
5.修改EntityDisign中對關聯實體中的字段名與屬性名不對應的問題 
? 如設計的字段名為{ID},但無法找到此屬性名或ID沒有用{}括起來,則會報錯。 
6.修正Oracle、MySql、SQLite、FireBird獲取插入數據后獲取當前記錄號不正確的bug 
版本號:2.2.5
1.修正了在項目開發中一些不經常出現的bug
2.批處理中加入返回錯誤列表
3.增加了自定義表名的處理,很多情況下,表需要做分表處理,以往單一表名的定義 
??? 已經不能適應這種情況的處理,所以需要傳入表名以操作某一特定的表 
??? 下面功能將user實體保存到表UserTest 
??? DbSession.Default.Save<User>(new Table("UserTest"),user); 
中間過度版本2.4.0,以下更新將與之前版本不兼容 
...... 
版本號:2.5.0
1.增加了增、刪、改、查創建器 
??? QueryCreater??? 查詢創建器 
??? InsertCreator??? 插入創建器 
??? UpdateCreator??? 修改創建器 
??? DeleteCreator??? 刪除創建器 
2.支持不帶泛型的數據庫查詢方式。 
??? QueryCreator q = QueryCreator.NewCreator() 
??????? .From("user") 
??????? .AddField("userid") 
??????? .AddField("username") 
??????? .AddWhere("groupid",1); 
??? DbSession.Default.From(q).ToTable(); 
??? DbSession.Default.From(q).ToList<T>(); 
??? DbSession.Default.From(q).ToListPage<T>(); 
3.完美支持Oracle,FireBird,SQLite
4.可以生成不帶屬性變更的方法,需設置EntityDesignConfig.xml 
??? EnabledPropertyValueChange 為true,則生成,反之不生成 
??? 對于多線程操作時,可以選擇不生成OnPropertyValueChange方法,可以提高性能
版本號:2.5.6
1.修正了多個主鍵時使用Get(params object[] pkValues) 會出錯的bug;
2.修正了使用Oracle驅動時間格式不是yyyy-MM-dd HH:mm:ss時,查詢數據出錯的bug;
3.新增新的分布類方式獲取數據,如: 
??? 系統已經有一個User實體 
??? public partial class User { 
??????? public int UserID { get;set;} 
??????? public string UserName {get;set;} 
??? } 
??? 現在為User擴展一個屬性 
??? public partial class User { 
??????? public string GroupName {get; private set;} //對外只讀 
??????? protected override void SetExtValues(ISourceReader reader) 
??????????? { 
??????????????? if (false == reader.IsDBNull("GroupName")) 
??????????????? { 
??????????????????? this.GroupName = reader.GetString("GroupName"); 
??????????????? } 
??????????? } 
??????? } 
??? DbSession.Default.From<User>().LeftJoin<Group>(User._.GroupID == Group._.GroupID) 
??? .Select(User._.All,Group._.GroupName).ToList(); 
??? 這樣User就擁有GroupName屬性了,而不需要重新設計一個實體 
??? 而且多出的屬性不會影響到新增與修改操作 
版本號:2.5.8
1.增加了ISourceList類,實現了對數據進行分組的功能 
??? ISourceList source = new SourceList(IList<User> list); 
??? source.ToDictionary<int>(User._.GroupID); 
??? 或 
??? source.ToDictionary<int>("GroupID"); 
??? IArrayList 接口還有若干其它方法 
2.強化了內存查詢方式 
??? ISourceList source = new SourceList(IList<User> list); 
??? MemoryFrom<User> mf = source.ToMemory(); 
??? 或 
??? MemoryFrom<User> mf = DbSession.Default.From<User>().ToMemory(); 
??? mf.Where(User._.UserID == 1).ToSingle(); 
??? mf.Where(User._.GroupID == 1).OrderBy(User._.AddTime.Desc).ToList(); 
??? //獲取第2頁,每頁2條 
??? mf.Where(User._.GroupID == 1).GetPage(2).ToList(2); 
3.將DataPage修改成DataPage以免與System.Data.DataPage沖突 
? 將ToDataView()方法改為ToListPage() 
版本號:2.6.0
1.將WhereClip的生成參數化,徹底解決sql注入的問題
2.強化了QueryCreator的功能 
??? QueryCreator q = QueryCreator.NewCreator() 
??????? .From<User>() 
??????? .Join<Group>(User._.GroupID == Group._.GroupID) 
??????? .AddField(User._.All) 
??????? .AddField(Group._.GroupName); 
??? 或 
??? QueryCreator q = QueryCreator.NewCreator() 
??????? .From("user") 
??????? .Join("group","user.groupid = group.groupid") 
??????? .AddField("user","*") 
??????? .AddField("group","groupname"); 
??? DbSession.Default.From(q).ToList<User>(); 
??? DbSession.Default.From(q).ToTable(); 
3.支持表前綴的后期設置 
??? 在web項目中添加一個EntityConfig.xml方法,配置如下 
??? <?xml version="1.0" encoding="utf-8" ?> 
??? <ArrayOfPrefixSetting xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
????????? <PrefixSetting Name="Default" Value="tb_" /> 
????????? <PrefixSetting Name="EntityNamespace" Value="tb_" /> 
??? </ArrayOfPrefixSetting> 
??? Default:如未設置EntityNamespace,則默認使用此前綴 
??? EntityNamespace: 實體程序集命名空間,如Simple.Entity 
??? EntityNamespace可以多個,這樣不同的命令空間可以使用不同的前綴 
??? 方便解決多個應用程序使用同一數據的問題 
版本號:2.6.5
1.修正了復雜條件使用參數化時產生的bug,比如子查詢 In(Query),Union聯合查詢
2.新增MySql驅動,需要加載MySql.Data.dll
3.新增數據類型IArrayList<T> ISourceList<T> ISourceTable,ISourceReader 
??? 使用以上幾種類型可以大大加強返回的數據可操作性 
??? ISourceReader接口實現了按fieldName,Field來獲取數據 
??? IArrayList實現了ToArray方法 
??? ISourceList實現了數據轉換ConvertTo方法,ToGroup方法及ToMemory方法 
??? ISourceTable實現了ToList<T>方法及ToMemory方法 
??? Get<T>()方法更改為Single<T>()方法,返回單一實體 
??? ToFirst()方法更改為ToSingle()方法 
??? ToList方法不變,但返回類型為ISourceList 
??? ToDataTable方法更改為ToTable,返回類型為ISourceTable 
??? ToDataReader方法更改為ToReader,返回類型為ISourceReader 
4.新增接口編程方法,可以對應用程序進行解耦,使用如下: 
??? public interface IUser { 
??????? UserID { get;set;} 
??????? UserName {get;set;} 
??? } 
??? public class User : IUser { 
??????? public int UserID { get;set;} 
??????? public string UserName {get;set;} 
??? } 
??? 以下ToList()返回類型ISourceList<T>,可以使用ConvertTo<T>方法進行數據的轉換輸出 
??? IList<IUser> list = DbSession.Default.From<User>().ToList().ConvertTo<IUser>(); 
??? DbSession.Default.Save(IUser as User); 
5.新增了DataUtils.ConvertType<T,TOutput>方法,支持字符串數據類型的轉換 
??? public class User1 { 
??????? public string UserID { get;set;} 
??????? public string UserName {get;set;} 
??????? public string BornDate { get;set; } 
??? } 
??? public class User2 { 
??????? public int UserID { get;set;} 
??????? public string UserName {get;set;} 
??????? public DateTime BornDate { get;set; } 
??? } 
??? User1 user1 = new User1() { UserID = "1", UserName = "test", BornDate = "2009-09-10" }; 
??? User2 user2 = DataUtils.ConvertType<User1,User2>(user1); 
版本號:2.6.6
1.優化了Oracle分頁數據查詢的性能
版本號:2.6.8
1.修正了獲取前N條記錄時返回結果不正確的bug 
??? .GetTop(5).ToList() 之前返回為全部數據 
??? 對Top結構進行了重構,增加了In語法時的Top查詢 
2.修正了Access驅動分頁查詢時參數處理錯誤的bug 
3.對Insert,Delete,Update操作內核進行了重要重構
4.新增加了對postgreSQL數據庫的支持
版本號:2.7.0
1.增加從ISourceReader輸出為List的方法
2.增加了對Oracle系列名稱的自定義
public class UserGroupInfo 
{ 
??? public int UserID { get; private set; } 
??? public string UserName { get; private set; } 
??? public string GroupName { get; private set; } 
} 
//先返回ISourceReader,然后再返回List; 
IList<UserGroupInfo> list = DbSession.Default.From<User>() 
??????????????????????????? .LeftJoin<Group>(User._.GroupID == Group._.GroupID) 
??????????????????????????? .Select(User._.UserID,User._.UserName,Group._.GroupName) 
??????????????????????????? .ToReader() 或者 .ToTable() 
??????????????????????????? .ToList<UserGroupInfo>(); 
如果輸出的列與屬性值不能,可以使用MySoft.Data.Design.Mapping進行標注: 
如字段名為UserID,屬性名稱為ID 可以使用如下方式處理 
public class UserGroupInfo : IUserGroupInfo 
{ 
??? [MySoft.Data.Design.Mapping("UserID")] 
??? public int ID { get; private set; } 
??? public string UserName { get; private set; } 
??? public string GroupName { get; private set; } 
} 
//先返回ISourceReader,然后再返回List; 
IList<UserGroupInfo> list = DbSession.Default.From<User>() 
??????????????????????????? .LeftJoin<Group>(User._.GroupID == Group._.GroupID) 
??????????????????????????? .Select(User._.UserID,User._.UserName,Group._.GroupName) 
??????????????????????????? .ToReader() 或者 .ToTable() 
??????????????????????????? .ToList<UserGroupInfo>(); 
如果此時使用接口 
public interface IUserGroupInfo 
{ 
??? int ID { get; private set; } 
??? string UserName { get; } 
??? string GroupName { get; } 
} 
可以使用以下方法轉換: 
IList<IUserGroupInfo> ilist = list.ConvertTo<IUserGroupInfo>(); 
3.新增對象多屬性排序的類
??? SortComparer<Entity> c = new SortComparer<Entity>( 
??????????? new SortProperty("PropertyName1").Asc, 
??????????? new SortProperty("PropertyName2").Desc, 
??????????? new SortProperty("PropertyName31").Asc); 
??? new List().Sort(c); 
版本號:2.7.2 
1.修正了Field.IsNull()條件返回錯誤的bug;
2.修正直接用sql進行查詢或操作時,不用參數化值全部變為大寫的bug. 
? 之前是為了適應Oracle必須為大寫的需求,現在已經修正。 
? 對Oracle進行個別特殊處理即可 
3.修正了where條件參數化后無法進行緩存的bug. 
? 之前是用sql進行緩存,而參數化后每次生成的參數名稱不相同,導致緩存無效。 
? 解決辦法:將參數的值替換成sql中的參數,從而達到sql一致 
4.修正了條件為枚舉時返回的結果不正確的bug 
5.修正了調用CacheOff()與CacheOn()方法出錯的bug
下一步開發計劃(MySoft.Data v3.0):
1、增加實體驗證處理 EntityValidator<T>
2、增加MySoft.Data.Linq驅動
轉載于:https://www.cnblogs.com/maoyong/archive/2010/03/01/1675749.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的MySoft组件之MySoft.Data更新日志的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 移动端vant时间选择器_vue移动端组
- 下一篇: 安卓模拟器不能上网时可尝试更改成谷歌DN
