对比结果概述 本文中对两种数据库平台的对比结果显示了在构建数据库应用程序时使用SQL Server (代码代号Yukon)结合Visual Studio进行开发比使用DB UDB (代码代号Stinger)结合Visual Studio有着显着的优势在开发调试和部署数据库解决方案的时候这些优势就将转化为在时间和资金上的节省在本文中特别说明了SQL Server 与DB UDB 相比对NET数据库对象的支持要广泛的多另外你会发现在构建和管理数据库对象时SQL Server 和Visual Studio集成的程度要比DB UDB 和Visual Studio的集成紧密的多在本文中你还会看到SQL Server 所提供的开发平台除了关系型数据库之外还有其他许多功能这一点超过了DB UDB
前言
在过去IT开发技术分成了程序开发语言产品环境配置和数据操作这三种相对独立的专业技能为了综合使用这些相对独立的技能往往需要专门的技术和大量的人力现在有了SQL Server 和Visual Studio 我们拥有了一个统一的开发环境集成于其中的编程模型提供了整体的解决方案包容了客户端数据库应用程序服务器管理工具和服务器端数据库对象的构建如此对工具和框架功能性的改善将使得开发者和客户都能从中受益因为它将会对应用程序的可用性性能安全性和可伸缩性带来一个全面的提升
SQL Server 和DB 中对Visual Studio环境和数据库数据提供程序的集成将简化和改善应用程序的开发流程它们提供了旨在提高生产率的构建和部署应用程序的工具这将会给程序开发和应用程序管理带来更好的性能表现SQL Server 和DB UDB 中对NET框架的集成带来了一个更加高效和更加灵活的数据库应用程序开发环境由此得到了比先前版本执行效率更高的更加健壮的数据库解决方案它拥有更好的易用性和可伸缩性通过利用集成的NET环境数据库开发人员就可以实现以前使用SQL代码不可能得到的结果通过使用NET框架开发人员写出的代码能具有更加复杂的逻辑更加适合于解决计算问题并能访问到外部的系统和网络资源因为NET语言例如Visual BasicC#和C++都是完全的面向对象编程语言具有像封装继承和多态性这样的面向对象编程的特性它们还具有许多在SQL语言中不存在的功能例如数组结构化异常处理集合等
如今Microsoft NET提供了最先进最高效的构建和整合数据库应用程序的环境在这篇文章中我们将比较SQL Server 和DB UDB 分别提供的NET集成的程度为了能充分说明这其中的差别我们将做一个详细的技术演示来显示分别使用SQL Server 和DB UDB 构建一个NET存储过程的具体步骤
核心技术比较
虽然SQL Server 和DB UDB 都集成了NET框架和Visual Studio但各自的集成程度有着显着的差别下面这张表格中列出了关于它们对NET的集成程度的比较
NET功能
SQL Server
DB UDB
NET数据提供程序
是(SQL Server NET
数据提供程序)
是(DB NET
数据提供程序)
NET存储过程
是
是
NET用户定义函数
是
是(需要手工创建)
NET触发器
是
否
NET用户定义类型
是
否
NET用户定义聚集
是
否
Visual Studio工具
是
是
数据提供程序
SQL Server 和DB UDB 都自带了NET数据提供程序使得NET客户端程序能够访问数据库平台这些天生的数据提供程序与基于OLE DB的数据提供程序相比会给服务器应用程序带来更好的性能和可伸缩性这两种数据提供程序有着非常相似的功能都能执行基本的ADONET对象包括ConnectionCommandDataReaderDataSet和DataAdapter但它们有一个关键的差别:SQL Server NET数据提供程序有两种模式可用一个针对于客户端应用程序另一个针对于服务器端应用程序这一点对于服务器端应用程序开发特别重要因为SQL Server服务器端NET数据提供程序是一个驻于内存的程序它不用像客户端数据提供程序那样去考虑网络流量的限制因此服务器端NET数据提供程序能针对NET数据库对象实现更好的性能另外服务器端数据提供程序还开放了一组只适合于服务器端代码的功能例如服务器端游标针对客户端应用程序的数据提供程序所开放的功能在SystemDataSqlClient命名空间中而服务器端数据提供程序所开放的功能在SystemDataSqlserver命名空间中在DB UDB 中只有单独的IBMDataDB命名空间DB NET数据提供程序使用DBContext对象来创建驻于内存的数据库连接
在服务器端它们同样有相似之处DB和SQL Server都支持使用NET语言构建应用程序以及随后在服务器端部署其实除了这一基本概念这两种数据库平台对NET的集成程度有着很大的差异DB UDB 支持创建NET存储过程和NET用户定义函数可是Visual Studio IDE只支持创建DB UDB NET存储过程DB UDB NET函数必须手工创建与之相比SQL Server 对NET的支持要广泛的多和DB一样SQL Server支持创建NET存储过程和NET用户定义函数除此之外SQL Server还支持NET触发器NET用户定义类型(UDT)以及NET用户定义聚集所有这些对象的创建都被完全集成到Visual Studio IDE中了能使用NET语言构建存储过程和函数对数据库开发人员来说肯定是个好消息这将使得他们能够实现更加复杂的商业逻辑和函数功能而不必受限于标准SQL的功能这一点无疑是将NET与数据库集成的关键所在当然使用NET语言创建触发器用户定义类型以及用户定义聚集也很有用使用NET语言创建触发器将使得触发器的代码能更加完全地封装商业逻辑同时还能执行一些附加的操作例如访问外部资源记录操作日志使用NET语言创建用户定义类型能使得数据库开发人员能扩展系统中原有的数据类型这些用户定义类型能拥有自己独立的属性和操作符这使得开发人员可以无缝地扩展原有的数据类型在使用的时候就和原有的数据类型一样具有各自的操作符和聚集同样地使用NET创建用户定义聚集使开发人员能创建自定义的聚集操作应用于原有的数据类型或是用户自定义的数据类型
除了这些基本的NET功能在NET框架与各自的数据库服务器集成方面还有重大的差异在下一部分中我们将更深入地讨论NET集成的细节
NET框架集成
Microsoft® NET是用来把信息人力系统和设备联系在一起的一组Microsoft软件技术NET框架是构建和运行下一代软件应用程序和Web Service所必需的Windows组件
NET框架:
·支持超过二十种不同的编程语言
·管理着大量的管道——有助于提高软件开发效率并使得开发人员的精力更加集中于核心商业逻辑代码上
·使得构建部署和管理一个安全的健壮的以及性能卓越的应用程序比以前更加容易实现
NET框架由公共语言运行库(CLR)和统一分层的类库集合所组成NET CLR的职责主要包括集成语言的运行服务强制安全性和对内存进程以及线程的管理在语言集成方面CLR定义了通用类型系统(CTS)它描述了跨越所有NET语言的基本数据类型以及关于那些数据类型的操作NET框架提供了大量的类集供开发人员应用于他们的应用程序中这些类集涵盖了很多方面的内容包括I/O网络文本处理数据访问加密XML处理Web Service等等这样就允许开发人员能把精力主要集中在构建商业逻辑上而不是埋头于管道代码中因为这些能在NET框架的类集中找到SQL Server 和IBM DB UDB 中对NET CLR的集成使得可以用任何一种NET语言(包括C#Visual BasicC++以及J#)来开发数据库对象
这两种不同的数据库平台和NET框架集成的方式是完全不同的SQL Server 数据库引擎将CLR宿于进程内这意味着同时运行数据库引擎和NET运行库只需要一个独立的操作系统进程与之相比DB UDB 和NET框架的集成采用的是进程外的模型图对不同的数据库CLR实现方式进行了直观描述
集成模型的含意
SQL Server 集成NET运行库时采用的进程内模型与进程外模型相比有一些非常明显的优势首先将CLR集成在进程内部使得SQL Server能以不同的方式控制CLR的运行内存管理垃圾收集器线程支持的核心功能将受到SQL Server主机的控制而不是采用NET的默认设置和操作这一点非常重要因为SQL Server数据库引擎能更好地从整体的角度来考察系统需求从而使得它能根据实际情况优化内存和线程的管理最终以进程内模型集成CLR的SQL Server 能创建得到更加健壮和有更好伸缩性的解决方案
举个例子考虑一个负担沉重的数据库实例要响应许多并发的请求这一情况已经持续了很长一段时间SQL Server能自动和智能地在数据存储和程序逻辑(例如NET存储过程)之间平衡内存的分配当系统的负担有了一些性质上的变化——例如相对较多的请求利用了较多的程序逻辑——SQL Server会再次自动地进行调整这样系统的性能会根据满足实际需求的伸缩性和可靠性进行不断的优化因为DB UDB v采用进程外的模型集成NET运行库所以DB不能提供这种类型的机器资源动态平衡和性能优化
SQL Server 是通过使用CLR 主机API来实现动态优化的这些API只在NET框架版中存在而在NET框架以前的版本里是没有的必然的结果SQL Server 需要集成NET框架版而DB集成的是NET框架版集成的程度自然较低
NET 与NET 的差别
使用NET框架版结合SQL Server 和Visual Studio 与使用NET框架版结合DB UDB 相比有着一些显着的优势NET框架版和以前版本相比功能有着显着的增强:
·改善的性能和装载时间
·支持泛型(同一个类和方法可针对于不同数据类型的值一样运行因此提高了代码重用性)
·支持编辑后继续运行(EditandContinue)开发人员能够在执行过程中修改代码而无需中止和重新开始调试会话
·一个新的数据保护API(DPAPI)使得应用程序能对某些敏感信息加密例如连接字符串甚至内存块
·流的身份验证功能通过新的NegotiateStream和SslStream类允许您使用 Kerberos 或 SSL 来实现客户端和服务器端的安全通道
·COM互操作性的改善将使得NET应用程序在调用现存的COM对象时有着更好的性能和可靠性
·经过改善的I/O性能加上对GZIP数据压缩的支持
·位应用程序兼容性
部署NET逻辑到SQL Server
每个数据库平台实际使用NET对象的方式也是有着很大差别的在SQL Server 中一个新的SQL Server数据库对象程序集(Assembly)是部署NET对象(例如触发器或是存储过程)的最小单元程序集组是部署NET逻辑的最小单元为了创建CLR数据库对象你必须首先使用Visual Studio 创建一个DLL接着将这个DLL导入到SQL Server中作为一个数据库程序集对象这些步骤能够使用命令行编译器和CREATE ASSEMBLY命令手工实现或者像在技术演示部分里所看到的一样Visual Studio 能自动完成整个流程
SQL Server中Assembly的安全
SQL Server 给数据库管理员提供了一个新的安全单元——程序集程序集可被标记为三种安全状态:SAFEEXTERNAL和UNSAFE这些安全标号供数据库管理员用来管理和保护所有在数据库里以程序集级别运行的NET代码SAFE标号表示这个程序集只使用托管代码并且不访问数据库之外的资源EXTERNAL标号表示这个程序集使用托管代码访问外部资源例如文件系统或是网络等非数据库之内的资源UNSAFE标号表示这个程序集能够包含托管和(或)非托管代码并且能够访问任何内部或外部的资源由UNSAFE程序集创建的数据库对象只能被拥有系统管理员权利的用户执行
部署NET逻辑到DB
虽然将NET托管代码装入DB UDB 的流程与装入SQL Server 的流程很相似但在数据库对象类型和存储位置以及安全和数据库管理流程方面还是有着一些差别为了创建DB中的CLR数据库对象你得首先使用Visual Studio并采用某种NET托管语言创建一个DLL这个DLL文件需要拷贝到DB安装路径专门的目录中去或者在创建存储过程或者函数的时候提供这个DLL文件的完全路径这个DLL实际上不是一个数据库对象也没有被导入到数据库表中相反它只是一个操作系统中的文件接着这个DLL将出现在创建数据库对象(例如存储过程或者函数)的CREATE命令中在技术演示部分中你将会看到使用Visual Studio 能够自动完成创建DB CLR存储过程的整个流程不过创建用户定义函数则不一样你只用通过手工来完成创建用户定义函数的流程
一个数据库管理员或者是一个应用程序开发人员通常需要保护与DB外部程序相关的DLL程序集这可以通过限制程序运行时的操作来实现这步工作在创建过程或函数时在CREATE语句的EXECUTION CONTROL子句中完成有效的执行控制模式包括:SAFEFILEREADFILEWRITENETWORK和UNSAFE如果没有指定执行控制模式默认模式是SAFE这将意味着这个CLR程序只能访问由数据库管理员控制的资源这样的资源包括所有的表和由数据库实例管理的架构FILEREADFILEWRITE和NETWORK执行模式允许托管代码访问本地文件系统或者是网络上的资源UNSAFE执行模式将不会在资源访问上做任何限制标记为UNSAFE执行模式的程序可以执行二进制代码既然DB与NET的集成采用的是进程外的模型那么在使用CREATE语句创建DB CLR过程和函数时必须采用FENCED子句用以说明NET逻辑和数据库管理器在不同的进程中运行并且不使用共享内存通讯这就造成了在程序逻辑与数据库本身之间传输数据的时候与进程内模型相比有一个性能上的障碍