了解或者认识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对象则返回mailto:“@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则必须先将数据源打开(Open)才能调用此方法,否则会出错。如下:

OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\\db.mdb");
using (DbHelper db = new DbHelper(connection))
{
    //必须先Open
    db.Open();
    string sql = string.Format("select {0},{1} from {2}",
           db.QuoteIdentifier("name"),
           db.QuoteIdentifier("age"),
           db.QuoteIdentifier("user"));
}

 

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 是否是通过DbTransaction 方法建立的还是由外部手工设置的。

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对象(关于此对象见后文)。

 

 

数据命令的包装对象: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 发表于 2011-08-26 19:06 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"