CYQ.Data 轻量数据层之路 V3.5版本发布-[开启同语句多数据库运行支持]

简介:

前言:

继正式发布V3.0到现在,刷的一下又20天过去了,而框架随着“路过秋天版博客”的开发,始终没停下,一直在前进!!!

目前博客正在慢悠悠的开发着~~~最近花了很多时间看动漫去了,哈哈~~~~

下面就整体介绍下V3.5的更新,及V3.0中没介绍的新语法内容。

 

本次版本升级内容大体说明

复制代码
ExpandedBlockStart.gif
1:修正access 日期时间的处理[之前值只有Date,无Time]

2:加强对所有执行语句where条件关键字过滤,加强了安全性

3:MAction 增加事务RollBack方法,MProc增加与MAction一致的事务方法

4:MDataTable:增加静态LoadFromJson方法,允许从json字符串还原成MDataTable

5:Xml名称空间下xml操作类细节语法处理,加强对异常的处理。

6:多数据库支持,自定语法介绍
复制代码

 

以下对重点进行详细解析说明

 

一:外部输入where条件关键字处理说明

 

1:框架对所有的SQL执行语句对外部where条件进行了严格的关键字处理,直接从底层拒绝SQL注入

过滤的关键字:

{"select","master","delete","drop","update","truncate","create","exists","insert","asc(","while","xp_cmdshell","add","declare","exec","ch","ch(","delay","waitfor","sleep"};

而换之而来的,就是对外部where条件无法再使用类似以下的子查询,例如:

MAction action = new  MAction( " Users " );
int  count = 0 ;
action.Select(
1 , 10 ,“ where  ID  in (select ID from xxx)”, out  count);

由于select被过滤,所以查询结果将导致失败,同样对于其它关键字也同样。

 

解决方法?

可以使用自定义Table语法:

MAction action = new  MAction( " (select * from Users where id in(select id from xxx)) v " );
int  count = 0 ;
action.Select(
1 , 10 , "" , out  count);

系统仅对自定义表进行基础过滤及多数据库支持转换,因此,外部条件带有有子查询及过滤关键字时,可考虑转成自定义表的形式。


二:MDataTable增加LoadFromJson方法

 

示例:

复制代码
ExpandedBlockStart.gif
MAction action = new  MAction(表名);
int  count = 0 ;

string  json = action.Select( 1 , 10 , "" , out  count).ToJson(); // 转成json字符串

MDataTable table
= MDataTable.LoadFromJson(json); // 从json还原为MDataTable;

List
< 实体 >  entityList = table.ToList < 实体 > (); // 从MDataTable转泛型实体列表。

复制代码

 

三:多数据库支持的语法解析说明

说明:为了对同一条语句可以在多个数据库下执行,推了关键字函数解析说明

 

目前系统定义的关键字如下:

复制代码
ExpandedBlockStart.gif
     public   class  DalValue // 名称空间CYQ.Data.DAL
    {
        
///   <summary>
        
///  对于Bit类型[是/否] 类型的排序
        
///   </summary>
         public   const   string  Desc  =   " [#DESC] " ;
        
public   const   string  Asc  =   " [#ASC] " ;
        
///   <summary>
        
///  对于Bit类型[是/否] 的条件值
        
///   </summary>
         public   const   string  True  =   " [#TRUE] " ;
        
public   const   string  False  =   " [#FALSE] " ;
        
public   const   string  Len  =   " [#LEN] " ; // length
         public   const   string  Substring  =   " [#SUBSTRING] " ; // substr
         public   const   string  GetDate  =   " [#GETDATE] " ; // length
         public   const   string  Year  =   " [#YEAR] " ; // length
         public   const   string  Month  =   " [#MONTH] " ; // length
         public   const   string  Day  =   " [#DAY] " ; // length
         public   const   string  CharIndex  =   " [#CHARINDEX] " ;
        
public   const   string  DateDiff  =   " [#DATEDIFF] " ;
    }

复制代码

 

关键字使用手法都是在原始函数上套上[#函数名],成为关键字替换,以下进行具体解析说明:

 

1:排序关键字:[#DESC]与[#ASC]

说明:这是由于Access / MSSQL / Oracle在对bit类型的处理方式不同,导致排序的问题。
access的bit类型为true与false,排序时会与mssql
/ oracel刚好相反

因此,采用(select 
*  from xxx order by istop [#DESC]),系统内部会解析不同的数据库类型,进行正确的解析还原。

 

2:关键值替换:[#TRUE]与[#FALSE]

说明:还是由于Access对bit类型的处理方式不同引起的,
access的bit类型在查询时为IsTop=true,成mssql与oracle为IsTop=1。

因此,采用(select * from xxx where istop=[#TRUE]),系统内部会解析不同的数据库类型,进行正确的解析还原。

 

3:标准函数替换 [#LEN]、[#SUBSTRING]、[#GETDATE]、[#YEAR]、[#MONTH]、[#DAY]、[#CHARINDEX]

复制代码
ExpandedBlockStart.gif
说明:这个就是各个数据库使用的函数不同,需要进行不同的解析。
如在不同的数据库使用分别为:len(xx)与length(xx) 、sub(...)与substring(...)等名称区别

因此,采用(select * from xxx where [#LEN](body)>10),系统内部会解析不同的数据库类型,进行正确的解析还原。

特殊:对于CharIndex函数,对于不同的数据库顺序参数位置刚好又不同,这里采用mssql为标准,其它类型数据库会反转参数,Oracle会替换成instr。
简单说用法就是:[#CHARINDEX]('要找点什么','很长很长的文本,原始文本')

一切的用法还是和以前一样,只是函数名称加了[# ]
复制代码

 

4:特殊的[#DATEDIFF]

复制代码
ExpandedBlockStart.gif
说明:由于此函数差异较大,所以需要单独说明一下。
access与mssql存在使用区别,一是类型需要引号和不需要引号,二是参数表达有所不同。
同时,Oracle中不存在此函数,如果用到,请自行创建DateDiff函数/存储过程。
使用示例:select * from users where [#DATEDIFF]([#d],CreateTime,[#GETDATE])
<
说明:
[#DATADIFF]和正常函数名称一样
[#d]在不同数据库下被解析成'd'或d,标准解析如下:[#yyyy], [#q], [#m], [#y],[#d],[#h],[#ww], [#n], [#s]
 采用了access与oracle的共同参数表达式解析。
[#GETDATE]是不同数据库解析成now(),getdate(),sysdate
复制代码

 

框架下载地址:[置顶]CYQ.Data 轻量数据层之路 bug反馈、优化建议、最新框架下载

 

后言:

路过秋天版博客 正是基于这样一种方式的语法替换,对多数据库特别语法进行替换,从而在切换数据库时,只需要替换数据库链接,而不用修改任何语句或代码。

 

目前博客的开发,正在开发新的首页中......相信很快会推出下一版本,敬请期待~~~

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2010/11/23/1885299.html

相关文章
|
26天前
|
存储 Oracle 关系型数据库
Dataphin常见问题之想要周期执行任务如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
28天前
|
缓存 安全 Java
阿里云数据库 SelectDB 内核 Apache Doris 2.0.6 版本正式发布
阿里云数据库 SelectDB 内核 Apache Doris 2.0.6 版本正式发布
|
1月前
|
Oracle 关系型数据库 数据库
|
1月前
|
SQL 存储 JSON
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
亲爱的社区小伙伴们,Apache Doris 2.1.0 版本已于 2024 年 3 月 8 日正式发布,新版本开箱盲测性能大幅优化,在复杂查询性能方面提升100%,新增Arrow Flight接口加速数据读取千倍,支持半结构化数据类型与分析函数。异步多表物化视图优化查询并助力仓库分层建模。引入自增列、自动分区等存储优化,提升实时写入效率。Workload Group 资源隔离强化及运行时监控功能升级,保障多负载场景下的稳定性。新版本已经上线,欢迎大家下载使用!
阿里云数据库 SelectDB 内核 Apache Doris 2.1.0 版本发布:开箱盲测性能大幅优化,复杂查询性能提升 100%
|
1月前
|
SQL 开发框架 JavaScript
在 Vue 中进行数据持久化时,有哪些常用的数据库框架?
在 Vue 中进行数据持久化时,有哪些常用的数据库框架?
49 3
|
1月前
|
存储 数据管理 数据处理
数据之光:探索数据库技术的演进之路
数据之光:探索数据库技术的演进之路
60 1
|
1月前
|
存储 运维 关系型数据库
数据的力量:构筑现代大型网站之数据库基础与应用
数据的力量:构筑现代大型网站之数据库基础与应用
49 0
|
29天前
|
SQL Java 数据库连接
从来没想到我们会扒拉nohup文件去找我们想要的数据,然后往数据库中添加。。。...
从来没想到我们会扒拉nohup文件去找我们想要的数据,然后往数据库中添加。。。...
17 0
|
21天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
94 0
|
2天前
|
存储 关系型数据库 MySQL
如何处理爬取到的数据,例如存储到数据库或文件中?
处理爬取的数据,可存储为txt、csv(适合表格数据)或json(适合结构化数据)文件。若需存储大量数据并执行复杂查询,可选择关系型(如MySQL)或非关系型(如MongoDB)数据库。以MySQL为例,需安装数据库和Python的pymysql库,创建数据库和表,然后编写Python代码进行数据操作。选择存储方式应考虑数据类型、数量及后续处理需求。
8 1