简介
在NET应用软件开发人员看来使用DB与使用其它任何其它关系数据库没有区别人们可以看到无数使用SQL Server以及甲骨文公司产品执行数据库任务的例子但关于使用包括NET在内的微软公司技术访问DB数据库的文档就远没有那么多了
目前开发人员可以使用不同的访问技术通过编程的方式将NET客户端连接到DB上这些代码从根本上来说是基本相同的但仍然存在一些我们需要考虑的有趣的限制
DB架构慨览
DB数据库引擎的基本元素是数据库对象系统目录目录和配置文件所有的数据存取都通过SQL界面进行我们可以只将DB Univeral Database(UDB)作为数据库服务器运行这不要求使用其它的产品但对于远程的客户端而言我们还需要其它一些产品
DB UDB的服务器组件提供了对使用TCP/IPSNA或IPX/SPX协议与数据库服务器进行通讯的支持这就能够使运行管理客户端运行时间库或应用程序开发客户端的远程客户端进行访问应用程序开发客户端组件是面向数据库应用程序开发人员的工具集它包括库文件头文件API和样板代码
我们主要关心的是能够通过网络访问数据库服务器的客户端组件通过使用DB Connect我们的NET应用程序能够访问基于主机的DB系统例如DB for AS/DB for OS/DB for VSE等
连接到DB的方式决定了我们能够完成的任务有三种技术可以从NET连接到DB
使用OleDb NET Managed Provider如果运行的是DB V或更低的版本以及COM对象是调用者时微软和IBM二家公司都建议使用OleDb数据提供者访问大多数DB数据在NET Framework中OleDb提供商是通过COM InterOp表现出来的并使用可用于ADO开发的驱动程序
使用ODBC NET Managed Provider这种方式提供了对本地ODBC驱动程序的访问与OLEDb NET Data Provider提供对本地OLEDb提供者访问的方式相同ODBC NET Data Provider是NET Framework的一个附加组件它能够与所有兼容的ODBC驱动程序配合使用
使用IBM DB NET Provider(β)这种方式提供了对将ADONET连接到DB V的支持DB NET Data Provider是Visual Studio NET Framework的一个内插式附件它能够访问在运行在不同硬件和操作系统平台上的DB·数据库服务器目前它仍然处于β测试阶段但IBM公司很快会发布正式产品DB Net Data Provider能够将使用ADONET开发的应用程序连接到下面的DB数据库服务器上
·运行在WindowsUNIX和Linux平台上的DB Universal Database Version
·运行在z/OSOS/ V以及使用DB Connect V组件的更高版本的操作系统上的DB Universal Database
不同的连接字符串显示出不同情况下的语法差别
OleDb连接字符串
Provider=IBMDADB;User ID=dbadmin;Password=dbadmin;Data Source=SAMPLE
ODBC连接字符串
DSN=DBV;UID=dbadmin;PWD=dbadmin
IBM Managed Provider连接字符串
Database=SAMPLE;User ID=dbadmin;Password=dbadmin;Server=IREK
代码级访问的比较
在开发DB数据访问代码时大多数的操作在很大程度上与访问其它数据库相同下面我们对连接技术的一些代码进行比较
在下面的每个代码片断中我们将展示一些数据库访问和数据管理的技巧请读者注意每种技术的哪些步骤相同我们首先创建连接对象再创建一个命令对象在这个简单的例子中我们只访问这一特定数据库表中指定行列中的一个标量值最后我们执行该命令的ExecuteScalar()方法返回该整数
使用Ole Db技术
private OleDbConnection cn = new OleDbConnection(connectionString); OleDbCommand cmd = new OleDbCommand(SELECT COUNT(*) FROM STAFF cn); int rc = ConvertToInt(cmdExecuteScalar());
使用ODBC
private OdbcConnection cn = new OdbcConnection(connectionString);
OdbcCommand cmd = new OdbcCommand(SELECT COUNT(*) FROM STAFF cn);
int rc = ConvertToInt(cmdExecuteScalar());
使用IBM的Managed Provider
private DBConnection cn = new DBConnection(connectionString);
DBCommand cmd = new DBCommand(SELECT COUNT(*) FROM STAFF cn);
int rc = ConvertToInt(cmdExecuteScalar());
功能的比较
根据选择的访问技术和使用的数据库版本我们可以使用不同的功能另外根据需要完成的工作我们还需要选择连接策略
为了使读者能够更好的选择连接技术我整理出了一个能够在决策中使用的路线图在路线图中我找出了一些对于大多数以数据库为中心的软件开发项目中通用的功能
在下面的图表中我对自己的心得进行了整理我根据是否允许完成特定的数据库任务对三种访问技术中的每一种都进行了评估评估的数据库任务有
·Passthru SQL━━这一提供者是否支持通过动态开发的SQL语句形成的传递?
·简单的存储过程━━这一提供者支持包括返回结果在内的调用基本的存储过程吗?
·InOutInOut参数━━这一提供者支持调用存储过程和利用参数传递变量数据吗?
·日期和货币━━这一提供者支持由特定厂商提供可能造成问题的数据类型吗?
·LOBs━━这一提供者支持大对象数据类型的处理吗?
根据使用的连接技术我们能够完成不同类型的任务因为每种提供者都有自己可以完成的工作有一些问题是我们值得注意的
例如ODBC不支持DB的存储过程因此如果开发的应用软件非常依赖于存储过程我们在选择访问技术时就不能考虑ODBC而应当考虑OleDb或Managed ProviderOleDb不支持LOB数据类型如果要存取LOB类型的数据(例如JPEG文件)我们可以使用ODBC或Managed Provider目前Managed Provider不能在DB V或以前版本上运行除非在应用程序和基于主机的DB系统之间运行着DB Connect V
有趣的是在使用存储过程的参数时DB V和OleDb有一个非常着名的bug我们能够从存储过程中返回数据但在OleDb+DB V平台上我们不能在应用程序与存储过程之间传递参数
性能比较
为了衡量提供者的性能和向读者提供指导我们将定义一个有效的测试脚本并对各种提供者的关健性能进行测试为了比较各种连接技术的性能我们开发了一些简单的Web网页一个网页面向执行完全相同功能的测试这将使我们掌握分析不同连接技术情况下输出的控制数据
如果严格地从性能的角度来看我们发现Managed Provider在访问DB数据库时的性能最高在这一简单的测试中有二个重要的数字值得关注每秒钟的请求(RPS)能够使我们感受到访问的规模OleDb和ODBC在这方面的表现基本相似但Managed Provider的表现要好一些(大约高%左右)收到最后一字节的时间(TTLB)是从终端用户的角度看到的响应时间在这一方面Managed Provider的性能再次比OleDb和ODBC高出%左右
最值得注意的是尽管提供的功能不同但OleDb和ODBC在有负荷的情况下的性能基本相同IBM公司的Managed Provider的性能最好而且提供了在访问DB V时最可靠的功能但是如果没有DB Connect作中间体它不支持DB V以及更低的版本
结论
对于应用软件开发人员而言使用DB作后端与使用其它通过ADO或ADONET访问的关系数据库一样简单ADONET为我们完成了所有抽象工作在选择DB还是其它数据库时尽管存在架构方面的考虑但作为开发人员我们的工作应当是可预测和可管理的