教你如何来进行编写通用的数据访问

引言

在负责咨询工作的过去 6 年中,我曾多次听说关于数据访问和操作方面的问题,它时刻困扰着用户:“如何编写应用程序,以便只需对其进行很少的改动或不进行改动即可使用数据库服务器 x、y 和 z?”由于知道数据访问层仍然是现代应用程序的最关键部分,并且通常是经验不足的开发人员的头号敌人,因此我的第一反应始终是:根本办不到!

面对着人们惶惶不安的面孔以及“使用 Microsoft 在 ADO 中提供的通用数据访问方法如何?”这样的问题,我决定针对此问题提供更详细的说明以及建议的解决方案。

问题在于,如果应用程序是较小的原型,或者如果并发用户较少并且数据访问逻辑比较简单,那么即使您选择下面这些最简单的方法,也不会遇到任何问题:使用 RAD 工具(如 Data Environment in Microsoft Visual Basic 6.0),或某些“一揽子”解决方案(如 ActiveX Data Control 和其他第三方组件),这些解决方案通常会隐藏应用程序与特定数据源之间进行的复杂交互。然而,当用户数量增加使得必须解决并发操作问题时,由于频繁使用动态记录集、服务器端光标以及不必要的锁定策略,导致出现许多性能问题。为达到用户目标而必须对系统所做的设计和代码更改将花费您大量的时间,因为您从开始时就没有考虑过这一问题。

使用通用数据访问方法

在将 ADO 可靠地并入 MDAC(Microsoft Data Access Components 2.1 版)后,Microsoft 掀起了通用数据访问的使用高潮。其主导思想是向开发人员展示,通过使用简单的对象模型(“连接”、“命令”和“记录集”),可以编写出能够与各种不同的数据源(无论是关系数据源还是非关系数据源)连接的应用程序。文档(以及当时的大多数文章和示例)中通常未曾提及的是,即使使用相同的数据访问技术,各种数据源的可编程性和特征也千差万别。
  其结果是,在需要从多个数据源获取数据的应用程序中,最简单的方法是使用所有数据源所提供的功能的“共同点”,但因此会失去使用数据源特定选项的好处,即为访问和操作各种 RDBMS 中的信息提供最佳方法。

我对该方法始终存在的怀疑是,经过与我的客户进行更详细的分析后,我们通常一致认为与应用程序中处理显示和业务逻辑的其他部分相比,与数据源进行交互的只是应用程序很小的一部分。通过进行精心的模块化设计,可以将 RDBMS 特定代码隔离在一些容易互换的模块中,从而避免对数据访问使用“通用”方法。然而,我们可以使用非常特定的数据访问代码(根据数据源的不同,使用存储过程、命令批处理和其他特性),而不触及其他大多数应用程序代码。这总是提醒大家:正确的设计是编写可移植的有效代码的关键。

ADO.NET 将一些重要的变化引入到数据访问编码领域,如专用 .NET 数据提供程序这样的概念。使用特定的提供程序,可以绕过为数众多但有时没必要的一系列软件接口和服务(它们是 OLE DB 和 ODBC 层在数据访问代码与数据库服务器之间插入的内容),从而以最佳方式连接到数据源。但每个数据源仍然存在不同的特征和特性(具有不同的 SQL Dialect),且编写高效的应用程序仍然必须使用这些特定特征而不是“共同点”。从可移植性观点看来,托管和非托管的数据访问技术仍然非常类似。

除“利用数据源的唯一特征”外,编写良好数据访问层所必需的其他规则对每个数据源通常都是相同的:

• 在可能的情况下使用连接池机制。

• 节约使用数据库服务器的有限资源。

• 注意网络的往返。

• 在适当的情况下,增强执行计划的重复使用率并避免重复编译。
  • 使用适当的锁定模型管理并发性。

从我使用模块化设计方法的个人经验来看,整个应用程序中专用于处理特定数据源的代码量不会超过总量的 10%。显而易见,这比仅仅更改配置文件中的连接字符串更复杂,但我认为,这样做会获得性能收益,因此这是一个可接受的折衷办法。

使用基本接口

此处的目标是使用抽象,并将特定于特殊数据源的代码封装在类层中,从而使应用程序的其他部分独立于后端数据库服务器或免受其影响。

.NET Framework 的面向对象这一特性将在该过程中为我们提供帮助,使我们能够选择要使用的抽象级别。选项之一是使用每个 .NET 数据提供程序都必须实现的基本接口(IDbConnection、IDbCommand、IDataReader 等)。另一个选项是创建一组类(数据访问层),用于管理应用程序的所有数据访问逻辑(例如,使用 CRUD 范例)。为检查这两种可能性,我们首先从基于 Northwind 数据库的订单输入应用程序示例入手,然后插入和检索不同数据源中的信息。

时间: 2024-11-01 18:14:31

教你如何来进行编写通用的数据访问的相关文章

了解 XML实现通用的数据访问

xml|访问|数据   了解可扩展标记语言 (XML) 如何帮助我们实现通用的数据访问.XML 是一种基于 Unicode 的纯文本元语言,即一种用于定义标记语言的语言.它不依赖于任何编程语言.操作系统或软件供应商.XML 可以提供对各种数据处理.构建.转换和查询技术的访问.(本文包含一些指向英文站点的链接.)  简介     最初设想的可扩展标记语言 (XML) 用于为 Web 定义新文档的格式.XML 由标准通用标记语言 (SGML) 衍生而来,可以认为它是一种元语言,即一种定义标记语言的语

为Silverlight项目创建通用WebService数据访问

在使用Silverlight之前,我们创建了自己的webService做为通用数据访问.开发者传递一个Sql语句 ,即可得到一个DataSet,DataTable作为返回值.在Silverlight项目中,由于其对DataTable的限制,我 们不得不首先得到DataTable,而后在本地再创建Web service(WCF),对得到的DataTable进行转换.转换 为数组或者泛型集合以适应Silverlight的需要. 但是这样做难免有些繁琐,且开发者做出了很多费力的工作. 这里,我们对原来

编写可移植数据访问层

访问|数据 摘要:了解如何编写透明地使用不同数据源(从 Microsoft Access 到 SQL Server 以及 Oracle RDBMS)的智能应用程序. 本页内容 引言 使用通用数据访问方法 使用基本接口 编写专门的数据访问层 从其他层使用数据访问类 一些可能的改进 结论 引言在负责咨询工作的过去 6 年中,我曾多次听说关于数据访问和操作方面的问题,它时刻困扰着用户:"如何编写应用程序,以便只需对其进行很少的改动或不进行改动即可使用数据库服务器 x.y 和 z?"由于知道数

编写通用的asp防注入程序

程序|防注入|防注入 sql注入被那些菜鸟级别的所谓黑客高手玩出了滋味,,发现现在大部分黑客入侵都是基于sql注入实现的 ,哎,,谁让这个入门容易呢,好了,,不说废话了,,现在我开始说如果编写通用的sql防注入程序 一般的http请求不外乎 get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中 非法字符即可,所以我们实现http 请求信息过滤就可以判断是是否受到sql注入攻击. iis传递给asp.dll的get 请求是是以字符串的形式,,当 传递给Reques

编写通用的asp防注入程序 选择自 ph4studio 的 Blog

程序|防注入|防注入 sql注入被那些菜鸟级别的所谓黑客高手玩出了滋味,,发现现在大部分黑客入侵都是基于sql注入实现的 ,哎,,谁让这个入门容易呢,好了,,不说废话了,,现在我开始说如果编写通用的sql防注入程序 一般的http请求不外乎 get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中 非法字符即可,所以我们实现http 请求信息过滤就可以判断是是否受到sql注入攻击. iis传递给asp.dll的get 请求是是以字符串的形式,,当 传递给Reques

编写通用的ASP防SQL注入攻击程序

程序|攻击 SQL注入被那些菜鸟级别的所谓黑客高手玩出了滋味,发现现在大部分黑客入侵都是基于SQL注入实现的,哎,谁让这个入门容易呢,好了,不说废话了,现在我开始说如果编写通用的SQL防注入程序一般的http请求不外乎get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中非法字符即可,所以我们实现http 请求信息过滤就可以判断是是否受到SQL注入攻击. IIS传递给asp.dll的get 请求是是以字符串的形式,,当 传递给Request.QueryString

.Net/C#: 利用反射编写通用的 rss 2.0 的 reader

rss /* .Net/C#: 利用反射编写通用的 rss 2.0 的 reader 最近在写一个 Simple Rss Reader 网上找到现成代码两种: 1.代码简单的,但不够通用 (如: 本站的一些专用 rss reader) 2.代码复杂的,但没有足够时间去消化 (如: rssbandit) 遂自己动手: 由于 rss 的基本属性大家都有! 但一些特殊不通用属性,如: slash:comments wfw:comment wfw:commentRss trackbackping 不一定

编写通用的asp防注入程序_应用技巧

编写通用的asp防注入程序     选择自 ph4studio 的 Blog   关键字   编写通用的asp防注入程序  出处      sql注入被那些菜鸟级别的所谓黑客高手玩出了滋味,,发现现在大部分黑客入侵都是基于sql注入实现的  ,哎,,谁让这个入门容易呢,好了,,不说废话了,,现在我开始说如果编写通用的sql防注入程序  一般的http请求不外乎 get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中  非法字符即可,所以我们实现http 请求信息过

web 应用通用数据访问层 Fetchr

Fetchr 是用于 web 应用程序的通用数据访问层. 通常情况下,你调用 API 和数据库直接获取数据.但在客户端上,你有时候无法以同样的方式调用服务(例如,跨域策略),XHR 请求需要发送到服务器,再获取服务.以这不同的方式编写代码来适应着两种环境很容易出错. Fetchr 提供了一个抽象层调用数据服务,这样你就可以在服务器和客户端使用同样的 API 获取数据. 文章转载自 开源中国社区[https://www.oschina.net]