zoukankan      html  css  js  c++  java
  • Farseer.net轻量级开源框架 中级篇:执行SQL语句

    导航

    目   录:Farseer.net轻量级开源框架 目录

    上一篇:Farseer.net轻量级开源框架 中篇: 事务的使用

    下一篇:Farseer.net轻量级开源框架 中级篇: DbFactory数据工厂

    使用自定义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,我们先看下DbProvider的工作方式,如下图:

    每个数据库类型都会包含有自己的Provider。 这个Provider主要是提供数据库的特有的特性。

    举个例子,在Sqlserver中。对于表名、字段名的保护符号是:[]  中括号。为了避免一些名称定义成SQLSERVER特有的关键词,可以理解为是一种转义符。而MySql用的是:  ‘’  两个单引号。

    总结

     怎么样?感觉是不是又回到了DbHelper的时代了。如果你担心ORM的性能慢,有这种强破症,你完全可以使用这种方式进行底层的访问。

    按这种ORM性能的程度访问,可以分为三种:

    完全使用ORM,返回List实体。

    只使用ORM的操作,但返回DataTable数据。少了DataTable转到实体的性能消耗(非常昂贵的,貌似外文书都是这么翻译的)。

    完全不使用。回到DbHelper方式。

    以上三种方式都是支持的。

    导航

    目   录:Farseer.net轻量级开源框架 目录

    上一篇:Farseer.net轻量级开源框架 篇: 事务的使用

    下一篇:Farseer.net轻量级开源框架 中级篇: DbFactory数据工厂

    广告时间

    QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net

    Farseer.Net是一款ORM框架 + 常用工具 + 扩展集合。

    Farseer 意为:先知、预言家 通常在某些场合时,提供计谋、策略。也希望该框架能给大家提供最大化的便捷。

    ORM:其英文全称是:Object(对象) Relational(关系) Mapping(映射)

    Farseer.Net的目标是:快速上手、快速开发、简单方便。

    1 new User { ID = 1, Name = "张三" }.Insert()
  • 相关阅读:
    序列、元组、列表(基本的增、删、改、查)
    Python基础运算符(算数、比较、赋值、逻辑、成员)
    2015年9月14日记事
    2014年3月31日梦
    华为S5700系列交换机配置文件导出、导入
    C语言单链表简单实现(简单程序复杂化)
    北邮《大学英语2》第三次阶段作业带答案
    C++走向远洋——30(六周,项目一1.0)
    C++走向远洋——29(长方柱类)
    C++走向远洋——28(项目三,时间类,2)
  • 原文地址:https://www.cnblogs.com/steden/p/4078518.html
Copyright © 2011-2022 走看看