惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
Cisco Talos Blog
Cisco Talos Blog
C
Check Point Blog
博客园_首页
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Martin Fowler
Martin Fowler
Recorded Future
Recorded Future
S
Security @ Cisco Blogs
L
LINUX DO - 最新话题
博客园 - 司徒正美
P
Privacy International News Feed
G
Google Developers Blog
I
Intezer
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
C
Cybersecurity and Infrastructure Security Agency CISA
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Scott Helme
Scott Helme
K
Kaspersky official blog
I
InfoQ
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Webroot Blog
Webroot Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
大猫的无限游戏
大猫的无限游戏
D
Docker
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Microsoft Azure Blog
Microsoft Azure Blog
Spread Privacy
Spread Privacy
量子位
H
Hacker News: Front Page
Simon Willison's Weblog
Simon Willison's Weblog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
SecWiki News
SecWiki News
S
Security Affairs
Latest news
Latest news
人人都是产品经理
人人都是产品经理
C
CERT Recently Published Vulnerability Notes
S
Security Archives - TechRepublic
V
Visual Studio Blog
T
Troy Hunt's Blog
S
Secure Thoughts
F
Fortinet All Blogs
V
V2EX
The Register - Security
The Register - Security
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - faib

代码生成器(CodeBuilder) 2.9.4 稳定版 代码生成器(CodeBuilder) 2.9.3 稳定版 Fireasy新版本发布 Winform快速开发组件的实现(二) Winform快速开发组件的实现(一) 注意Activator.CreateInstance两个重载方法的性能 Fireasy.Data系列——发布测试版本 Fireasy.Data系列——线程内IDatabase的传递 Fireasy.Data系列——数据库架构的整合查询 Fireasy.Data系列——数据库提供者的插件服务簇 Fireasy.Data系列——几种数据库的大数据批量插入 Fireasy.Data系列——概述 我想组建新的Entity框架 轻量的Json序列化 ReSharper 不为人知的罪恶选项 AxTools.VS10x.CodeMap注册机 3个月时间完成工作流项目 历时半年,发布最完整的代码生成器CodeBuilder最新版本 最新版本的CodeBuilder 1.0.0.1446
Fireasy.Data系列——底层结构
faib · 2012-04-18 · via 博客园 - faib

    Fireasy.Data的一个主要接口是IDatabase,这个与网上流传的SqlHelper差不多是完成一样的操作。不过,在IDatabase中只提供了几个高内聚的方法,你不必去传递那些DbCommand和DbParameter。不同的数据库类型,都提供实现IProvider接口的类,来指定DbProviderFactory,以及各种的IProviderService组合来实现更多的功能。

    下面先来看一下有关IDatabase及周围的一些接口组合:

    1、IDatabase接口

    在Fireasy.Data中,IDatabase是最底层的接口,它提供了以下几个属性和方法:

    ConnectionString:数据库的连接字符串对象。

    Provider:为IDatabase提供的不同数据库的实现,也是一个重要的接口,这个将在后面进行介绍。

    BeginTransaction:开始数据库事务,加上了事务锁,如果IDatabase之前已经开始了事务,再将调用该方法是将返回false。

    CommitTransaction:提交数据库事务,如果是与BeginTransaction方法匹配的,则可以提交,否则返回false。

    RollbackTransaction:回滚数据库事务,如果是与BeginTransaction方法匹配的,则可以回滚,否则返回false。

    ExecuteDataTable:执行一个查询语句,将结果以DataTable返回。

    ExecuteEnumerable:执行一个查询语句,将结果以T序列返回,可以指定你的IDataRowMapper来进行转换,默认是使用DefaultRowMapper。

    ExecuteNonQuery:执行一个查询语句,返回影响的行数。

    ExecuteReader:执行一个查询语句,以IDataReader返回结果。

    ExecuteScalar:执行一个查询语句,返回第一行的第一列。

    FillDataSet:执行一个查询语句,将结果填充到DataSet。

    Update:将一个DataTable的改动保存到数据库。

    2、IProvider接口

    IProvider针对不同的数据库类型,提供其实现类,它的一个主要属性是DbProviderFactory。一般数据库的驱动都基于Ado.Net,因此它们就必须提供自己的DbProviderFactory。DbProviderFactory用于创建DbConnection、DbCommand、DbParameter等实例。

    另外,IProvider还提供了一组方法,方便将一些扩展的接口以插件的方式注入到Provider中。目前提供的插件服务接口有IBackupProvider、IBatcherProvider、ISyntaxProvider、IGeneratorProvider、ISchemaProvider、ICommandWatcher和ITranslateProvider。

    RegisterService:注册一个插件服务实例。这些实例必须是实现IProviderService接口。

   GetServices:获取所有的已注册的插件实例。

    GetService:获取指定类型的插件服务实例。

    3、IBackupProvider接口

    该接口为数据库提供者提供数据库的备份与恢复操作,目前只是一个雏形,只有MsSql实现了该接口。

    Backup:备份指定的数据库到指定的文件。

    Restore:从指定的文件恢复数据库。

    4、IBatcherProvider接口

    该接口为数据库提供者提供数据的批量插入支持。大部份数据库,如MsSql、MySql、Oracle、SQLite都提供了批量插入数据的方法,因此只要实现该接口方法就可以批量插入数据了。在Fireasy中,已经为四种数据库类型实现了批量插入的方法。以后会逐一介绍。

   Insert:将一整个DataTable里的数据一次性或分批写入到数据库。

    5、ISyntaxProvider接口

    该接口为数据库提供者提供SQL语法解析的支持。众所周知,一个Length函数在不同的数据库中写法都可能不相同,因此ISyntaxProvider提供了对字符串、日期、数学运算三组语法的解析,还有存储参数前缀、字段前导后导符,分页方法、数据类型转换等多种方法。

    StringSyntax:字符串函数的解析类,里面的方法不再介绍了。

    DateTimeSyntax:日期函数的解析类,里面的方法不再介绍了。

    MathSyntax:数学运算函数的解析类,里面的方法不再介绍了。

    IdentitySelect:获取最近创建的自动编号的查询文本。

    Segment:对Sql语法使用IDataSegment进行分段处理,返回添加了分段语法的后的sql。

    Convert:将字段转换为指定的数据类型,如cast(name, nvarchar)。

    Column:生成相应类型的数据类型关键字,如MsSql里将DbType.String生成nvarchar。

    Coalesce:如果源表达式为 null,则依次判断给定的一组参数,直至某参数非 null 时返回,这个就象是C#里的 var db = str1 ?? str2 ?? str3。

    6、ISchemaProvider接口

    该接口为数据库提供者提供数据库架构的查询,可以返回如表、字段这些信息的元数据。

    GetSchemas<T>:获取指定T类型的架构信息,T是实现自ISchemaMetadata,如Table、Column、Procedure等。可以使用表达式对架构进行查询,如GetSchemas<Table>(s => s.TableName == “Product”)。

    GetSchemas:这个与DbConnection里的方法一样,返回一个DataTable。

    7、ICommandWatcher接口

    该接口应该与数据库提供者无关,它只是切入IDatabase内部,在执行Sql的时候使用该接口进行外部通知。

    Notify:通知外部程序,所执行的Sql以及耗用的时间。

    8、ITranslateProvider接口

    该接口为数据库提供者提供实体Linq查询的解析,你可以书写一些Linq查询,然后交给该接口进行解析,最终得到数据库能够执行的Sql。考虑到这部份的复杂性,将单独开几篇文章进行介绍。

    Fireasy.Data最底层的接口主要就是围绕IDatabase和IProvider组织的,如果以后需要对IDatabase的功能进行扩充,我们只需要定义一个新的接口继承自IProviderService,然后在相应的Provider内进行注册,当然还提供了Provider的配置,可以方便的进行组合。

    Fireasy.Data底层的介绍就是这些,不知道你对Fireasy.Data有没有一个大概的认识了,不妨了说说你的想法。