CYQ.Data 轻量数据层之路 V3.5版本发布-[开启同语句多数据库运行支持]
2012-03-09 00:00
896 查看
前言:
继正式发布V3.0到现在,刷的一下又20天过去了,而框架随着“路过秋天版博客”的开发,始终没停下,一直在前进!!!
目前博客正在慢悠悠的开发着~~~最近花了很多时间看动漫去了,哈哈~~~~
下面就整体介绍下V3.5的更新,及V3.0中没介绍的新语法内容。
本次版本升级内容大体说明:
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
=
;
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
=
;
action.Select(
1
,
10
,
""
,
out
count);
系统仅对自定义表进行基础过滤及多数据库支持转换,因此,外部条件带有有子查询及过滤关键字时,可考虑转成自定义表的形式。
二:MDataTable增加LoadFromJson方法
示例:
MAction action
=
new
MAction(表名);
int
count
=
;
string
json
=
action.Select(
1
,
10
,
""
,
out
count).ToJson();
//
转成json字符串
MDataTable table
=
MDataTable.LoadFromJson(json);
//
从json还原为MDataTable;
List
<
实体
>
entityList
=
table.ToList
<
实体
>
();
//
从MDataTable转泛型实体列表。
三:多数据库支持的语法解析说明
说明:为了对同一条语句可以在多个数据库下执行,推了关键字函数解析说明
目前系统定义的关键字如下:
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]
说明:这个就是各个数据库使用的函数不同,需要进行不同的解析。
如在不同的数据库使用分别为:len(xx)与length(xx) 、sub(...)与substring(...)等名称区别
因此,采用(select * from xxx where [#LEN](body)>10),系统内部会解析不同的数据库类型,进行正确的解析还原。
特殊:对于CharIndex函数,对于不同的数据库顺序参数位置刚好又不同,这里采用mssql为标准,其它类型数据库会反转参数,Oracle会替换成instr。
简单说用法就是:[#CHARINDEX]('要找点什么','很长很长的文本,原始文本')
一切的用法还是和以前一样,只是函数名称加了[# ]
4:特殊的[#DATEDIFF]
说明:由于此函数差异较大,所以需要单独说明一下。
access与mssql存在使用区别,一是类型需要引号和不需要引号,二是参数表达有所不同。
同时,Oracle中不存在此函数,如果用到,请自行创建DateDiff函数/存储过程。
使用示例:select * from users where [#DATEDIFF]([#d],CreateTime,[#GETDATE])
<
3
说明:
[#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
继正式发布V3.0到现在,刷的一下又20天过去了,而框架随着“路过秋天版博客”的开发,始终没停下,一直在前进!!!
目前博客正在慢悠悠的开发着~~~最近花了很多时间看动漫去了,哈哈~~~~
下面就整体介绍下V3.5的更新,及V3.0中没介绍的新语法内容。
本次版本升级内容大体说明:
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
=
;
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
=
;
action.Select(
1
,
10
,
""
,
out
count);
系统仅对自定义表进行基础过滤及多数据库支持转换,因此,外部条件带有有子查询及过滤关键字时,可考虑转成自定义表的形式。
二:MDataTable增加LoadFromJson方法
示例:
MAction action
=
new
MAction(表名);
int
count
=
;
string
json
=
action.Select(
1
,
10
,
""
,
out
count).ToJson();
//
转成json字符串
MDataTable table
=
MDataTable.LoadFromJson(json);
//
从json还原为MDataTable;
List
<
实体
>
entityList
=
table.ToList
<
实体
>
();
//
从MDataTable转泛型实体列表。
三:多数据库支持的语法解析说明
说明:为了对同一条语句可以在多个数据库下执行,推了关键字函数解析说明
目前系统定义的关键字如下:
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]
说明:这个就是各个数据库使用的函数不同,需要进行不同的解析。
如在不同的数据库使用分别为:len(xx)与length(xx) 、sub(...)与substring(...)等名称区别
因此,采用(select * from xxx where [#LEN](body)>10),系统内部会解析不同的数据库类型,进行正确的解析还原。
特殊:对于CharIndex函数,对于不同的数据库顺序参数位置刚好又不同,这里采用mssql为标准,其它类型数据库会反转参数,Oracle会替换成instr。
简单说用法就是:[#CHARINDEX]('要找点什么','很长很长的文本,原始文本')
一切的用法还是和以前一样,只是函数名称加了[# ]
4:特殊的[#DATEDIFF]
说明:由于此函数差异较大,所以需要单独说明一下。
access与mssql存在使用区别,一是类型需要引号和不需要引号,二是参数表达有所不同。
同时,Oracle中不存在此函数,如果用到,请自行创建DateDiff函数/存储过程。
使用示例:select * from users where [#DATEDIFF]([#d],CreateTime,[#GETDATE])
<
3
说明:
[#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
相关文章推荐
- CYQ.Data 轻量数据层之路 V3.5版本发布-[开启同语句多数据库运行支持]
- CYQ.Data 轻量数据层之路 V3.5版本发布-[开启同语句多数据库运行支持]
- CYQ.Data 轻量数据层之路 V3.5版本发布-[开启同语句多数据库运行支持]
- CYQ.Data 轻量数据层之路 V4.3 版本发布[增加对SQLite,MySQL数据库的支持]
- CYQ.Data 轻量数据层之路 V4.3 版本发布[增加对SQLite,MySQL数据库的支持]
- CYQ.Data 轻量数据层之路 V4.3 版本发布[增加对SQLite,MySQL数据库的支持]
- CYQ.Data 轻量数据层之路 V4.3 版本发布[增加对SQLite,MySQL数据库的支持]
- CYQ.Data 轻量数据层之路 V4.0 版本发布
- CYQ.Data 轻量数据层之路 V4.0 版本发布
- CYQ.Data 轻量数据层之路 V4.5 版本发布[更好的使用体验,更优的缓存机制]
- CYQ.Data 轻量数据层之路 V3.0版本发布-Xml绝对杀手(三十二)
- CYQ.Data 轻量数据层之路 V2.0 震撼惊世 支持多数据库/内置Aop(二十五)
- CYQ.Data 轻量数据层之路 V4.0 版本发布
- CYQ.Data 轻量数据层之路 V3.0版本发布-Xml绝对杀手(三十二)
- CYQ.Data 轻量数据层之路 最后开源版本V1.5.5发布[V1.4源码对外下载] (二十三)
- CYQ.Data 轻量数据层之路 V4.5 版本发布[更好的使用体验,更优的缓存机制]
- CYQ.Data 轻量数据层之路 V2.0 震撼惊世 支持多数据库/内置Aop(二十五)
- CYQ.Data 轻量数据层之路 V2.0 震撼惊世 支持多数据库/内置Aop(二十五)
- CYQ.Data 轻量数据层之路 V4.0 版本发布
- CYQ.Data 轻量数据层之路 最后开源版本V1.5.5发布[V1.4源码对外下载] (二十三)