此数据查询工具界面如下图所示:
此工具采用MySoft.Data中的QueryCreator(查询创建器),QueryCreator可以创建任意组合的数据库查询,包括关联查询,选择字段,添加条件等。
QueryCreator最大的好处就是可以进行非泛型查询,还可以满足用户自定义查询的需求。
现在用户所使用的ORM有一个这样的问题,都需求先定义好实体,然后才对其进行查询,当然,通过实体操作,MySoft.Data可以这样做,例如:
首先定义一个接口:
public interface Message : IEntity { [PrimaryKey] int ID { get; } string AdminFeedback { get; set; } DateTime AdminFeedbackTime { get; set; } string Content { get; set; } string Email { get; set; } bool IsPrivate { get; set; } string Nick { get; set; } DateTime PostTime { get; set; } }
通过生成工具生成实体:
/// <summary> /// 表名:Message /// </summary> [SerializableAttribute()] public partial class Message : Entity { protected Int32 _ID; protected String _AdminFeedback; protected DateTime _AdminFeedbackTime; protected String _Content; protected String _Email; protected Boolean _IsPrivate; protected String _Nick; protected DateTime _PostTime; public Int32 ID { get { return this._ID; } set { this.OnPropertyValueChange(_.ID, _ID, value); this._ID = value; } } public String AdminFeedback { get { return this._AdminFeedback; } set { this.OnPropertyValueChange(_.AdminFeedback, _AdminFeedback, value); this._AdminFeedback = value; } } public DateTime AdminFeedbackTime { get { return this._AdminFeedbackTime; } set { this.OnPropertyValueChange(_.AdminFeedbackTime, _AdminFeedbackTime, value); this._AdminFeedbackTime = value; } } public String Content { get { return this._Content; } set { this.OnPropertyValueChange(_.Content, _Content, value); this._Content = value; } } public String Email { get { return this._Email; } set { this.OnPropertyValueChange(_.Email, _Email, value); this._Email = value; } } public Boolean IsPrivate { get { return this._IsPrivate; } set { this.OnPropertyValueChange(_.IsPrivate, _IsPrivate, value); this._IsPrivate = value; } } public String Nick { get { return this._Nick; } set { this.OnPropertyValueChange(_.Nick, _Nick, value); this._Nick = value; } } public DateTime PostTime { get { return this._PostTime; } set { this.OnPropertyValueChange(_.PostTime, _PostTime, value); this._PostTime = value; } } /// <summary> /// 获取实体对应的表名 /// </summary> protected override Table GetTable() { return new Table<Message>("Message"); } /// <summary> /// 获取实体中的标识列 /// </summary> protected override Field GetIdentityField() { return _.ID; } /// <summary> /// 获取实体中的主键列 /// </summary> protected override Field[] GetPrimaryKeyFields() { return new Field[] { _.ID, }; } /// <summary> /// 获取列信息【:ID 1: AdminFeedback 2: AdminFeedbackTime 3: Content 4: Email 5: IsPrivate 6: Nick 7: PostTime】 /// </summary> protected override Field[] GetFields() { return new Field[] { _.ID, _.AdminFeedback, _.AdminFeedbackTime, _.Content, _.Email, _.IsPrivate, _.Nick, _.PostTime}; } /// <summary> /// 获取列数据【:_ID 1: _AdminFeedback 2: _AdminFeedbackTime 3: _Content 4: _Email 5: _IsPrivate 6: _Nick 7: _PostTime】 /// </summary> protected override object[] GetValues() { return new object[] { this._ID, this._AdminFeedback, this._AdminFeedbackTime, this._Content, this._Email, this._IsPrivate, this._Nick, this._PostTime}; } /// <summary> /// 给当前实体赋值 /// </summary> protected override void SetValues(IRowReader reader) { if ((false == reader.IsDBNull(_.ID))) { this._ID = reader.GetInt32(_.ID); } if ((false == reader.IsDBNull(_.AdminFeedback))) { this._AdminFeedback = reader.GetString(_.AdminFeedback); } if ((false == reader.IsDBNull(_.AdminFeedbackTime))) { this._AdminFeedbackTime = reader.GetDateTime(_.AdminFeedbackTime); } if ((false == reader.IsDBNull(_.Content))) { this._Content = reader.GetString(_.Content); } if ((false == reader.IsDBNull(_.Email))) { this._Email = reader.GetString(_.Email); } if ((false == reader.IsDBNull(_.IsPrivate))) { this._IsPrivate = reader.GetBoolean(_.IsPrivate); } if ((false == reader.IsDBNull(_.Nick))) { this._Nick = reader.GetString(_.Nick); } if ((false == reader.IsDBNull(_.PostTime))) { this._PostTime = reader.GetDateTime(_.PostTime); } } public override int GetHashCode() { return base.GetHashCode(); } public override bool Equals(object obj) { if ((obj == null)) { return false; } if ((false == typeof(Message).IsAssignableFrom(obj.GetType()))) { return false; } if ((((object)(this)) == ((object)(obj)))) { return true; } return false; } public class _ { /// <summary> /// 表示选择所有列,与*等同 /// </summary> public static AllField All = new AllField<Message>(); /// <summary> /// 字段名:ID - 数据类型:Int32 /// </summary> public static Field ID = new Field<Message>("ID"); /// <summary> /// 字段名:AdminFeedback - 数据类型:String /// </summary> public static Field AdminFeedback = new Field<Message>("AdminFeedback"); /// <summary> /// 字段名:AdminFeedbackTime - 数据类型:DateTime /// </summary> public static Field AdminFeedbackTime = new Field<Message>("AdminFeedbackTime"); /// <summary> /// 字段名:Content - 数据类型:String /// </summary> public static Field Content = new Field<Message>("Content"); /// <summary> /// 字段名:Email - 数据类型:String /// </summary> public static Field Email = new Field<Message>("Email"); /// <summary> /// 字段名:IsPrivate - 数据类型:Boolean /// </summary> public static Field IsPrivate = new Field<Message>("IsPrivate"); /// <summary> /// 字段名:Nick - 数据类型:String /// </summary> public static Field Nick = new Field<Message>("Nick"); /// <summary> /// 字段名:PostTime - 数据类型:DateTime /// </summary> public static Field PostTime = new Field<Message>("PostTime"); } }
生成以上实体后,CURD操作就变得很简单了。
#region 强类型操作 //添加 Message msg = new Message() { Content = "测试内容", PostTime = DateTime.Now }; DbSession.Default.Save(msg); //修改 msg.Content = "测试修改内容"; DbSession.Default.Save(msg); //删除 DbSession.Default.Delete(msg); //查询 DbSession.Default.From<Message>() .Where(Message._.ID == 1) .OrderBy(Message._.ID.Desc) .ToList(); #endregion
同样,通过创建器而不需要定义实体也可以实现同样的要求
#region 创建器操作 //添加 InsertCreator ic = InsertCreator.NewCreator() .From("Message") .AddInsert("Content", "测试内容") .AddInsert("PostTime", DateTime.Now); DbSession.Default.Excute(ic); //修改 UpdateCreator uc = UpdateCreator.NewCreator() .From("Message") .AddUpdate("Content", "测试修改内容") .AddWhere("ID", 1); DbSession.Default.Excute(ic); //删除 DeleteCreator dc = DeleteCreator.NewCreator() .From("Message") .AddWhere("ID", 1); DbSession.Default.Excute(dc); //查询 QueryCreator qc = QueryCreator.NewCreator() .From("Message") .AddWhere("ID", 1) .AddOrder("ID desc"); DbSession.Default.From(qc).ToTable(); #endregion
言归正传,上面只是说明一下QueryCreator的妙用,接下来继续介绍数据查询工具:
此查询工具实现了两种查询模式:单表查询与关联查询
条件可以根据表的字段自动生成,后面的值可以设置为字段对应的值,可以为数字,字符串或日期等类型。
一、单表查询:
自定义条件:
定义一个查询条件CategoryID 为1 ,点击查询,将查出相应的结果
二、关联查询:
选择INNER JOIN,LEFT JOIN,RIGHT JOIN其中一种,会出现关联条件设置的按钮,点击可以设置两个表之间的关联关系
设置好相应条件,点击查询显示结果
到此,简单的查询工具已经完成了
需要更强大的功能,可以点击数据库查询分析器,如图:
此分析器可以对数据进行增删除改查操作,左边点击右键会生成Select,Insert,Update,Delete相应的SQL语句,按F5可以对当前SQL进行操作!
下一章将介绍 MySoft.Data 实体开发步骤。
如有什么问题,请联系,或到MySoft问题反馈区进行反馈:
QQ:121849018
MSN:maoyong181@hotmail.com
Gmail:mysoft181@gmail.com