我的KT库之----数据库的操作(DbCommandBuilder/DbConditionBuilder)
了解或者认识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;
在这节里,将会向大家介绍两个用于构造数据查询命令的对象。
数据库命令构造对象:DbCommandBuilder
不知道大家在平常做数据库操作时,是不是经常写INSERT或UPDATE两条SQL语句?如果是并且还在使用SQL语句拼接的话,那DbCommandBuilder就非常适合你的使用,它可以帮你构造生成INSERT或者UPDATE的参数化SQL语句。
DbCommandBuilder的实例方法是需要你传递一个“表名”与“DbHelper”对象,如下面示例代码:
using (DbHelper db = new DbHelper(connection)) { DbCommandBuilder command = new DbCommandBuilder("user", db); }
表示将对"user”表进行构造INSERT或者UPDATE语句。
DbCommandBuilder的方法
1、AddField : 增加一个字段值。对于INSERT语句来说,这个字段将是会插入到表里;对于UPDATE语句来说,这个字段将是会被更新的。
command.AddField("name", DbType.String, 10, "张三"); command.AddField("age", DbType.Int32, 20);
注: 此方法有多个重载版本,用于处理字段值的参数化。
2、AddCondition : 增加一个条件字段值。在构造UPDATE语句时才需要使用。
command.AddCondition("id", DbType.Int32, 1);
注: 此方法有多个重载版本,用于处理字段值的参数化。
3、GetParameter : 获取某个字段参数。只能获取在AddField或者AddCondition方法添加的字段参数。
4、ContainParameter : 判断是否存在某个字段参数,只能判断在AddField或者AddCondition方法添加的字段参数。
5、Insert : 执行INSERT语句命令
DbCommandBuilder command = new DbCommandBuilder("user", db); command.AddField("name", DbType.String, 10, "张三"); command.AddField("age", DbType.Int32, 20); var r = command.Insert();
执行此方法后,将会在user表里插入一行数据,等同于执行以下sql语句
INSERT INTO `user` (`name`,`age`) VALUES (@name,@age)
6、Update : 执行UPDATE语句命令
DbCommandBuilder command = new DbCommandBuilder("user", db); command.AddField("name", DbType.String, 10, "张三"); command.AddField("age", DbType.Int32, 20); command.AddCondition("id", DbType.Int32, 1); var r = command.Update();
执行此方法后,将会更新user表里id=1的记录,等同于执行以下sql语句
UPDATE `user` SET `name`=@name,`age`=@age WHERE `id`=@id
7、ClearAll : 清空所有添加的字段值或者条件字段值
DbCommandBuilder的属性
1、DbHelper : 获取对应的DbHelper实例对象
2、TableName : 获取当前操作的表名
3、InsertCommandText : 获取当前字段构造的INSERT语句
DbCommandBuilder command = new DbCommandBuilder("user", db); command.AddField("name", DbType.String, 10, "张三"); command.AddField("age", DbType.Int32, 20); command.DbHelper.ExecuteNonQuery(command.InsertCommandText, command.Parameters);
上面的代码等同于直接执行command.Insert()方法。
4、UpdateCommandText : 获取当前字段构造的UPDATE语句
DbCommandBuilder command = new DbCommandBuilder("user", db); command.AddField("name", DbType.String, 10, "张三"); command.AddField("age", DbType.Int32, 20); command.AddCondition("id", DbType.Int32, 1); command.DbHelper.ExecuteNonQuery(command.UpdateCommandText, command.Parameters);
上面的代码等同于直接执行command.Update()方法。
5、Parameters : 获取当前字段值的参数。其返回的是一个数组,包含当前所有字段的参数值。
数据查询条件构造对象:DbConditionBuilder
在平时查询数据时,经常都要写不同的查询条件,如果你还是在拼接SQL条件语句,那么DbConditionBuilder也是非常适合你的使用,它可以帮你构造条件语句,并可以参数化处理条件值。
DbConditionBuilder的获取
直接从DbHelper对象里获取,例子:
var condition = this.DbHelper.CreateDBConditionBuilder();
DbConditionBuilder的方法
1、Add : 添加一个条件
var condition = this.DbHelper.CreateDBConditionBuilder(); condition.Add("id>1"); //简单添加一个条件,其条件关系是“and” condition.Add("id>2", DbConditionRelation.OR); //简单添加一个条件,其条件关系是“or” var par = db.CreateDbParameter("name", DbType.String, 20, db.EscapeString("张三")); condition.Add("name=" + par.ParameterName, par); //添加一个条件,并对条件值实行参数化处理,其条件关系是“and”
上面的条件语句为
id>1 OR id>2 AND name=@name
注意:对于没有进行参数化处理的值,为避免出现“注入”漏洞,请记得将字符串值转义处理!如上面的“db.EscapeString("张三")”
2、AddFormat : 添加一个条件,并可以进行格式化处理
var condition = this.DbHelper.CreateDBConditionBuilder();
condition.AddFormat("id>{0}", 1); //简单添加一个条件,其条件关系是“and” condition.AddFormat("name='{0}'", DbConditionRelation.OR, db.EscapeString("张三")); //简单添加一个条件,其条件关系是“or”
上面的条件语句为
id>1 OR name='张三'
注意:为避免出现“注入”漏洞,请记得将字符串值转义处理!如上面的“db.EscapeString("张三")”
3、AddCriteria: 添加一个查询条件
此方法有多个重载版本,是Add方法的快速写法,并且采用添加条件时采用参数化处理。
注:新版本都建议使用此方法添加条件。
4、BeginParentheses : 开始左括号的写入
5、EndParentheses : 结束括号的写入
var condition = this.DbHelper.CreateDBConditionBuilder();
condition.BeginParentheses(); condition.Add("id>1"); //简单添加一个条件,其条件关系是“and” condition.Add("id>2", DbConditionRelation.OR); //简单添加一个条件,其条件关系是“or” condition.EndParentheses(); var par = db.CreateDbParameter("name", DbType.String, 20, db.EscapeString("张三")); condition.Add("name=" + par.ParameterName, par); //添加一个条件,并对条件值实行参数化处理,其条件关系是“and”
上面的条件语句为
(id>1 OR id>2) AND name=@name
6、Clear : 清空所有条件
7、ToString : 已重写,输出带"WHERE“部分的条件语句
var condition = this.DbHelper.CreateDBConditionBuilder();
condition.BeginParentheses(); condition.Add("id<1000"); condition.BeginParentheses(); condition.Add("age>20", DbConditionRelation.OR); condition.Add("age<=30"); condition.EndParentheses(); condition.EndParentheses(); var par = db.CreateDbParameter("name", DbType.String, 20, string.Concat(db.EscapeString("张"), "%")); condition.Add("name like " + par.ParameterName, par); Console.WriteLine(condition.ToString());
上面代码将输出以下语句
WHERE (id<1000 OR (age>20 AND age<=30)) AND name like @name
DbConditionBuilder的属性
1、Condition : 获取当前的条件语句
var condition = this.DbHelper.CreateDBConditionBuilder();
condition.BeginParentheses(); condition.Add("id<1000"); condition.BeginParentheses(); condition.Add("age>20", DbConditionRelation.OR); condition.Add("age<=30"); condition.EndParentheses(); condition.EndParentheses(); var par = db.CreateDbParameter("name", DbType.String, 20, string.Concat(db.EscapeString("张"), "%")); condition.Add("name like " + par.ParameterName, par); Console.WriteLine(condition.Condition);
上面代码将输出以下语句
(id<1000 OR (age>20 AND age<=30)) AND name like @name
2、HasCondition : 判断构造器里面是否有条件
3、Parameters : 获取当前条件中的条件参数值