使用自定义SQL,或者存储过程。仍然使用:DbExecutor ,没错,其实框架最终执行,都是到这个类里把生成的SQL传进来的。
因此你也可以使用自己传进来的SQL进行执行你想要的结果。
我们先看下这里面有哪些方法吧。(其实很像你们以前接触过的:DbHelper....)
1 /// <summary> 2 /// 返回第一行第一列数据 3 /// </summary> 4 /// <param name="cmdType">执行方式</param> 5 /// <param name="cmdText">SQL或者存储过程名称</param> 6 /// <param name="parameters">参数</param> 7 public object ExecuteScalar(CommandType cmdType, string cmdText, params DbParameter[] parameters) 8 9 /// <summary> 10 /// 返回受影响的行数 11 /// </summary> 12 /// <param name="cmdType">执行方式</param> 13 /// <param name="cmdText">SQL或者存储过程名称</param> 14 /// <param name="parameters">参数</param> 15 public int ExecuteNonQuery(CommandType cmdType, string cmdText, params DbParameter[] parameters) 16 17 /// <summary> 18 /// 返回数据(IDataReader) 19 /// </summary> 20 /// <param name="cmdType">执行方式</param> 21 /// <param name="cmdText">SQL或者存储过程名称</param> 22 /// <param name="parameters">参数</param> 23 public IDataReader GetReader(CommandType cmdType, string cmdText, params DbParameter[] parameters) 24 25 /// <summary> 26 /// 返回数据(DataSet) 27 /// </summary> 28 /// <param name="cmdType">执行方式</param> 29 /// <param name="cmdText">SQL或者存储过程名称</param> 30 /// <param name="parameters">参数</param> 31 public DataSet GetDataSet(CommandType cmdType, string cmdText, params DbParameter[] parameters) 32 33 /// <summary> 34 /// 返回数据(DataTable) 35 /// </summary> 36 /// <param name="cmdType">执行方式</param> 37 /// <param name="cmdText">SQL或者存储过程名称</param> 38 /// <param name="parameters">参数</param> 39 public DataTable GetDataTable(CommandType cmdType, string cmdText, params DbParameter[] parameters)
CommandType cmdType:枚举,意为要使用哪种命令传输。
1 namespace System.Data 2 { 3 // 摘要: 4 // 指定如何解释命令字符串。 5 public enum CommandType 6 { 7 // 摘要: 8 // SQL 文本命令。(默认。) 9 Text = 1, 10 // 11 // 摘要: 12 // 存储过程的名称。 13 StoredProcedure = 4, 14 // 15 // 摘要: 16 // 表的名称。 17 TableDirect = 512, 18 } 19 }
string cmdText:SQL语句,或者存储过程的名称。
params DbParameter[] parameters:参数列表
比如:
1 //最原始的方式。 2 using (DbExecutor db = new DbExecutor(DataBaseType.SqlServer, "User ID=sa;Password=123456;Pooling=true;Data Source=.;Initial Catalog=Farseer;", 30, System.Data.IsolationLevel.ReadCommitted)) 3 { 4 // 执行插入的操作。 5 db.ExecuteNonQuery(System.Data.CommandType.Text, "insert into users(UserName,RoleID) Values('张三',0)"); 6 // 操作完成后,记得要关闭,释放资源。 如果你像我这样使用了using 下面是可以不用执行的。如果没用,则必须加上。 7 db.Close(true); 8 }
上面DEMO,是做了一个插入的操作。ExecuteNonQuery 返回 “影响的行数” int 类型。 意思是数据库表中记录的影响行数。
1 // 利用DbFactory,创建了DbExecutor对象 2 // 第1个参数 0 代表的是数据库配置:DbConfig 的索引项。在:~/App_Data/Db.config 中 3 using (DbExecutor db = DbFactory.CreateDbExecutor(0, System.Data.IsolationLevel.ReadCommitted)) 4 { 5 // 执行插入的操作。 6 DataTable dt = db.GetDataTable(System.Data.CommandType.Text, "select * from users"); 7 // 可以依赖扩展方法把DataTable 转成 List<User> 哦 8 List<Users> lst = dt.ToList<Users>(); 9 // 操作完成后,记得要关闭,释放资源。 如果你像我这样使用了using 下面是可以不用执行的。如果没用,则必须加上。 10 db.Close(true); 11 }
上面DEMO中。使用GetDataTable方式,获取DataTable。框架对DataTable 提供了 转到 List 实体类的扩展方法哦。
1 // 利用Users泛型,创建了DbExecutor对象 2 // 会通过对Users缓存的反射结果,查询这个实体的数据库连接方式。(其实还是转到数据库配置索引项) 3 using (DbExecutor db = DbFactory.CreateDbExecutor<Users>(System.Data.IsolationLevel.ReadCommitted)) 4 { 5 // 这里,我们用了一个新的类:SqlServerProvider 或者 DbProvider 6 // SqlServerProvider 继承在 DbProvider 7 var provider = new SqlServerProvider(); 8 9 10 // 或者也可以用 DbFactory.CreateDbProvider 通过传入的Users 来判断你的数据库类型(有可能你的不是SqlServer) 11 // DbProvider 是用来为我们提供不同数据库的一些特性。比如下文中的创建数据库的参数,或者数据库的保护符号,或者参数符号的前缀。不同数据库的这些都是不一样的。 12 var provider = DbFactory.CreateDbProvider<Users>(); 13 14 15 db.ExecuteNonQuery(System.Data.CommandType.Text, "update users set username = @userName where id = @id", provider.CreateDbParam("userName", "张三", DbType.String, 50)); 16 }
这种方式,采用了 参数的方式进行提交。可以避免 ASP当时最危险的漏洞:SQL注入
什么是DbProvider,我们先看下DbProvider的工作方式,如下图:
每个数据库类型都会包含有自己的Provider。 这个Provider主要是提供数据库的特有的特性。
举个例子,在Sqlserver中。对于表名、字段名的保护符号是:[] 中括号。为了避免一些名称定义成SQLSERVER特有的关键词,可以理解为是一种转义符。而MySql用的是: ‘’ 两个单引号。
怎么样?感觉是不是又回到了DbHelper的时代了。如果你担心ORM的性能慢,有这种强破症,你完全可以使用这种方式进行底层的访问。
按这种ORM性能的程度访问,可以分为三种:
完全使用ORM,返回List实体。
只使用ORM的操作,但返回DataTable数据。少了DataTable转到实体的性能消耗(非常昂贵的,貌似外文书都是这么翻译的)。
完全不使用。回到DbHelper方式。
以上三种方式都是支持的。
QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net
Farseer.Net是一款ORM框架 + 常用工具 + 扩展集合。
Farseer 意为:先知、预言家 通常在某些场合时,提供计谋、策略。也希望该框架能给大家提供最大化的便捷。
ORM:其英文全称是:Object(对象) Relational(关系) Mapping(映射)
Farseer.Net的目标是:快速上手、快速开发、简单方便。
1 new User { ID = 1, Name = "张三" }.Insert()