zoukankan      html  css  js  c++  java
  • 我的KT库之数据库的操作(DbHelper)

    了解或者认识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);
  • 相关阅读:
    Eclipse设置智能提示
    【GoLang】golang 如何像Java 一样通过类名反射对象?
    【GoLang】golang 面向对象编程 & 面向接口编程
    【Nginx】nginx 代理 Haproxy 怎么设置?
    【GoLang】GoLang struct 使用
    【GoLang】50 个 Go 开发者常犯的错误
    【GoLang】与或非 异或操作
    【GoLang】GoLang UTF8 与 Unicode
    【GoLang】GoLang 错误处理 -- 异常处理思路示例
    【GoLang】GoLang 的流程与函数
  • 原文地址:https://www.cnblogs.com/kingthy/p/2155058.html
Copyright © 2011-2022 走看看