我的KT库之----数据库的操作(DbCommandExecutor)
了解或者认识KT:
http://www.cnblogs.com/kingthy/archive/2011/08/08/2130973.html
在项目中如何使用KT?
KT是一个库,所以将KT的dll文件引用到您的项目上即可使用KT里的函数功能。
本节将介绍大家如何使用KT库操作数据库。KT里的数据库操作对象存放于在“KT.Framework.Database“下,当你已在你的项目里引用了KT库后,则写下以下代码就可以使用了。
using KT.Framework.Database;
数据库命令执行对象: DbCommandExecutor
DbCommandExecutor里封装了常用的数据执行命令。通过DbConnection或DbHelper实例化一个实例,如下面
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:\\db.mdb"); DbCommandExecutor executor = new DbCommandExecutor(connection);
或者
DbHelper db = new DbHelper(connection); DbCommandExecutor executor = new DbCommandExecutor(db);
但建议的是直接调用DbHelper里的Executor属性直接获取对应的DbCommandHelper实例,如下面范例
DbHelper db = new DbHelper(connection); DbCommandExecutor executor = db.Executor;
DbCommandExecutor的方法
注:以下的演示代码使用的表结构如下,表名:user
id | int | 标识字段 |
name | nvarchar(20) | 姓名 |
age | int | 年龄 |
phone | nvarchar(20) | 电话 |
1、ExecuteIdentity : 执行命令,并且返回数据库的最后标识值。此方法一般用于执行INSERT命令
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:\\db.mdb"); using (DbHelper db = new DbHelper(connection)) { long id = db.Executor.ExecuteIdentity("insert into `user` (`name`,`age`,`phone`) values ('小明',20,'13833233322')"); Console.WriteLine(id); }
此方法如在OleDbConnection/OdbcConnection执行环境下,将调用“SELECT @@IDENTITY ”语句获取标识值;如果是在SqlConnection执行环境下,则调用“SELECT SCOPE_IDENTITY() ”获取标识值;而如果是MySql执行环境下,则调用“SELECT LAST_INSERT_ID() ”获取标识值。
2、ExistRow : 判断是否存在某行数据符合条件的数据
using (DbHelper db = new DbHelper(connection)) { bool exist = db.Executor.ExistRow("user", "id=2"); Console.WriteLine(exist); }
3、GetRow
using (DbHelper db = new DbHelper(connection)) { //通过Id值获取数据 var user = db.Executor.GetRow("user", 1); //通过条件获取数据 var user2 = db.Executor.GetRow ("user", "id=3 and age=30"); }
4、GetRowList
using (DbHelper db = new DbHelper(connection)) { //获取某个表里的所有数据 var users = db.Executor.GetRowList("user"); //通过条件获取数据 users = db.Executor.GetRowList ("user", "id>2"); //通过条件获取数据,并按id降序排列返回 users = db.Executor.GetRowList ("user", "id>2", "id desc"); //获取符合条件的前10条数据 users = db.Executor.GetRowList (10, "user", "id>2"); }
5、DeleteRow : 删除某些数据行,并返回已删除的行数
using (DbHelper db = new DbHelper(connection)) { //删除id=1,id=2, id=3的数据行 int r = db.Executor.DeleteRow("user", 1, 2, 3); //删除符合条件的数据行 int r1 = db.Executor.DeleteRow("user", "id>2"); }
6、RemoveRow
using (DbHelper db = new DbHelper(connection)) { //删除id=1,id=2, id=3的数据行并返回行数据 var rows = db.Executor.RemoveRow("user", 1, 2, 3); //删除符合条件的数据行并返回行数据 rows = db.Executor.RemoveRow ("user", "id>2"); }
7、Insert : 将某个对象插入到某个数据表。对象需要插入的数据(属性)需要用DbFieldAttribute做属性标记
注:以下示例代码中的DbUser类结构请看下面的DbFieldAttribute说明
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:\\db.mdb"); var dbuser = new DbUser(); dbuser.Name = "小明"; dbuser.Age = 23; dbuser.Phone = "13800138000"; using (DbHelper db = new DbHelper(connection)) { var f = db.Executor.Insert("user", dbuser); if (f) { //输出当前新记录的id值 Console.WriteLine(dbuser.Id); } }
8、Update : 将某个对象更新到某个数据表。对象需要更新的数据(属性)需要用DbFieldAttribute做属性标记
注:以下示例代码中的DbUser类结构请看下面的DbFieldAttribute说明
var dbuser = new DbUser(); dbuser.Id = 2; dbuser.Name = "小明"; dbuser.Age = 23; dbuser.Phone = "13800138000"; using (DbHelper db = new DbHelper(connection)) { var f = db.Executor.Update("user", dbuser); Console.WriteLine(f ? "更新成功" : "更新失败"); }
上面代码将会自动更新“id=2”的记录值。
数据字段属性标记:DbFieldAttribute
此属性标记是用于标记对象中的哪些属性在DbCommandExecutor的Insert或Update方法中是需要处理的。如下面的类结构定义
/// /// 用户对象 /// public class DbUser : DbObject { public DbUser() {} /// /// 编号 /// [DbField(DbType.Int32, Identity=true, PrimaryKey=true)] public int Id { get { return this.GetData("Id", 0); } set { this["Id"] = value; } }/// /// 姓名 /// [DbField(DbType.String, Size=20, Groups = 1)] public string Name { get { return this.GetData ("Name", null); } set { this["Name"] = value; } } /// /// 年龄 /// [DbField(DbType.Int32, Groups = 1|2)] public int Age { get { return this.GetData ("Age", 0); } set { this["Age"] = value; } } /// /// 电话 /// [DbField(DbType.String, Size = 20, Groups = 2)] public string Phone { get { return this.GetData ("Phone", null); } set { this["Phone"] = value; } } }
标记了Id、Name、Age、Phone四个属性是需要处理的。
DbFieldAttribute的属性
1、Name : 定义对应于数据库的字段名称。如果为空或null则默认采用属性名称
/// /// 姓名 /// [DbField(DbType.String, Name = "UserName", Size = 20)] public string Name { get; set; }
此属性定义了Name值,所以表示此属性是对应于数据库的“username”字段。
2、DbType : 数据字段类型
/// /// 姓名 /// [DbField(DbType.String, Size = 20)] public string Name { get; set; }
对应的是DbType.String类型。如果采用空类型构造函数,则表示采用系统自动检测,如下
/// /// 姓名 /// [DbField(Size = 20)] public string Name { get; set; }
因为未定义DbType,所以在运行Insert或Update方法,KT会自动根据属性类型“string”决定使用DbType.String类型。
【我的KT库之----数据库的操作(DbCommandExecutor)】
3、PrimaryKey : 是否是主键字段。如果是则在UPDATE时将使用此属性值做为更新条件
4、Identity : 是否是自增标识字段,如果是则不参与INSERT与UPDATE,并且在INSERT后会自动获取
5、Size : 用于标记字段值的长度大小
6、Groups : 字段所在组,在插入或更新数据时可根据组更新或者插入部分字段值。
var dbuser = new DbUser(); dbuser.Id = 2; dbuser.Name = "小明"; dbuser.Age = 23; dbuser.Phone = "13800138000"; using (DbHelper db = new DbHelper(connection)) { var f = db.Executor.Update("user", dbuser, 1); Console.WriteLine(f ? "更新成功" : "更新失败"); }
上面代码则只更新属于组1的数据,也即是只更新“Name”与“Age”数据,“Phone“数据由于属于组2不会被更新!如果改为以下代码
var f = db.Executor.Update("user", dbuser, 2);
也即是只更新属于“组2”的数据,因为“Age”是被定义为混合组“Groups=1|2“,所以表示Age属于“组1”且也属于“组2”数据。所以上面代码里“Age“与“Phone“数据将会被更新。
如果将代码改为以下
var f = db.Executor.Update("user", dbuser, 1|2);
则表示同时更新“组1”与“组2”的数据,所以“Name“、“Age”、“Phone”都会被同时更新。
7、Insertable : 是否允许进行INSERT操作,默认允许
此属性可设置为以下三种值:
DbFieldOperable.Allowed :允许操作
DbFieldOperable.OnlyGroup:只允许同组的操作
DbFieldOperable.Unallowed:不允许操作,也即是不会参与到INSERT操作中
/// /// 姓名 /// [DbField(Size = 20, Groups=1, Insertable = DbFieldOperable.OnlyGroup)] public string Name { get; set; }
上面代码由于设置为只允许同组的操作,并且定义了属于“组1”数据,所以
db.Executor.Insert("user", dbuser); //Name不参与INSERT db.Executor.Insert("user", dbuser, 1); //因为设置了插入组1数据,所以Name将会参与INSERT
8、Updateable : 是否允许进行UPDATE操作,默认允许
此属性类似Insertable
DbFieldAttribute的两个特殊常量
1、EmptyGroup : 表示空组,常量:0
如在Insert与Update方法中,传递此值,则表示是所有定义为“DbFieldOperable.Allowed”的数据
//以下两个方法相同效果 db.Executor.Insert("user", dbuser); db.Executor.Insert("user", dbuser, DbFieldAttribute.EmptyGroup);
2、NoGroup: 表示不属于任何组,常量:-1
如在Insert与Update方法中,传递此值,则表示只处理所有未定义“Groups”的属性数据。
db.Executor.Insert("user", dbuser, DbFieldAttribute.NoGroup);
推荐阅读
- 一个小故事,我的思考。
- 家乡的那条小河
- 前任
- 绘本讲师训练营【18期】14/21《我的情绪小怪兽》故事会新体验
- 我的友谊纪念日
- 从我的第一张健身卡谈传统健身房
- 阴雨
- 多想你明白我的心意
- 我的世界同人小说《暮色齿轮》第三回|我的世界同人小说《暮色齿轮》第三回 回忆
- 【变化】我的青椒学习之旅