惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
C
Check Point Blog
博客园_首页
B
Blog
D
Docker
U
Unit 42
量子位
I
InfoQ
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
GbyAI
GbyAI
L
LangChain Blog
云风的 BLOG
云风的 BLOG
博客园 - Franky
美团技术团队
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
Vercel News
Vercel News
Recent Announcements
Recent Announcements
雷峰网
雷峰网
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Google DeepMind News
Google DeepMind News

博客园 - Kingthy

【开源项目】智能电视及电视盒子的控制应用TVRemoteIME的接口说明 实现安卓里边下边播的播放器(源码公开) 现在很火的答题赢钱游戏,让我来简单教你怎么做自动答题器 【开源项目】电视盒子好用又强大的APP: TVRemoteIME [原创]用C#实现微信“跳一跳”小游戏的自动跳跃助手 javascript图片隐写术,感觉可以用它来干点有想法的事情 我的KT库之----与VT的结合 我的KT库之----数据库的操作(DbCommandBuilder/DbConditionBuilder) VTemplate模板引擎的使用—Function标签 我的KT库之----数据库的操作(DbHelper) 我的KT库之----数据对象 【原创】腾讯微博的XSS攻击漏洞 我的KT库之-----缓存与配置 我的KT库之-----对象池 我的KT库之-----扩展方法 我的KT库之-----认识KT [开源]基于C#的腾讯微博SDK V0.1版本发布 怪异的StackOverflowException异常 开源的Kingthy.Mail邮件组件库
我的KT库之----数据库的操作(DbCommandExecutor)
Kingthy · 2011-08-27 · via 博客园 - Kingthy

了解或者认识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<T> : 获取某行数据,并将行数据映射为某个数据对象

using (DbHelper db = new DbHelper(connection))
{
    //通过Id值获取数据
    var user = db.Executor.GetRow<DbUser>("user", 1);
    //通过条件获取数据
    var user2 = db.Executor.GetRow<DbUser>("user", "id=3 and age=30");
}

4、GetRowList<T> : 获取某些行数据,并将行数据映射为某个数据对象

using (DbHelper db = new DbHelper(connection))
{
    //获取某个表里的所有数据
    var users = db.Executor.GetRowList<DbUser>("user");
    //通过条件获取数据
    users = db.Executor.GetRowList<DbUser>("user", "id>2");
    //通过条件获取数据,并按id降序排列返回
    users = db.Executor.GetRowList<DbUser>("user", "id>2", "id desc");
    //获取符合条件的前10条数据
    users = db.Executor.GetRowList<DbUser>(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<T> : 删除某些数据行,并返回被删除的行数据

using (DbHelper db = new DbHelper(connection))
{
    //删除id=1,id=2, id=3的数据行并返回行数据
    var rows = db.Executor.RemoveRow<DbUser>("user", 1, 2, 3);
    //删除符合条件的数据行并返回行数据
    rows = db.Executor.RemoveRow<DbUser>("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

此属性标记是用于标记对象中的哪些属性在DbCommandExecutorInsertUpdate方法中是需要处理的。如下面的类结构定义

/// <summary>
/// 用户对象
/// </summary>
public class DbUser : DbObject
{
    public DbUser()
    {
        
    }
    /// <summary>
    /// 编号
    /// </summary>
    [DbField(DbType.Int32, Identity=true, PrimaryKey=true)]
    public int Id
    {
        get
        {
            return this.GetData<int>("Id", 0);
        }
        set
        {
            this["Id"] = value;
        }
    }

    /// <summary>
    /// 姓名
    /// </summary>
    [DbField(DbType.String, Size=20, Groups = 1)]
    public string Name
    {
        get
        {
            return this.GetData<string>("Name", null);
        }
        set
        {
            this["Name"] = value;
        }
    }
    /// <summary>
    /// 年龄
    /// </summary>
    [DbField(DbType.Int32, Groups = 1|2)]
    public int Age
    {
        get
        {
            return this.GetData<int>("Age", 0);
        }
        set
        {
            this["Age"] = value;
        }
    }
    /// <summary>
    /// 电话
    /// </summary>
    [DbField(DbType.String, Size = 20, Groups = 2)]
    public string Phone
    {
        get
        {
            return this.GetData<string>("Phone", null);
        }
        set
        {
            this["Phone"] = value;
        }
    }
}

标记了Id、Name、Age、Phone四个属性是需要处理的。

DbFieldAttribute的属性

1、Name : 定义对应于数据库的字段名称。如果为空或null则默认采用属性名称

/// <summary>
/// 姓名
/// </summary>
[DbField(DbType.String, Name = "UserName", Size = 20)]
public string Name
{
    get;
    set;
}

此属性定义了Name值,所以表示此属性是对应于数据库的“username”字段。

2、DbType : 数据字段类型

/// <summary>
/// 姓名
/// </summary>
[DbField(DbType.String, Size = 20)]
public string Name
{
    get;
    set;
}

对应的是DbType.String类型。如果采用空类型构造函数,则表示采用系统自动检测,如下

/// <summary>
/// 姓名
/// </summary>
[DbField(Size = 20)]
public string Name
{
    get;
    set;
}

因为未定义DbType,所以在运行Insert或Update方法,KT会自动根据属性类型“string”决定使用DbType.String类型。

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操作中

/// <summary>
/// 姓名
/// </summary>
[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);