我的KT库之----数据库的操作(DbHelper)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

了解或者认识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;

 

数据库帮助对象: DbHelper

DbHelper类似于微软的SqlHelper,但又有不同的区别。

DbHelper是对DbConnection对象进行封装,并且是一个实例对象,在使用它时必须进行实例化,如下面示例

OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\\db.mdb");
DbHelper db = new DbHelper(connection);

 

在实例化DbHelper时传入了一个OleDbConnection对象,之后在DbHelper进行的操作大部分都是针对OleDbConnection对象进行的,并且在每执行一次命令都会自动恢复DbConnection对象的原状态(如:原状态是关闭的,则在执行命令时将会自动打开,执行完后将恢复关闭状态)。

DbHelper还有一个实例化重载函数,可设置是否保持DbConnection对象的打开状态,如下面的代码

DbHelper db = new DbHelper(connection, true);

 

使用此重载函数实例化后,DbConnection在被打开(Open)之后,将会一值保持打开状态,直到手动关闭(Close)为此

 

DbHelper的方法

1、ChangeDbConnection : 更换DbConnection

2、BeginTransaction : 启动事务,启动之后所有数据执行命令都将在同一个事务里执行。

3、CommitTransaction : 提交事务

4、RollbackTransaction : 回滚事务

5、OpenClose : 打开/关闭DbConnection

6、CreateDbCommand : 建立一个DbCommand对象

var command = db.CreateDbCommand("select * from [user]");

 

7、CreateDbCommandWrapped : 建立一个已对DbCommand包装了的DbCommandWrapped对象

var command = db.CreateDbCommandWrapped("select * from [user]");

 

8、CreateDbDataAdapter : 建立一个DbDataAdapter对象

9、CreateDbParameter : 建立一个DbParameter参数对象。注意:参数名不需要带前缀

var pName = db.CreateDbParameter("name", DbType.String, 30, "张三");

 

10、ExecuteScalar : 执行命令并返回第一行第一列的数据

var id = db.ExecuteScalar("select top 1 Id from [user]").As<int>();

 

11、ExecuteReader : 执行命令并返回DbReader数据流

using (var reader = db.ExecuteReader("select * from [user]"))
{
    while (reader.Read())
    {
        //读取数据
    }
}

 

12、ExecuteNonQuery : 执行命令并返回受影响的行数

var success = db.ExecuteNonQuery("update [user] set name='李四' where id=1") > 0;

 

13、ExecuteDataSet : 执行命令并返回DataSet对象

var dataset = db.ExecuteDataSet("select * from [user]");

 

14、ExecuteDbObject<T> : 执行命令并返回一个数据对象

var user = db.ExecuteDbObject<DbUser>("select * from [user] where id=1");

 

15、ExecuteDbObjectList<T> : 执行命令并返回数据对象列表

var users = db.ExecuteDbObjectList<DbUser>("select * from [user]");

 

16、FillDataSet : 执行集合并填充DataSet数据表

17、GetDbParameterName : 获取一个带前缀的参数名称

var pName = db.GetDbParameterName("name");  //如果传入的是SqlConnection、OleDbConnection对象则返回“@name”

 

18、QuoteIdentifier : 对标识符(表名、列名)进行处理。也就是在表名或列名前后加上相应的引用符(如Sql server则是加入“[”与“]”,但在MySql里则是“`”)

string sql = string.Format("select {0},{1} from {2}",
        db.QuoteIdentifier("name"),
        db.QuoteIdentifier("age"),
        db.QuoteIdentifier("user"));

上面语句经过这样处理后,则可以兼容所有数据库,当DbHelper当前是对SqlConnection执行操作,则上面的sql等于

select [name],[age] from [user]

而如果是对OleDbConnection的Access环境下,则是这样的语句

select `name`,`age` from `user`

嗯?是不是和MySql数据库的语法一样?。

但需要注意的是,如果是在OleDbConnection或OdbcConnection执行环境,如果数据源还处于未打开(Open)的状态,则调用此方法后,DbHelper会自动打开数据源并保持打开状态。

 

19、EscapeString : 对字符串数据进行转义处理。比如Sql server数据库则需要字符串里的单引号进行转义。

string text = db.EscapeString("当前时间是'2011-08-01 20:33'");

 

对于SqlConnection或者OleDbConnection返回的都是

当前时间是''2011-08-01 20:33''

 

而如果是在MySql环境下则返回的是

当前时间是\'2011-08-01 20:33\'

 

 

DbHelper的属性

1、Connection : 返回当前执行的数据库连接对象(DbConnection)

2、DbTransaction : 返回或设置在执行命令时使用的事务,一般通过BeginTransaction方法启用事务,如果需要使用其它外部事务则可以设置此属性进行更改。

3、DbTransactionIsCreatedByDbConnection : 返回DbTransaction 是否是通过BeginTransaction方法建立的还是由外部手工设置的。

4、KeepConnection :当前的DbHelper是否是处于保持打开状态模式的。

using (DbHelper db = new DbHelper(connection))
{
    db.ExecuteNonQuery("update [user] set age=22 where id=1");                //打开一次,执行完后又关闭
    var user = db.ExecuteDbObject<DbUser>("select * from [user] where id=1"); //打开一次,执行完后又关闭
}

上面代码里,执行两次命令共需要打开2次DbConnection。

using (DbHelper db = new DbHelper(connection, true))
{
    db.ExecuteNonQuery("update [user] set age=22 where id=1");                //打开一次,执行完后又不关闭
    var user = db.ExecuteDbObject<DbUser>("select * from [user] where id=1"); //直接执行
}

上面代码,则只需要打开1次DbConnection

 

5、Executor : 返回一个DbCommandExecutor对象(关于此对象见后文)。

 

 注:DbHelper里的内部方法很多是虚方法,所以你可以根据你的需要对其重写以适用不同的数据库,比如KT里提供的MySqlDbHelper,就是继承于DbHelper并重写部分内部方法,以便适应MySql数据库环境。

 

数据命令的包装对象:DbCommandWrapped

对于DbCommand有一个小问题,在执行命令时,如果使用了参数,在执行完成后如果忘记了调用Clear方法清除,将会导致那些参数无法再次使用!!具体可查看我的这篇文章《认父亲的DbParameter!!

 

所以我在KT对DbCommand加了一个包装对象,类似如下的代码:

/// <summary>
/// 对DbCommand进行包装
/// </summary>
public class DbCommandWrapped : IDisposable
{
    /// <summary>
    /// 
    /// </summary>
    /// <param name="command"></param>
    /// <param name="keepConnection"></param>
    public DbCommandWrapped(DbCommand command) 
    {
        this.Command = command;
    }

    public DbCommand Command;

    public void Dispose()
    {
        if (this.Command != null)
        {
            this.Command.Parameters.Clear();
            this.Command.Dispose();
        }
    }
}

有了这个包装对象,我们在执行命令时直接using一下就可以回收参数了,如下面代码

var pId = db.CreateDbParameter("@id", DbType.Int32, 1);
using (var command = db.CreateDbCommandWrapped("update [user] set age=22 where id=@id", pId))
{
    command.ExecuteNonQuery();
}
//pId可以再次使用
var user = db.ExecuteDbObject<DbUser>("select * from [user] where id=@id", pId);
本文转自Kingthy博客园博客,原文链接:http://www.cnblogs.com/kingthy/archive/2011/08/26/2155058.html ,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
29天前
|
SQL 数据库连接 数据库
你不知道ADo.Net中操作数据库的步骤【超详细整理】
你不知道ADo.Net中操作数据库的步骤【超详细整理】
16 0
|
1月前
|
SQL 数据库 OceanBase
OceanBase数据库的主备库参照的配置文件
【2月更文挑战第27天】OceanBase数据库的主备库参照的配置文件
29 4
|
2天前
|
SQL JavaScript API
❤Nodejs 第四章(操作本地数据库实现删除-源码地址已开放)
【4月更文挑战第4天】❤Nodejs 第四章(操作本地数据库实现删除-源码地址已开放)在Node.js中实现删除本地数据库记录的操作。首先尝试通过SQL删除ID为8的用户,然后编写`app.delete`路由处理程序,从请求体获取ID并执行删除。。最终成功删除用户并展示了数据库的更新结果。下一节将优化增删改查功能。
15 1
|
1月前
|
缓存 NoSQL 数据库
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
|
1月前
|
SQL 存储 关系型数据库
【mysql】—— 数据库的操作
【mysql】—— 数据库的操作
【mysql】—— 数据库的操作
|
1月前
|
数据可视化 Java 测试技术
基于SpringBoot的精品在线试题库系统(系统+数据库+文档)
基于SpringBoot的精品在线试题库系统(系统+数据库+文档)
|
1月前
|
存储 关系型数据库 MySQL
解释一下如何使用Python的数据库接口库进行数据库操作。
【2月更文挑战第12天】【2月更文挑战第33篇】解释一下如何使用Python的数据库接口库进行数据库操作。
|
1月前
|
关系型数据库 分布式数据库 数据库
据库流行度排行榜可能会影响他们的数据库选型
【2月更文挑战第12天】据库流行度排行榜可能会影响他们的数据库选型
20 8
|
2月前
|
存储 SQL 数据库连接
连接并操作数据库:Python 数据库案例
数据库是一种用于存储和管理数据的工具,它以一种有组织的方式将数据存储在文件或内存中,以便于检索和处理。数据库系统通常使用 SQL(Structured Query Language)语言来进行数据的操作,包括数据的插入、查询、更新和删除等。
|
2月前
|
前端开发 数据库连接 数据库
ASP.NETMVC数据库完整CRUD操作示例
ASP.NETMVC数据库完整CRUD操作示例
29 0