导航

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

上一篇:Farseer.net轻量级开源框架 中级篇: 执行SQL语句

下一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定

越讲到后面,我们离基础的语法越远了。看到这篇文章,先恭喜下,说明大家已经能用该框架做日常的开发了。

当然还有一些绑定技巧,比如把枚举、List<Users>绑定到DorpDownList、CheckBoxList、RadioButtonList 并显示中文 在下一篇中再解释。

这一篇中,我们主要讲解下用到的一个工厂模式的类:DbFactory。

国际惯例,先来看看这个类有哪些方法吧:全名空间,位于:FS.Core.Bean

 namespace FS.Core.Bean
{
/// <summary>
/// 数据库工厂模式
/// </summary>
public class DbFactory
{
/// <summary>
/// 创建数据库Sql生成
/// </summary>
/// <typeparam name="TInfo">实体类</typeparam>
/// <param name="dbType">数据库类型</param>
/// <param name="tableName">表名称</param>
internal static DbBuilder<TInfo> CreateDbBuilder<TInfo>(string tableName = "") where TInfo : ModelInfo, new(); /// <summary>
/// 创建数据库表达式树解析器
/// </summary>
/// <typeparam name="TInfo">实体类</typeparam>
/// <param name="dbType">数据库类型</param>
/// <param name="tableName">表名称</param>
internal static DbVisit<TInfo> CreateDbVisit<TInfo>() where TInfo : ModelInfo, new(); /// <summary>
/// 创建修改数据库类
/// </summary>
/// <param name="dbType">数据库类型</param>
/// <param name="connetionString">连接字符串</param>
/// <param name="tableName">要操作的表名</param>
public static DbOperate CreateDbOperate(DataBaseType dbType, string connetionString, string tableName); /// <summary>
/// 创建数据库提供者
/// </summary>
public static DbProvider CreateDbProvider<TInfo>() where TInfo : ModelInfo, new(); /// <summary>
/// 创建数据库提供者
/// </summary>
/// <param name="dbType">数据库类型</param>
public static DbProvider CreateDbProvider<TInfo>(DataBaseType dbType); /// <summary>
/// 创建数据库操作
/// </summary>
/// <typeparam name="TInfo">实体类</typeparam>
/// <param name="tranLevel">开启事务等级</param>
public static DbExecutor CreateDbExecutor<TInfo>(IsolationLevel tranLevel = IsolationLevel.Serializable) where TInfo : ModelInfo, new(); /// <summary>
/// 创建数据库操作
/// </summary>
/// <typeparam name="TInfo">实体类</typeparam>
/// <param name="tranLevel">开启事务等级</param>
public static DbExecutor CreateDbExecutor(int dbIndex = , IsolationLevel tranLevel = IsolationLevel.Unspecified); /// <summary>
/// 创建数据库连接字符串
/// </summary>
/// <param name="dbInfo">数据库配置</param>
public static string CreateConnString(int dbIndex = ); /// <summary>
/// 创建数据库连接字符串
/// </summary>
/// <param name="dataType">数据库类型</param>
/// <param name="userID">账号</param>
/// <param name="passWord">密码</param>
/// <param name="server">服务器地址</param>
/// <param name="catalog">表名</param>
/// <param name="dataVer">数据库版本</param>
/// <param name="connectTimeout">链接超时时间</param>
/// <param name="poolMinSize">连接池最小数量</param>
/// <param name="poolMaxSize">连接池最大数量</param>
/// <param name="port">端口</param>
public static string CreateConnString(DataBaseType dataType, string userID, string passWord, string server, string catalog, string dataVer, int connectTimeout = , int poolMinSize = , int poolMaxSize = , string port = "");
}
}

其实这里面主要是方法的调用,很简单。专门开一篇文章来讲,主要是考虑到这个类还是比较常用的。所以专门写了一篇这个文章,来加深大家的印象。

以上方法,大致分为:

  1. CreateDbBuilder
  2. CreateDbVisit
  3. CreateDbOperate
  4. CreateDbProvider
  5. CreateDbExecutor
  6. CreateConnString

以上六种。各自有一些重载版本。重载版本主要是对数据库配置的参数。可通过完全的手动编写数据库的选择,或者使用实体类映射,或者数据库配置三种方式。

提到数据库配置,可能大家会有疑问,那我的实体是怎么关联到数据库配置(DbConfig)的?我有多个数据库怎么办?请放心,这些框架都实现了,关于这个问题,在后面有专门的篇幅讲到。

现在一一来说明下这6个方法的作用吧。因为方法都比较简单。就各自说明下其作用就可以。

CreateDbBuilder

  创建DbBuilder。DbBuilder会因为不同的数据库类型,有相对应的派生类,比如有:SqlserverBuilder。

  而我们用工厂模式的目的,当然是为在切换数据库的时候,不用修改代码就可以正常运行。

  前面我们说到了很多Insert、Update、Delete、ToList 等等方法。其实它们最终的目地就是为了转成SQL语句,然后提交到数据库中。那么DbBuilder就是为了生成真正的SQL而产生的。

  比如:

         public override string ToTable(int pageSize, int pageIndex)
{
if (Map.ClassInfo.DataVer == "") { return base.ToTable(pageIndex, pageSize); }
if (pageIndex == ) { return base.ToTable(pageSize); } if (SortString.Length == ) { SortString.AppendFormat("ORDER BY {0} ASC", Map.IndexName); }
return string.Format(
"SELECT {0} FROM (SELECT {0},ROW_NUMBER() OVER({1}) as Row FROM {2} {3}) a WHERE Row BETWEEN {4} AND {5};",
GetFields(), SortString, TableName, WhereString, (pageIndex - ) * pageSize + , pageIndex * pageSize);
}

  上面,是摘自SqlserverDbBuilder中的方法。用的是重写方法。我们再看看DbBuilder中的方法又是如何的(SqlserverDbBuilder继承自DbBuilder中):

         public virtual string ToTable(int pageSize, int pageIndex)
{
// 不分页
if (pageIndex == ) { return ToTable(pageSize); }
if (SortString.Length == ) { SortString.AppendFormat("ORDER BY {0} ASC", Map.IndexName); } var sort2 = SortString.ToString().Replace(" DESC", " [倒序]").Replace("ASC", "DESC").Replace("[倒序]", "ASC"); return string.Format("SELECT TOP {1} {0} FROM (SELECT TOP {2} {0} FROM {3} {4} {5}) a {6};",
GetFields(), pageSize, pageSize * pageIndex, TableName, WhereString, SortString, sort2);
}

  是个虚方法,我们利用了Sqlserver ROW_NUMBER()的特性做了分页功能。所以我们不需要DbBuilder中的实现。

  到这里,大家明白了DbBuilder的作用了吧,就是用来生产Sql的。

CreateDbVisit

  创建CreateDbVisit。CreateDbVisit会因为不同的数据库类型,有相对应的派生类,比如有:SqlserverVisit。

  我们一直使用的是Lambda表达式来做条件的。比如:Where(o=>o.ID == 1)  或者:Select(o=>new { o.ID,o.UserName } );

  那么DbVisit的目地就是用来解析这些过程。解析过程用的是对表达式树的解析:Expression<Func<实体类,bool>>

  将这些Lbmbda表达式树进行解析成数据库所有识别的SQL语句。换句说话就是解析表达式树Expression

CreateDbOperate

  创建CreateDbOperate。CreateDbOperate会因为不同的数据库类型,有相对应的派生类,比如有:SqlserverOperate。

  这个类的作用是对数据库进行物理操作。比如创建表、创建字段、删除字段、修改字段等。

  当然,通常我们对数据库的维护是使用SQL Server Management Studio ,但不除排有些项目,需要能实现让客户自定义物理字段的可能。(当然有些是利用JSON结构之类的,这里就不展开讲解了)

  这个方法比较少用到,大家有所了解就行。知道有这么个方法。具体需要使用的时候,可以在源码里查看返回的类里面所包含的有哪些方法。

CreateDbProvider

  创建CreateDbProvider。CreateDbProvider会因为不同的数据库类型,有相对应的派生类,比如有:SqlserverDbProvider。

  什么是DbProvider,我们先看下DbProvider的工作方式,如下图:

  

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

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

CreateDbExecutor

  创建CreateDbExecutor。框架最终执行,都是到这个类里把生成的SQL传进来的。因此你也可以使用自己传进来的SQL进行执行你想要的结果。

  前面两章:事务、SQL执行都用到了这个方法。这里不作解讲了。

CreateConnString

  创建CreateConnString。创建数据库的连接字符串。我们知道不同的数据库、不同的数据库的版本,对应的ConnnectionString 都会不一样。

  那么这个方法的目地就是为了创建不同数据库的连接字符串了。查看过~/App_Data/Db.Config应该知道,为个配置文件,用的不是连接字符串,而是采用:

 <?xml version="1.0"?>
<DbConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DbList>
<DbInfo>
<Server>.</Server>
<UserID>sa</UserID>
<PassWord>123456</PassWord>
<DataType>SqlServer</DataType>
<DataVer>2005</DataVer>
<Catalog>Farseer</Catalog>
<PoolMinSize>16</PoolMinSize>
<PoolMaxSize>100</PoolMaxSize>
<ConnectTimeout>30</ConnectTimeout>
<CommandTimeout>60</CommandTimeout>
</DbInfo>
</DbList>
</DbConfig>

这种格式进行对数据库的配置。那么,框架就是利用这个方法来生成数据库连接字符串的。

好啦,这篇文章就讲解到这里,发觉越讲越多内容需要说明。。。。。。

导航

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

上一篇:Farseer.net轻量级开源框架 中级篇: 执行SQL语句

下一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定

广告时间

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

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

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

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

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

 new User { ID = , Name = "张三" }.Insert()

Farseer.net轻量级开源框架 中级篇:DbFactory数据工厂的更多相关文章

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

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: Where条件的终极使用 下一篇:Farseer.net轻量级开源框架 中级篇: ...

  2. Farseer.net轻量级开源框架 中级篇:执行SQL语句

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 事务的使用 下一篇:Farseer.net轻量级开源框架 中级篇: DbFacto ...

  3. Farseer.net轻量级开源框架 中级篇:数据绑定

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

  4. Farseer.net轻量级开源框架 中级篇:自定义配置文件

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 数据绑定 下一篇:Farseer.net轻量级开源框架 中级篇: 动态数据库访问 ...

  5. Farseer.net轻量级开源框架 中级篇:Cookies、Session、Request

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 探究ORM(Mapping) 下一篇:Farseer.net轻量级开源框架 中级篇 ...

  6. Farseer.net轻量级开源框架 中级篇:UrlRewriter 地址重写

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: Cookies.Session.Request 下一篇:Farseer.net轻量 ...

  7. Farseer.net轻量级开源框架 中级篇:常用的扩展方法

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: BasePage.BaseController.BaseHandler.BaseM ...

  8. Farseer.net轻量级开源框架 中级篇:BasePage、BaseController、BaseHandler、BaseMasterPage、BaseControls基类使用

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: UrlRewriter 地址重写 下一篇:Farseer.net轻量级开源框架 中 ...

  9. Farseer.net轻量级开源框架 中级篇:探究ORM(Mapping)

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: SQL执行报告 下一篇:Farseer.net轻量级开源框架 中级篇: Cooki ...

随机推荐

  1. Windows 2008 R2 SP1部署WSUS 3.0 SP2

    1 实验环境 1)域: 域名为fengxja.com: 网段:192.168.0网段,不连接外网. 域功能级别和林功能级别为Windows server 2003模式. 2)DC服务器: 域控制器: ...

  2. ISkyShop B2B2C 商城系统V1.0正式版隆重公布

    ISkyShop核心开发团队结合7年电商开发经验,历经1年多时间的设计研发,于2014年6月12日隆重推出ISkyShop B2B2C 商城系统V1.0,B2B2C商城系统是ISkyShop独立自主研 ...

  3. 解决VS命令提示符 “Setting environment for using Microsoft Visual Studio. 此时不应有“系列错误

    一.起因 近期在玩Boost库.当然首先是要进行Boost库的安装和配置.于是浅墨Google了一下boost库的安装配置攻略.下载了最新版1.55的boost库.就愉悦地開始进行配置了. 当进行到第 ...

  4. 【Record】ART:Android RunTime

    资料来自url=9xdxrhR45Uj3p450JQvTUO-dmzcWswNmABVgYAaFS0AXYDi8Q2JOzvu7y33GIOAI_8Lz7JmLrl0x6DoRW8e5oa" ...

  5. Binary Tree Maximum Path Sum 自底向上求解(重重重重)

    题目: 链接 解答: 自底向上求解.left_max right_max分别返回了左右子树的最大路径和,假设左右子树最大路径和小于0.那么返回零. 用这个最大路径和和根节点的值相加.来更新最大值,同一 ...

  6. Linux Centos7 Apache 訪问 You don&#39;t have permission to access / on this server.

    折腾了非常久,今天才找到了最正确的答案.感言真不easy. 百度出来的99%都是採集的内容.全都是错误的. You don't have permission to access / on this ...

  7. 《软件project》——编码

       编码的目的是使用选定的程序设计语言,把模块的过程描写叙述翻译为用该语言书写的源程序. 源程序应该正确可靠.简明清晰,并且具有较高的效率.在编程的步骤中,要把软件具体设计的表达式翻译成为编程语言的 ...

  8. js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq

    js_html_input中autocomplete="off"在chrom中失效的解决办法 分享网上的2种办法: 1-可以在不需要默认填写的input框中设置 autocompl ...

  9. iOS 特定图片的button的旋转动画

    近期做的东西中,要为一个有特定图片的button加入旋转动画,Demo代码例如以下: #import "ViewController.h" @interface ViewContr ...

  10. 展开阅读全文 js 爬虫操作

    from selenium import webdriver import time import random from bs4 import * browser = webdriver.Chrom ...