仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 803|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL编程:定制数据层

[复制链接]
逍遥一派 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:28:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
mysql使用内部操作字符集gbk来进行操作,即执行"SELECT*FROMtestWHEREname=xxxor1=1/*LIMIT1";从而注入成功数据
定制数据层


关头字:数据层,会见,元数据,数据会见模子

撰写:●⌒●┒tyt@sohu.com援用请说明出处

工夫:2003年8月

择要:在一个分层的体系中,数据层承当的义务是为体系供应必要的数据。在承先启后的过程当中,体系的变动,特别是体系数据请求的变动会让数据层忙的不亦乐乎。为此在疾苦的变动以后,我选择了数据会见模子,将元数据引进到数据层。使之有极强的扩大才能,变动才能。本文就将先容一个基础无需编程的数据层。

假如您利用的是小体系或已决意利用疾速绑定命据库表。本文大概对您不太符合。



观点的提出

在一个稍有范围的体系中,今朝一样平常会利用分层的计划。数据层的观点由此发生,为体系供应必需的数据,屏障数据存取,利用复杂易用的接话柄现数据操纵。它将完成Create,Read,Update,Delete(CRUD)的操纵来供应给下层……等等。

数据是一个软件体系的中心。尽年夜多半的数据保留在贸易数据库中,一样平常无需我们为此添枝加叶。数据层则是体系与数据库打交道的一个,也应当是独一的一个中央。

但是,体系的变动几近没法制止。用户现场提出,需求变动等等几近没法完整制止。同时一个开辟好的体系也大概必要利用分歧的数据库。变既然没法制止,不如主动面临。引进数据会见模子使得变动在数据层不必变动代码,乃至一个数据层组件能够顺应分歧的体系。也就是说--数据层的编程事情量几近已没有。



数据层模子



上图是一个部署模子。如图:数据层被分红了数据供应层和数据会见层,和一个数据会见元数据。上面分离先容这四个文件的感化:
数据会见元数据:
形貌数据的存取办法的数据,为体系的每个存取数据逻辑供应形貌,并利用数据会见点定名此会见逻辑,元数据存于数据库中。
通用数据会见层:
是一个组件,办理数据库驱动、屏障数据库不同、为下层供应复杂分歧的接口实行挪用。
通用数据供应组件:
利用通用数据会见层实行数据的CRUD操纵,利用数据会见元数据把持数据挪用指令。
公用数据供应组件:
假如数据会见元数据构建的数据会见模子构建得不充实,必要此组件供应需要的功效增补。


数据会见模子

此模子由数据会见元数据来形貌,因而元数据的界说必要功力。一方面:数据会见元数据越完整,通用数据供应组件功效就越强。兼容性也越好,但另外一方面,模子对照精致会让通用数据供应组件的编程对照庞大,因而必要衡量。

在必定的衡量后,我给出了以下的界说,以下界说已足以满意一样平常的必要:

它将存在两部分。数据库和当地缓存。


数据库中保留在数据会见元数据表DataAccessMeta。
当地缓存包括DataAccessMeta表的缓存,另有数据库的架构信息,包含,数据库中有甚么表,表中有几个字段,表中字段的属性,表间的束缚干系等。
列名域申明IDInt(notNULL)主键、独一标识符,默许自增1QueryNameVarchar(128)(notNULL)独一,数据会见点称号,即使用层的挪用的传进参数TypeInt(notNULL)保存会见种别,默许0,ReturnTypeInt(notNULL)0:多个数据表暗示一个数据集(默许)1:由多表分解一个表的数据集(静态视图)TransactionInt(notNULL)0:不必要事件撑持(默许)1:必要事件撑持SQLVarchar(512)存储SQL语句,可变参数值在字段名后面加@号暗示。StoreProcedureVarchar(64)存储历程称号ViewVarchar(64)视图称号Table_1Varchar(32)表名FieldName_1Varchar(256)Table_1字段名(指定要会见的字段)空,将前往表中一切字段。Table_2Varchar(32)表名FieldName_2Varchar(256)Table_2字段名(指定要会见的字段)空,将前往表中一切字段。Table_3Varchar(32)表名FieldName_3Varchar(256)Table_3字段名(指定要会见的字段)空,将前往表中一切字段。Table_4Varchar(32)表名FieldName_4Varchar(256)Table_4字段名(指定要会见的字段)空,将前往表中一切字段。Table_5Varchar(32)表名FieldName_5Varchar(256)Table_5字段名(指定要会见的字段)空,将前往表中一切字段Table_6Varchar(32)表名FieldName_6Varchar(256)Table_6字段名(指定要会见的字段)空,将前往表中一切字段
申明:
QueryName为数据存取逻辑的别号。下层经由过程此别号来挪用响应元数据表中优先级从上到下(关于同意为空的字段,但它存在时,疏忽其他。)好比SQL字段存在,将疏忽StoreProcedure及以下字段。在从表读数据时从Table_1读到Table_6,保留时倒序。SQL字段内容能够以传进进参数体例暗示,如"select*fromtablewhereusername=@username"即为一个正当的命令文本,我们能够以参数情势静态为@username赋值。当ReturnType为1时(把多表分解一表),各表之间必需要有且只要一个外键联系关系,查找干系的优先级从Table_1到Table_6。表毗连也是不异按次,因而注重表的前后干系别的,数据库中必需还要有一张版本表来辨别元数据的版本成绩。

当地缓存次要为了效力。最少包括三部分,下面的数据会见元数据缓存,数据库的架构缓存,版本缓存,即最少3个文件。



通用数据会见层

计划准绳:
简化dataaccesslogiccomponent中对数据库的操纵。数据存取举行会合处置,有益屏障数据库之间的不同。办理数据源。办理数据库的认证。办理事件性的操纵。办理数据库毗连。

应供应的接口有:
SetConnectPropety()//设置毗连属性SetDBType()//设置数据库范例,好比Oracle,SQLServerExecSQL()//实行SQL语句,注重必要依据数据库范例剖析成对应的语句。Update()//将数据集写进数据库Transactiong()//把持事件处置的相干函数GetDBTableName()//失掉数据库中的一切表名GetDBForeignKey()//失掉数据库中的一切外键干系


通用数据供应组件

计划准绳:
仅前往必要的数据。为分歧的挪用供应分歧接口。为输出输入参数供应复杂的映照和转换。使下层不必体贴数据存储。表露元数据的接口。查询参数,了局集的形貌等。处置一个主表和相干联的表。实行优化操纵和锁定等数据库操纵。缓存数据和非事件性的查询了局。在利用散布式或多半据库的体系下,供应静态的数据库路由。不要为每一个事件供应数据库的事件撑持,勤俭数据库资本。不该该初始化有交集的事件,由于大概会呈现多处同时更新的情形,激发冲突。不要在各个办法挪用时保持形态。不要为每一个表计划一个数据会见点,应当为每一个体系数据需求供应。本组件推行一个准绳,"体系不该当晓得数据从何而来,但程序员应当十分熟习。"
外部工具:
元数据办理类:卖力元数据的更新,缓存,读取,办理元数据内存缓冲,对效力的请求极高。数据供应类:卖力剖析数据会见元数据,并将剖析了局传进数据会见层。
应供应的接口有:

SetConnectPropety()//设置毗连属性GetDataSet(strAccessPoint,strFilter,strField)//取得数据集。个中strAccessPoint为数据会见点称号Update()//把数据集更新到数据库GetAccessPoint()//失掉一切的数据会见点称号GetFields(strAccessPoint)//失掉每一个数据会见点能够取得的字段名GetFieldProperty(strAccessPoint,strFieldName)//失掉每一个字段的属性
事情历程:

1.检测元数据和数据库版本。如更新,下载到当地。
2.将元数据,数据库架构读进内存,(约1张表1k的数据量)。
3.守候查询。
4.查询时剖析元数据,机关必要的SQL语句。
5.将SQL传进数据会见层。
6.失掉数据。
7.依据元数据将表间束缚填进数据集。
8.前往数据,守候查询。


结语:
元数据的利用。以致效力上有所下降。以是其实不合适对效力请求极高的体系。

我利用ADO.NET机关了一个本文所形貌的数据层。两人发了5周的工夫编码。使用优秀。以为对人人大概有些匡助。特撰写此文与人人共勉。

元数据的利用实在其实不仅限于数据层,如若把界面,功效元数据分离,人人能够设想将会呈现甚么了局,只不外数据层的元数据简单归结罢了。

本组件在http://www.csdn.net/cnshare/soft/19/19227.shtm已公布。
EXAMPLE存储引擎是一个不做任何事情的存根引擎。它的目的是作为MySQL源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE存储引擎不支持编索引。
愤怒的大鸟 该用户已被删除
沙发
发表于 2015-1-19 14:14:23 | 只看该作者
也可谈一下你是怎么优化存储过程的?
分手快乐 该用户已被删除
板凳
发表于 2015-1-25 18:22:30 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
老尸 该用户已被删除
地板
发表于 2015-2-3 12:51:13 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
admin 该用户已被删除
5#
发表于 2015-2-9 02:04:11 | 只看该作者
是要和操作系统进行Socket通讯的场景。否则建议慎重!
只想知道 该用户已被删除
6#
发表于 2015-2-26 18:24:19 | 只看该作者
对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
再见西城 该用户已被删除
7#
发表于 2015-3-8 16:32:19 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
透明 该用户已被删除
8#
发表于 2015-3-16 05:52:11 | 只看该作者
理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识
山那边是海 该用户已被删除
9#
发表于 2015-3-22 20:34:24 | 只看该作者
比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-8 22:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表