SelectDataTable
项目地址 : https://github.com/kelin-xycs/SelectDataTable
SelectDataTable
一个 用 C# 实现的 用 Sql select DataTable 资料 的 程序
这是一个 用 C# 实现的 用 Sql select DataTable 资料 的 程序 。 最初的 目的 是 为 面向 数据集 的 开发 提供一个方便的工具 。
后来 衍生出了 语法分析 编译原理 的 内容 。
面向 数据集 的 开发 , 简单讲 可以 就是 Sql + DataTable 。 这是一种 简单直接 的 开发方式 。
Sql 是 开发人员 信手拈来 的 技能, 也是一个 成熟的 通用的 接口 。 用 Sql 操作 数据集 会 很方便 。
这个程序 支持 简单的 select 语句 , 支持 + - * / and or not = > < >= <= != 运算 。
支持 * 号 (表示要 select 全部 栏位) 。
支持 中括号 [] , 比如 栏位名 和 关键字 重名, 可以用 中括号 [] 括起来 。
Sql 中 from 关键字 后面 的 表名 是 “dt” , 这是 固定 的 。
select 的 结果 是 一个 新的 DataTable 。
支持 用 字符串 表示 日期时间 格式 。 比如 where create_date > '2016-07-08' 。
会判断 与之比较的 栏位 如果是 DateTime 类型 , 则 把 字符串 转为 DateTime 类型 再进行 比较 。
计划支持 sum() count() 等 函数 , 以及 group by order by , 目前 还 没有支持 。 这些特性 应该会比较有 实用价值 。
不支持 表连接 。 基本上, 未来也不会支持。 ^^ 因为 表连接 会 让事情变得复杂 。 在 应用程序层 没有索引 的 情况 下 做 表连接 会变得 效率低下 。 表连接 还是 放在 关系数据库 里 进行 比较好 。
不支持 子查询 。 子查询 也是 复杂的 。 实际中 可以 对 select 返回 的 DataTable 再 select 就行 。
这个程序 的 核心部分 是 Sql 解析部分 。 这部分 以及可以作为一个 简单的 语法分析器 了。 ^^
Sql 解析部分 的 设计 如下 :
有 3 个 解析类 : Parser, ExpressParser, SqlParser 。
Parser 是 基本 的 解析类, 负责 分词(Word) 和 获取 包裹符(Wrapper) 内 的 内容(Content) 。
这里 的 词(Word) 不是 单词, 是指 有意义的一个文本段落 。 分词规则 根据 语法规则 而定 。
比如 在 Sql 里, 是 根据 包裹符(Wrapper) 和 白空(White Space) 来 分词 。 在 C\C++ 里, 是 根据 大括号{} 和 分号; 来 分词 。
在 SelectDataTable 里 , 首先, 根据 包裹符 分词, 包裹符 有 3 种 : 单引号' 中括号[] 小括号() 。
根据 包裹符 分词 以后, 可以 得到 未被包裹(NonWrapped) 的 Word , 那么,就在 未被包裹 的 Word 里 寻找 关键字, 比如 select from where 等 。
然后 根据 关键字 再 分词, 比如 select 和 from 之间 的 就是 columnList Word , where 关键字 之后的 就是 where 条件 Word 。
接下来 就 进一步 解析 columnList Word 和 where 条件 Word 。
columnList Word 的 解析比较简单, 直接 Split(',') , 再 去掉 栏位名 外面的 中括号 。
where 条件 的 解析 由 ExpressParser 负责 。
Express(表达式) 的 解析 同样 是 先分词(Word) , 同样 也 先 根据 包裹符 分词 , 然后 在 未被包裹 的 Word 中 寻找 运算符 。
这是 第一遍 扫描 。
第二遍 扫描 则是 根据 运算符 来 分词(Word) ,运算符 两边 的 Word 又作为 Express(表达式) 再交给 ExpressParser 递归解析 。
SqlParser 负责 总体 的 解析 工作 。 包括 调用 Parser 和 ExpressParser , 以及 获取 ColumnList 和 寻找 KeyWord 。
ColumnList 是 select 关键字 后面 要 select 的 栏位列表 。
总体的 解析结果 是 返回 ColumnList 和 Express 对象嵌套 , 没有 生成 目标代码 。 如果 生成 目标代码 , 那就是 编译原理 了 。 呵呵
还好 C# 支持 dynamic 类型 。 不然 处理 不同数据 类型 之间 的 运算 会 搞死 。
就以 加法 为例 , 加法支持 int long float double decimal string 6 种 类型 。 其中 前 5 种 数值类型 是 可以互相 相加 的 。 那么 就要 判断 5 * 5 = 25 种 情况, 再 加上 string 的 2 种 情况 , 要 判断 27 种 情况 。 这还只是 加法 。 呵呵
文本解析 的 部分 没有用 正则表达式 。 而是 用 串操作 。 因为 我不会 正则表达式 。 正则表达式 难写 , 更难读 。 呵呵
项目 里 有一个 类 StrUtil , 可以 方便 的 进行 串操作 和 文本解析 。 ^^
SelectDataTable的更多相关文章
- 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)
原本关于T4模板原想分5个章节详细解说的,不过因为最近比较忙,也不想将整个系列时间拉得太长,所以就将它们整合在一块了,可能会有很多细节没有讲到,希望大家自己对着代码与模板去研究. 本章代码量会比较大, ...
- SubSonic3.0插件分页查询速度测试
使用SubSonic3.0一段时间了,一直都想找机会测试一下各种查询分页速度,对比一下插件的查询效率到底怎么样,所以昨天写好了测试程序,准备好1K.1W.10W.50W和100W记录的数据表,早上详细 ...
- Wijmo 日历插件
说明: 因为项目(OA)的需要,我负责开发日程的模块,相信大家用过谷歌的日历了吧,是不是觉得挺好用,但又苦于无法实现? 这里告诉你一个很好的插件,Wijmo,而里面有一个类似谷歌的日历事件插件,真的很 ...
- 我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 HtmlCore
大家好 , 我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 , 名字叫 HtmlCore . 项目的一个主要目标是可以用 .Net 在 移动设备 上 开发 GUI 程序 (界面程 ...
- 我发起了一个 .Net 平台上的 NewSql 数据库 BabanaDB
发起这个项目的起因, 是偶然看到一个网友发的 MongoDB 的 新闻, 我想, 像 MongoDB 这样的 非关系数据库 ,随时 都可以写 很多个, 真正 难写 的 是 关系数据库, 非关系数 ...
- 我发起并创立了一个 VMBC 的 子项目 D#
大家好, 我发起并创立了一个 VMBC 的 子项目 D# . 有关 VMBC , 请参考 <我发起了一个 用 C 语言 作为 中间语言 的 编译器 项目 VMBC> https ...
- 我发起了一个 .Net 平台上的 开源项目 知识图谱 Babana Map 和 文本文件搜索引擎 Babana Search
起因 也是 前几天 有 网友 在 群 里发了 知识图谱 相关的文章, 还有 有 网友 问起 NLog -> LogStash -> Elastic Search 的 问题, ...
随机推荐
- win10下安装scala流程及问题
第一步:Java 设置 检测方法前文已说明,这里不再描述. 如果还为安装,可以参考我们的Java 开发环境配置. 接下来,我们可以从 Scala 官网地址 http://www.scala-lang. ...
- 强化学习4-时序差分TD
之前讲到强化学习在不基于模型时可以用蒙特卡罗方法求解,但是蒙特卡罗方法需要在每次采样时生产完整序列,而在现实中,我们很可能无法生成完整序列,那么又该如何解决这类强化学习问题呢? 由贝尔曼方程 vπ(s ...
- ASCII码,utf-8
ASCII:0-127表示英文,128-255每个国家编码不一样,汉字要使用两个字节,为了和0-127区别,首位都要是1,uriEncode就是把字符转换成ASCII码. utf-8,一个字节的,和a ...
- 通过调整浏览器UA设置欺骗限制上网
先上图片, 通过调整浏览器UA,欺骗识别,原来这个WIFI是只能手机端使用的,打开IE F12,进行如上图所示,进行修改,正常输入手机号,获取验证码,登陆后,即可上网了.虽然显示的是400,但实际 ...
- git中工作区,缓存区,本地库,远程库的简要区别
git中工作区,缓存区,本地库,远程库的简要区别 实际上前三个名词对应到实体,都是你从远程仓库克隆下来的那个项目目录!只不过工作区就是你实际看到的目录和目录里的内容,当你修改/添加/删除了从远程仓库c ...
- javascript性能优化之Dom编程性能调优总结
1.最小化的Dom访问,在一次Dom访问做尽可能多的操作: 2.使用局部变量存放指向反复访问的元素节点的Dom引用,原则上js代码中不应该重复获取同一个元素节点,除非它在运行过程中发生改变: 3.对元 ...
- 爬虫框架存储pymysql方式
爬虫框架存储pymysql方式# -*- coding: utf-8 -*-import pymysql# Define your item pipelines here## Don't forget ...
- 2019-03-01-day002-基础编码
01 昨日内容回顾 编译型: 一次性编译成二进制. 优点:质型速度快. 确定:开发效率低,不能跨平台. 解释型: 逐行解释,逐行运行. 优点:开发效率高,可以跨平台. 缺点:回字形效率低. pytho ...
- 性能测试-10.数据分析Analysis
Analysis Summary 平均响应时间(Average TransactionResponse Time) 每秒响应数(Transactions per Second) 1.Vuser Ru ...
- js--未来元素
通过动态生成的标签,在生成标签直接绑定事件是无效的. eg:html标签 <div id="tree"> </div> <script> $(' ...