DB2 CLR存储过程
和在SQL Server平台上相似,Visual Studio开发人员同样可以开发.NET数据库对象并将其部署到DB2 UDB v8.2中。
和在SQL Server中一样,DB2 CLR存储过程同样可以访问到由.NET框架所提供的所有功能模块。然而,在DB2 UDB v8.2中和在SQL Server中具体实施的过程还是有着一定的差异。
在下一部分中我们将看到这些差异。为了便于说明问题,我们在这里使用的范例存储过程的功能还是读取文本文件中的数据到String类型的变量中。
using System;
using System.IO;
using IBM.Data.DB2;
namespace DB2ClassLibrary1
{
/// <summary>
/// This class and method is used for a DB2 CLR procedure.
/// </summary>
public class StoredProcedures
{
public static void usp_ReadTextFile(
String sInputFile,
ref String sColumn,
out String sErrorMsg)
{
String strContents;
try
{
StreamReader strReader = new StreamReader(sInputFile);
strContents = strReader.ReadToEnd();
strReader.Close();
sColumn = strContents;
sErrorMsg = null;
}
catch (Exception ex)
{
sErrorMsg = ex.Message;
}
}
}
}
在这段代码里需要提到的第一点是导入IBM.Data.DB2命名空间的指示语句,这就使得存储过程在使用DB2 .NET Data Provider命名空间里的类时无需使用全名来引用。与SQL .NET Data Provider相似,DB2 .NET Data Provider是.NET框架的一个扩充,它用于将.NET应用程序与DB2系统相连并在其上执行命令。在这段代码里同时还导入了System.IO,它是用于访问位于PC上的文件目录。
还有需要特别提醒读者的是命名空间DB2ClassLibrary1,这个命名空间是DB2 UDB存储过程模板自动为.NET项目创建的。另外,你会看到针对于这个存储过程的类的默认名称也是StoredProcedures,在这个类中同样包含了一个静态方法usp_ReadTextFile。
同样,考虑到那些不能读懂C#语言的读者,我们在这先对这段代码的结构特点做个简要地描述:在这段代码中,usp_ReadTextFile方法使用了三个参数。第一个参数是一个输入参数,用来以字符串的形式将操作系统文件的名称传递进方法;第二个参数是一个输出参数,用来将文本文件的内容返回给调用者;第三个参数也是一个输出参数,用来返回代码执行过程中出现的任何异常错误。因为在DB2中没有和SqlPipe功能相同的对象,所以在DB2中需要这么一个专门的参数来传递异常信息。
这段代码的其他部分与前面在SQL Server中创建.NET CLR存储过程的代码基本一样。
如果在读取输入文件的过程中发生了错误,Catch块中的代码将被执行。在这个例子中,Exception类型对象ex的Message属性值被赋予给sErrorMsg参数,并把它返回给调用usp_ReadTextFile存储过程的程序。
下一步就是生成和部署这个存储过程。
使用DB2和Visual Studio构建存储过程
下面的表格中列出了使用Visual Studio和DB2 v8.2创建存储过程usp_ReadTextFile所需的步骤。
步骤 | 简要说明 | 所用工具 |
1 | 创建新的Visual Studio DB2数据库项目 | Visual Studio File菜单项 |
2 | 创建数据库连接 | Visual Studio IBM Explorer窗格 |
3 | 添加DB2类库 | Visual Studio File菜单项 |
4 | 生成程序集 | Visual Studio Build菜单项 |
5 | 安装程序集 | Visual Studio Solution Explorer窗格 |
6 | 添加存储过程 | Visual Studio Stored Procedure项目模板 |
7 | 生成解决方案 | Visual Studio Build菜单项 |
总共7步 |
|
|
要使用Visual Studio创建CLR存储过程,你得首先创建一个DB2数据库项目。打开Visual Studio,选择“File”*“New”*“Project…”,然后就会跳出“New Project”对话框,在这个对话框中,你首先在“Project Types”列表中选择“IBM Projects”,然后从已经安装的Visual Studio模板列表中选择“DB2 Database Project”,接着给你的项目命名并指定其存储位置。在这里所设定的名称将作为相应Visual Studio解决方案的名称,和在SQL Server中一样,如果在你的项目中仅仅只包含一个存储过程,它也可以作为这个存储过程的名称,当然,如果你希望你的项目中包含多个存储过程或者还有其他类型的CLR数据库对象,你完全可以为其指定其他的名称。
图16——创建新的DB2 UDB数据库项目
如图16所示,点击“OK”按钮就会在Visual Studio IDE中创建一个新的项目。你会注意到在“Solution Explorer”中新创建的DB2数据库项目包含了多个文件夹,分别针对于使用Visual Studio IDE可以创建的各种DB2数据库对象类型。接着,“DB2 Data Connection”对话框将跳出,在这个对话框里有一个下拉框,这其中包含了所有以前定义过的DB2连接。但到目前为止,我们还没有设置过任何DB2连接,所以我们需要点击“New Connections”以显示“Add DB2 Data Connection”对话框(图17)。
图17——创建新的DB2 UDB数据库连接
在如图17所示的对话框中,DB2系统的名称在“Server”下拉框中输入。如果在你的开发环境中注册了多个DB2系统,那么,当你点击下拉箭头时,所有已注册的系统名称将被列出。
选择完服务器后,在“Database alias”下拉框中输入你希望连接的数据库名称,并在“User name”和“Password”提示框中输入相应的用户名和密码。
当你输入了所有必要的连接信息后,你可以点击“Test Connection”按钮来测试一下连接。如果所有的连接信息都是有效的,将会显示“Test connection succeeded”消息。点击“OK”按钮后,连接信息就会被写入Visual Studio项目中并出现Visual Studio IDE界面。同样,如果你的项目中包含了登录信息,那你要保证你的项目的存储位置是安全的。
下一步,我们就该来书写DB2 CLR存储过程的具体代码了,这里可以使用任何CLR支持的语言。我们在前面说明过,这个范例中所用的语言是C#,创建的C#类将被编译成程序集并被CLR使用。要在你的项目中添加一个C#类,右击位于“Solution Explorer”窗口中的你的项目,从菜单中选择“Add”*“New Project”,就将显示“Add New Projects”对话框。在“Project Types”列表中选择“Visual C# Projects”,接着从已安装的Visual Studio模板中选择“DB2 Class Library”(图18)。
图18——选择DB2 Class Library模板
在如图18所示的对话框中为你的类库指定名称和存储位置,然后点击“OK”按钮。这时你会发现在“Solution Explorer”窗口中DB2ClassLibrary1项目已经被添加到你的解决方案中了。在DB2ClassLibrary1项目中包含了对IBM.Data.DB2、System、System.Data和 System.XML命名空间的引用。同时,在DB2ClassLibrary1项目中还包含了AssemblyInfo.cs和DB2Class1.cs两个文件,DB2Class1.cs文件里已经自动生成了这个项目的基本结构。这时,我们可以开始添加具体的功能代码了。
当你完成了存储过程的编码工作后,你可以通过选择Visual Studio的菜单项“Build”*“Build DB2ClassLibrary 1 ” 。还有另外一种方法,你可以右击“Solution Explorer”窗口中的DB2ClassLibrary1项目,在弹出的菜单中选择“Build”菜单选项。
一旦程序集已经生成得到,你就需要安装程序集到DB2数据库中。要安装程序集,右击“Solution Explorer”窗口中的DB2ClassLibrary1项目,如图19所示,在弹出的菜单中选择“Assemblies…”菜单选项。
图19——部署DB2 UDB程序集
然后就会显示“CLR Assemblies”对话框。在“File name”文本框中,选择我们在前面步骤中生成得到的DB2ClassLibrary1.DLL,然后点击“Install”按钮来将这个程序集安装到DB2数据库中。
当“Installation of CLR Assembly Successful”对话框显示时,点击“OK”来继续进行下一步——添加CLR存储过程。
在你安装了程序集到DB2 UDB数据库之后,你就可以添加一个CLR存储过程到DB2中。要添加存储过程到你的项目中,点击菜单项“Project”*“Add New Item…”,“Add New Item – DB2DatabaseProject”对话框就会显示,在显示的Visual Studio模板中选择“CLR Procedure Wizard”项。
CLR Procedure Wizard将开始运行,它将带领你一步步地完成利用已生成的.NET程序集创建DB2存储过程的过程。在CLR Procedure Wizard中,你将选择用于存储过程的方法并可选地为其指定属性值,在这过程中,你将先后选择用于生成存储过程脚本的方法、名称和架构说明。这个过程和在Visual Studio 2005/SQL Server 2005中的实施过程有很大的差别,在后者中,代码属性已指明了用于存储过程的方法。在DB2 UDB中的这种方式导致了开发流程和部署过程的不统一,容易产生错误并需要更多的工作量。
做完相应的选择之后,点击“Finish”来创建CLR存储过程脚本,在你的项目中将创建一个名为DB2CLRProcedure.db2sp的项目,在这其中包含了在DB2中创建存储过程所需要的CREATE PROCEDURE语句。
最后,选择Visual Studio的菜单项“Build”*“Build Solution”来生成解决方案,在这个生成的过程中将首先编译这个DB2数据库项目并随后将其部署到你前面在“Data Connections”中指定的DB2系统中。注意,在这里Build Solution的操作将自动地把对象部署到数据库中,也就意味着不需要一个单独的部署操作。
对于DB2 CLR存储过程没有集成的调试功能供使用。
功能领域 | SQL Server | DB2 |
创建数据库 | 是 | 是 |
浏览数据库数据和元数据 | 是(Server Explorer) | 是(IBM Explorer) |
创建存储过程 | 是——使用模板 | 是——使用模板 |
选择用于存储过程的方法 | Attributes | Wizard |
创建函数 | 是——使用模板 | 是——手动操作 |
创建触发器 | 是——使用模板 | 否 |
创建用户自定义类型(UDT) | 是——使用模板 | 否 |
创建聚集 | 是——使用模板 | 否 |
部署CLR对象 | 是——使用Visual Studio 2005菜单项 | 是——使用Visual Studio 2003菜单项 |
调试CLR对象 | 是——使用Visual Studio 2005调试器 | 否 |
SQL Server 2005还提供了许多新功能,使得不能仅仅把它看成一个关系型数据平台,而这些功能在DB2 UDB中都没有。SQL Server 2005能够作为一个HTTP端点(endpoint),也就是说它能处理Web Services请求而不需要任何像IIS这样的Web服务器的帮助。它还提供了三个新的应用程序子系统:SQL Server Service Broker、SQL Server通知服务和SQL Server 报表服务。
HTTP端点
SQL Server 2005中一个非常有意义的新功能就是在数据库引擎中添加了对HTTP的支持。这就允许了SQL Server能直接处理Web Services请求而不需要IIS或者其他任何Web服务器的帮助。也就是说,SQL Server能够通过SOAP协议传输动态SQL语句的执行结果以及存储过程的调用信息。这种对HTTP的支持与SOAP1.0、1.2和WSDL1.1标准相兼容。SQL Server 2005的这个新功能还支持Windows和SQL Servery验证模式以及SSL。为了完全和数据应用的编程方式兼容,CLR存储过程的执行结果能以ADO.NET Dataset的形式返回。
而DB2 UDB 8.2结合Web服务器才能处理Web Services SOAP请求。
SQL Server 2005中的Service Broker能使得在开发应用程序时能充分发挥分布式数据库的配置从而提高可伸缩性。有了Service Broker,我们能使用异步队列去构建伸缩性出色的应用程序,因为它的处理方式不是串行处理,因而能响应更多的请求。异步的处理方式能在负荷高峰时将超负荷的请求缓存下来,压后处理,从而提高了应用程序的可伸缩性。SQL Server 2005中的Service Broker子系统保证了在SQL Server实例之间传递消息的可靠性,而且是完全事务化的。就如同标准的数据库事务一样,组成队列事件的事务也能被提交和回滚。使用SQL Server Service Broker构建的异步队列应用程序能够跨越多个SQL Server系统并始终能确保它们之间消息的传递。
IBM DB2 UDB 8.2不支持在分布式数据库实例之间的异步连接。
另一个新的应用程序开发框架——SQL Server通知服务的出现,使得数据库开发人员能够建立传递所选信息到多个订阅者或设备上的消息应用程序。通知服务最初是作为SQL Server 2000的一个下载组件推出的,而现在已经被融合进SQL Server 2005,成为其标准组件。例如,NYTimes.com使用通知服务将不动产列表上的变化告知给相关的当事人。SQL Server通知服务伸缩性良好并包含对终端用户设备的支持。Microsoft为构建企业级的通知应用程序平台已经作了大量的工作,这些工作的成果就是大家现在看到的这个健壮的,可伸缩的并经过测试的程序开发框架——通知服务,一个消息应用程序平台的领先者。
IBM DB2 UDB缺少这种功能。
SQL Server 2005的一个非常重要的功能增强就是拥有在所有数据库平台中独一无二的报表服务。最初,报表服务是作为SQL Server 2000的一个附加产品出现的,而如今,全新的SQL Server 2005报表服务子系统已经完全地集成进SQL Server 2005了。它是一个企业级的报表系统,利用它能可视化地构造报表并将其在企业内部安全地部署。SQL Server 2005报表服务是一个整体的报表解决方案,它能从相当广泛的数据源中汲取信息,包括SQL Server、Oracle、DB2以及许多OLE DB、ODBC兼容的数据库。由报表服务生成的报表能以非常丰富的格式呈现,包括打印格式、基于Web的HTML报表、基于Windows的多种客户端报表以及在移动设备上呈现的报表。
IBM在DB2中没有提供相似的功能。客户只有另外再花费去购买一个单独的报表工具插件。
SQL Server 2000中带有了数据转换服务(DTS),用于抽取和装载数据。
在SQL Server 2005中,DTS被重新设计并赋予了一个新名称:Integration Services。Integration Services与.NET集成性更好,有着更好的性能以及更好的适应性。Microsoft在SQL Server 2005中引入Integration Services的目标是将其发展成为一个企业级的ETL工具,因此,如今的Integration Services所提供的功能和性能与其他第三方独立厂商的ETL产品相差无几。Microsoft对Integration Services的重新设计赋予了它全新的架构和工具集,由此得到了对可编程性更好的支持和改善了的运行性能。新的设计架构将数据传输与工作流明显地区分开来,使得能更加容易地创建一个可复用的、可伸缩的Integration Services包。和以前的版本一样,全新的Integration Services依旧使用OLE DB去连接数据源和数据目标,和以前的DTS一样灵活。Integration Services能在所有主流的数据库平台之间传输数据,包括SQL Server、Oracle、DB2,同时还能把Sybase、Excel文件、MySQL、Active Directory、Firebird等其他形式的数据存储作为数据源或数据目的。SQL Server 2005 Integration Services的图形化设计器经过全新设计,大量地扩充了数据传输任务和数据转换任务。
在IBM DB2中,顾客需要额外花费去购买具有相似功能的模块。
自从在SQL Server 7.0版本中集成了OLAP服务之后,Microsoft就一直是商业智能(BI)领域的领跑者。经过这些年的发展,OLAP已经从一个不起眼的技术变成了数据库市场的主流。BI技术能够让组织机构从日常的运营数据中获取更多有意义的信息用于预算和决策,它使用OLAP、数据仓库和数据挖掘技术来概括和查询数据,这些技术操作数据的方式是不可能使用纯粹的关系型数据访问技术来实现的。到了SQL Server 2005时代,分析服务将依旧是最主要的BI平台。Microsoft对于SQL Server 2005分析服务的引擎做了很大的改进。在SQL Server 2005中,分析服务可以支持多实例。另外,分析服务的安装进程能自动侦测到集群的存在,这样,分析服务就能无缝地安装在故障转移集群上了。对于SQL Server 2005来说,另一个可能是在OLAP领域具有划时代意义的新功能是引入了Unified Dimensional Model(UDM)。UDM是被看作是OLAP立方体的下一代技术,它的统一报表模型结合了OLAP技术和关系型报表的各自优势。
在IBM DB2中,顾客需要额外花费去购买具有相似功能的模块。
Mobile Edition
在过去的每个SQL Server新版本中,逐步引入了对集群、分布式分区视图以及64位计算的支持,使得SQL Server的功能越来越多、规模越来越大、处理能力越来越强,我们用户也享受到由此带来的便利。但有一个问题我们常常忽略,就是能否把SQL Server的规模按比例缩减。SQL Server 2005 Mobile Edition实现了这点,它可以将企业数据管理延伸到移动设备上,SQL Server 2005 Mobile Edition运行在Windows CE系统平台上,将关系数据库的功能拓展到了设备级别,提供了经过优化的查询处理机制,支持事务和数据类型,并能通过.NET Compact Framework实现对设备级别数据库的访问。SQL Server 2005 Mobile Edition拓展了能够访问SQL Server数据库的边界,它支持远程访问数据并能在企业服务器和移动设备之间复制数据。
IBM DB2家族包含一个移动版本的数据库,叫做DB2e。不过,DB2e是和DB2 UDB 8.2分开出售的。
将CLR集成进数据库增强了数据库平台的功能和适用性,使得在数据库和数据层之间迁移代码变为可能。CLR与数据库的集成还拓展了数据库平台的性能,利用.NET框架丰富的编程功能构建出的自定义数据库对象的加入使得我们开发出的数据库应用程序更加强大并能灵活适应于变化中的外部环境。
虽然在SQL Server 2005和DB2 UDB中都能嵌入.NET对象,但很明显,SQL Server 2005与DB2 UDB 8.2相比有着显著的优势。这篇白皮书中的叙述已经明白无误地显示了SQL Server 2005与Visual Studio和.NET框架的集成的紧密程度要远远胜于DB2 UDB 8.2与它们的集成程度。SQL Server 2005对CLR的广泛支持表现在除了存储过程和函数之外,还能创建的其他数据库对象,而DB2 UDB只支持创建存储过程和函数。由于SQL Server是以“进程内”的方式与CLR集成的,这种集成方式更为紧密,因此,得到的解决方案也更有效率,提高内存使用率,支持线程,垃圾回收等CLR功能是在DB2中是没有的。“技术演示”部分详尽地描述了SQL Server 2005与Visual Studio的紧密集成所带来的优势,演示了无缝地进行数据库对象开发、部署和调试的整个过程。另外,除了关系型数据库,SQL Server 2005中还集成了Service Broker、通知服务、分析服务、Integration Services和报表服务,这使得SQL Server 2005不仅仅是一个单纯的数据库平台,而是一个完整的应用程序开发平台,这一点,DB2 UDB 8.2无法提供。
Michael Otey是Windows IT Pro Magazine的技术总监和SQL Server Magazine的资深技术编辑。它同时还是TECA Inc.的总裁,TECA Inc.是一家软件开发和咨询公司,这家公司专注于协同工作软件和数据库应用程序。Michael从1983年开始已经与DB2的多个版本打过交道。Michael还是由 is the Osborne McGraw Hill出版的SQL Server 2005 New Features Guide的作者。
Denielle Otey是TECA Inc.的副总裁以及软件顾问,她对于使用C、VC++、VB和Visual Studio .NET进行软件设计、实施、测试和调试有着丰富的经验。她同时还是数款SQL Server工具的开发者,她在TECA Inc.中负责开发和部署DB2应用程序。她还是由Osborne McGraw Hill出版的ADO.NET The Complete Reference的合著者。