我的KT库之----数据对象

了解或者认识KT:

http://www.cnblogs.com/kingthy/archive/2011/08/08/2130973.html

在项目中如何使用KT?

KT是一个库,所以将KT的dll文件引用到您的项目上即可使用KT里的函数功能。

本节将介绍大家认识KT库里的数据对象(DbObject)。KT里的数据对象是KT简易ORM框架里的一个对象角色,它存放于在“KT.Framework“下,当你已在你的项目里引用了KT库后,则写下以下代码就可以使用数据对象了。

using KT.Framework;

什么是数据对象

数据对象可用于简单处理数据的存储与交互,如将数据进行实体化处理。KT里的数据对象DbObject对象类似于一个“字典”对象,添加到数据对象里的数据都被放入内部的一个“槽”里进行维护,如以下的代码:

DbObject obj = new DbObject();
obj["name"] = "张三";
obj["age"] = 23;
Console.WriteLine("姓名:{0}", obj["name"]);
Console.WriteLine("年龄:{0}", obj["age"]);//或者通过SetData/GetData<T>方法设置/获取数据
obj.SetData("name", "李四");
Console.WriteLine("姓名:{0}", obj.GetData<string>("name"));
Console.WriteLine("年龄:{0}", obj.GetData<int>("age"));
Console.Read();

 

扩展数据对象

虽可以直接将数据对象当作一个字典对象使用,但很多场合下我们却是需要将数据进行实体化处理,所以我们需要将数据对象进行扩展。如以下的代码示例:

/// <summary>
/// 用户对象
/// </summary>
public class DbUser : DbObject
{public User(){}/// <summary>/// 姓名/// </summary>public string Name{get{return this.GetData<string>("Name", null);}set{this["Name"] = value;}}/// <summary>/// 年龄/// </summary>public int Age{get{return this.GetData<int>("Age", 0);}set{this["Age"] = value;}}
}

 

这样扩展后,我们的数据对象User就是强类型的了,如下面的使用代码示例:

DbUser user = new DbUser();
user.Name = "张三";
user.Age = 12;

 

有时我们的类里需要使用到类内部的“字段”,则我们也可以将“字段”关联到数据对象里,如下面的扩展方法处理

/// <summary>
/// 用户对象
/// </summary>
public class DbUser : DbObject
{public DbUser(){this.AddInternalData("Id", () => this.Id, (o) => this.Id = o.As<int>());}/// <summary>/// 编号/// </summary>public int Id;/// <summary>/// 姓名/// </summary>public string Name{get{return this.GetData<string>("Name", null);}set{this["Name"] = value;}}/// <summary>/// 年龄/// </summary>public int Age{get{return this.GetData<int>("Age", 0);}set{this["Age"] = value;}}
}

我们通过“AddInternalData”方法,将Id字段加入到了数据对象里,这样我们就可以在数据对象里使用”Id”数据了,如下面代码

            DbUser user = new DbUser();user["Id"] = 33;Console.WriteLine(user.Id);  //输出33user.Id = 22;Console.WriteLine(user.GetData<int>("Id"));  //输出22

 

 

还有一种情况,有时对一种数据,我们多有种不同的名称,比如“用户名”,有时使用为“name“,有时又为“username“,比如以下两句SQL语句

 

SELECT Name FROM [User]
SELECT B.BookName,U.UserId,U.Name AS UserName FROM [Book] B INNER JOIN [User] U ON U.Id=B.UserId

在第一句SQL语句里,因为只单纯查询用户表,所以可以使用“name”做用户的名称,但在第二句SQL语句里,为了区别用户的数据,又采用了"username”做为用户名数据,对于这种情况,我们也可以在数据对象里进行扩展,如以下示例代码

/// <summary>
/// 用户对象
/// </summary>
public class DbUser : DbObject
{public DbUser(){this.AddInternalData("Id", () => this.Id, (o) => this.Id = o.As<int>());}/// <summary>/// 编号/// </summary>public int Id;/// <summary>/// 姓名/// </summary>public string Name{get{return this.GetData<string>("Name", null);}set{this["Name"] = value;}}/// <summary>/// 年龄/// </summary>public int Age{get{return this.GetData<int>("Age", 0);}set{this["Age"] = value;}}protected override bool OnBeforeSetData(string name, object value){if ("username".Equals(name, StringComparison.OrdinalIgnoreCase)){//调用内部的SetDataImp方法,可避免再一次触发OnBeforeSetData方法this.SetDataImp("name", value);/*** 注:以下两种方式都会再一次触发OnBeforeSetData方法,所以尽量不要使用* this.SetData("name", value);* this.Name = value.As<string>();**/return false;}return base.OnBeforeSetData(name, value);}
}

 

使用示例

            DbUser user = new DbUser();user.Name = "张三";Console.WriteLine(user.Name);  //输出"张三"user["username"] = "李四";Console.WriteLine(user.Name);  //输出"李四"

 

 

 

数据对象的使用

在上面示例代码里,也许会有很多同学都会问“这样的数据对象,看不出它的好处在哪里,并且比直接写一个类结构还更复杂”,是的,直接这样使用数据对象,真的体现不出它的好处在哪里,但如果将数据对象与“数据库”挂上关系,那就可以体现数据对象的好处在哪里了。比如我们的数据库有这样的两个表

表1:User 用户表

Idint
Namenvarchar(20)
Ageint
Phonenvarchar(20)
LocationIdint

表2:Location 位置表

Idint
UserIdint
Citynvarchar(30)
Addressnvarchar(200)
Zipcodenvarchar(6)

 

现在我们需要获取User表里的数据,比如有以下的SQL语句

SELECT * FROM [User]

根据上表可以知道,这样的查询语句,将获取到的数据共有5个(Id,Name,Age,Phone,LocationId),但如果将这些数据映射到某个实体类去,并且实现数据的一一对应,那我们就需要定义这5个属性或字段,如下面的类

/// <summary>
/// 用户对象
/// </summary>
public class User 
{public User(){}public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public string Phone { get; set; }public int LocationId { get; set; }
}

 

但假如我们现在在获取用户数据时还需要同时获取用户的地址位置数据,如以下的SQL语句

SELECT U.Id,U.Name,L.City,L.Address,L.Zipcode FROM [User] U INNER JOIN [Location] L ON L.Id=U.Location.Id

 

这条查询语句我们共需要获取Id,Name,City,Address,Zipcode这5个数据,很明显,这里的数据与上面的User类结构是不相同的,也就是如果需要将这条SQL语句映射为类对象,我们又需要建多一个类结构对象。也就是每当我们SQL语句有变化时,我们就需要增加不同的类对象,这样对我们来说是非常麻烦且工作量是非常之大的。

 

如果我们使用数据对象来做数据映射,因为数据对象本来就是一个“字典”对象,所以不管我们的SQL语句如何变化,数据都是进入到数据对象里的“槽”里,再根据“扩展数据对象”反映到对象的“属性”或“字段”里。比如上面两句SQL语句我们都可以将其映射为“扩展数据对象”那段里定义的“DbUser”对象,对于未“扩展”的“Phone,LocationId,City,Address,Zipcode“等数据,我们则可以在需要时通过数据对象的“GetData<T>”方法获取,如下:

var phone = user.GetData<string>("Phone");
var locationId = user.GetData<int>("LocationId");

 

从上面的示例中,我们可以看到DbObject有点类似于DataTable,确切的说应该是像DataRow,只当一个相同的DbObject列表集时,才能说象DataTable。KT也提供了DbObject的扩展方法,通过扩展方法DataTable与List<DbObject>可以互相转换。如下示例:

            DataTable table = new DataTable();table.Columns.Add("name", typeof(string));table.Columns.Add("age", typeof(int));table.Rows.Add("张三", 20);table.Rows.Add("李四", 30);var users = table.ToDbObjectList<DbUser>();Console.WriteLine(users.Count);    //输出:2Console.WriteLine(users[0].Name);  //输出:张三var userTable = users.ToDataTable();Console.WriteLine(userTable.Rows.Count);  //输出:2Console.WriteLine(userTable.Rows[0]["Name"]);//输出:张三

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

System.Text.Json 自定义 Conveter

System.Text.Json 自定义 ConveterIntroSystem.Text.Json 作为现在 .NET 默认提供的高性能 JSON 序列化器&#xff0c;对于一些比较特殊类型支持的并不太好&#xff0c;业务需求中总是有各种各样的需要&#xff0c;很多时候就需要用到自定义 Converter &#xff0c;对于微软新出…

jwt的token自动续约_JWT(JSON Web Token)自动延长到期时间

cchamberlain..6如果您使用的是节点(React/Redux/Universal JS),则可以安装npm i -S jwt-autorefresh.此库根据用户计算的访问令牌到期之前的秒数(基于令牌中编码的exp声明)计划刷新JWT令牌.它有一个广泛的测试套件,可以检查很多条件,以确保任何奇怪的活动都伴随着有关环境配置…

50张图,带你认识大学各专业

全世界只有3.14 % 的人关注了爆炸吧知识专业选的好每天像高考掐指一算&#xff0c;开学就近在眼前。当初纠结自己是考清华还是北大的那一幕也还是历历在目。不过&#xff0c;最后还是没有选择他们&#xff0c;一是因为北京离家太远&#xff0c;怕自己想家&#xff0c;二是因为他…

通达学院计算机组成原理试卷及答案,2021全国网络工程专业大学排名(5篇)

2018全国网络工程专业大学排名(5篇)高考填报志愿选择专业的话&#xff0c;考生需要了解你选择的专业在全国排名怎么样以及选择学校开设的专业在全国排名怎么样&#xff1f;高考升学网小编带你一起了解关于网络工程开设专业的大学排名。以及网络工程就业前景排名怎么样&#xff…

diff和patch工具使用(转)

本文转自 http://blog.chinaunix.net/uid-22848040-id-1767554.html diff和patch是一对工具&#xff0c;在数学上来说&#xff0c;diff是对两个集合的差运算&#xff0c;patch是对两个集合的和运算。 diff比较两个文件或文件集合的差异&#xff0c;并记录下来&#xff0c;生成…

自动布局

以前iOS 布局UI界面的经常编写大量的坐标计算代码为了保证在3.5 4.0屏幕上都有完美UI界面效果 有时需要分别为2中屏幕编写不同坐标计算代码(屏幕适配)Autolayout是一种自动布局 自ios7 Autolayout效率增加Autolayout功能比Autoresizing强大很多 黄色 控件的frame不匹配所添加的…

ant 执行多个构建文件

如果需要在一个构件文件中通过Ant命令去执行另一个Ant项目&#xff0c;或者说要执行本项目的子项目的构件文件。这时Ant这个核心任务就派上用场了。简单地说Ant任务的作用就相当于在命令行通过Ant命令执行构件文件。值得注意的是Ant任务依赖于target元素&#xff0c;需要在某个…

rockmq运维指令_RocketMQ 运维指令

1.1.控制台使用RocketMQ 提供有控制台及一系列控制台命令&#xff0c;用于管理员对主题&#xff0c;集群&#xff0c;broker 等信息的管理登录控制台首先进入RocketMQ 工程&#xff0c;进入/RocketMQ/bin在该目录下有个mqadmin 脚本查看帮助在mqadmin 下可以查看有哪些命令sh m…

第一次去四川的广东人是什么下场?

1 第一次去四川的广东人▼2 酒店&#xff1a;好的&#xff0c;下次把床头柜也粘地上▼3 朋友家楼下有一窝乌鸦重点是乌鸦窝是晾衣架做的那么问题来了......它们从哪里偷的那么多衣架&#xff1f;&#xff1f;▼4 没有妈咪编不出来的毛衣▼5 这简直一毛一样▼6 我今天非要…

我的C++开发工具链

工欲善其事&#xff0c;必先利其器。想要干好活&#xff0c;顺手的工具是必不可少的。来分享下我的C开发工具链。 平台&#xff1a;Windows 编译器&#xff1a;MSVC IDE&#xff1a;Visual Studio 版本控制&#xff1a;TortoiseGit 静态检查&#xff1a;VisualStudio_Scan 内存…

为什么 Dapper 的批量插入比我预期的要慢很多?

咨询区 kenwarner&#xff1a;我的项目中有一个批量插入的需求&#xff0c;我采用的是 Dapper 连接数据库&#xff0c;下面是我的代码。var members new List<Member>(); for (int i 0; i < 50000; i) {members.Add(new Member(){Username i.toString(),IsActive …

在java中写出html代码,在java里写html代码

在java里写html代码[2021-02-09 07:31:38] 简介:php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff1a;《…

append()与extend()

list函数append与extend的区别&#xff1a;前者的参数可以是任何类型&#xff0c;把元素加入到list中&#xff1b;后者的参数必须是list类型&#xff0c;把它和原list合并。 >>> a [1, 2, 3] >>> a.append([4, 5]) >>> a [1, 2, 3, [4, 5]] >&g…

简单的比较两数大小

#!/bin/bash#testecho "----- 比较两数大小-----";while (true) do{echo -n " 请输入a:";read a;echo -n " 请输入b:";read b;if [ $a -eq $b ]then echo "ab&#xff01;";elif [ $a -lt $b ]then echo "a 小于 b || $a < $b…

大咖来了!今年的 COSCon 主论坛你可以见到这些大咖

“ 点击蓝字 / 关注我们 ”| 作者&#xff1a;COSCon21 组委会| 编辑&#xff1a;王玥敏| 设计&#xff1a;朱亿钦COSCon21 主论坛已经开始了紧锣密鼓的筹备工作&#xff0c;大咖们走进影棚&#xff0c;录制主题演讲。那么在本次主论坛中&#xff0c;你都能见到哪些大咖呢&…

3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的你

全世界只有3.14 % 的人关注了爆炸吧知识宇宙深邃美丽&#xff0c;是黑夜的荧光&#xff0c;是夏天里冒着凉气的西瓜&#xff0c;总是诱人地勾起一代又一代人探索的欲望。对于宇宙思索与探索&#xff0c;人类的脚步从未停止。正是人类对宇宙的好奇&#xff0c;撑起了人类发展的大…

mysql如何查询某条记录在分页的第几页_分页插件的使用

mybatis中首先要在配置文件中配置一些东西&#xff0c;配置sqlaMapconfig和mapper.xml,然后根据这些配置去创建一个会话工厂&#xff0c;再根据会话工厂创建会话&#xff0c;会话发出操作数据库的sql语句(作用是操作数据库)&#xff0c;然后通过执行器操作数据&#xff0c;再使…

DataAdapter.FillSchema 方法

备忘: http://msdn.microsoft.com/zh-cn/library/229sz0y5.aspx转载于:https://www.cnblogs.com/lindj0307/archive/2012/08/28/2660298.html

2014全国计算机二级ms office,2014计算机二级MS Office真题及答案

根据光盘中素材文件夹中“操作题素材”子文件夹中“操作题4.2”中所提供的“迎春花”及其中的图片&#xff0c;制作名为“迎春花”的演示文稿&#xff0c;要求如下&#xff1a;(1)有标题页&#xff0c;有演示主题&#xff0c;制作单位(老年协会)&#xff0c;在第一页上要有艺术…

routine tortoisesvn operations-1

接下来, 我们讲一下tortoisesvn的常规操作. update, revert和switch的区别, 这三个命令的图标都是从服务器端到客户端的箭头, 容易搞混.1. update是最常用的操作, 就是用来更新本地的work copy, 当然, 如果某个文档是基于svn server的最新版本做了修改,那么update并不会从svn s…