我的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、Open与Close : 打开/关闭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);