SQL Server的T-SQL编程语言在数据存储和恢复方面功能强大,但在与SQL Server数据库之外的系统交互方面则功能较弱....
在实际工作中使用COM自动操作
至此,我们已经学习了如何使用每一个COM自动操作存储过程,我们现在来讨论一下一个综合应用它们的例子。程序清单1是一个名字为sp_OpenWordIfCoProcAvailable的过程,在这个过程中,我们用sp_OACreate创建了一个Microsoft Word的实例,然后使用sp_OAGetProperty来获取Word的MathCoProcessorAvailable属性,如果sp_OAGetProperty返回1,则sp_OpenWordIfCoProcAvailable向调用过程返回Word对象的对象标记;否则,sp_OpenWordIfCoProcAvailable关闭Word,并返回0。为了节省版面,我们只调用了出错处理过程一次,在实际应用中,应该在每次调用自动操作存储过程后都调用出错处理过程。注意,为对Word进行自动操作,应该在安装SQL Server的机器上安装Word。
程序清单 1:自动操作Word的方法的例子
Create Procedure sp_OpenWordIfCoProcAvailable As
Declare @Object int, @hr int, @RetVal int
Exec @hr = sp_OACreate 'Word.Application', @Object OUTPUT
If @hr <> 0
BEGIN
Exec sp_DisplayOAErrorInfo @Object, @hr
Return 0
END
Exec @hr = sp_OAGetProperty @Object, 'MathCoProcessorAvailable', @RetVal
If @hr=0
BEGIN
Exec @hr = sp_OAMethod @Object, 'Quit', 0
Exec @hr = sp_OADestroy @Object
Return 0
END
Exec @hr = sp_OAMethod @Object, 'Activate'
Return @Object
如果需要对一个使用Visual Basic编写的COM对象进行自动操作,调试它与SQL Server之间的互操作性是一件相当容易的事。我们需要在运行SQL Server的机器上安装有Visual Basic,在Visual Basic的编辑器中加载COM项目,设置一些断点,然后编译并运行该COM对象。在有存储过程对该对象进行自动操作时,在运行到一个断点时,编辑器就会自动切换到调试模式,我们就可以象调试其他的Visual Basic程序那样调试这个COM对象。如果要对调试过程实施更多的控制,可以使用T-SQL Debugger for VB插件,它能采用步进方式执行存储过程的代码。
此外,在SQL Server中应用COM自动操作我们还能作什么呢?下面是我曾使用SQL Server强大的COM自动操作功能的实际例子。前不久,我需要从一个SQL Server存储过程中使用一个通过命名管道进行通讯,而SQL Server中没有提供通过编程方式打开和使用命名管道的机制,我正好有一个可以使用命名管道通讯的VB例和库,因此就把这个库文件作成一个类,并创建了一个ActiveX DLL文件,然后从存储过程中对DLL进行自动操作。就这样,我就可以在SQL Server中使用命名管道通讯了。
另一次,我需要复制一些文件和数据库表。使用SQL Server的复制功能可以很方便地复制这些数据,但复制文件则要难得多,NT的目录同步功能很弱,不能满足要求。尽管我还可以把拷贝命令存到字符变量中,然后把变量传递给xp_cmdshell,但会遇到命令行长度的限制。更不方便的是,如果在拷贝过程中发生了错误,我不能很方便地判断错误发生在什么地方,因此,我就编写了一个ActiveX DLL,并通过自动操作它来处理文件的拷贝工作。
还有一次,我需要在SQL Server 6.5和Index Server 2.0之间先执行连结后再完成查询任务,如果使用带ADO的Windows 2000 Indexing Services和SQL Server 7.0,完成这样的工作非常简单,但如果不是使用这些产品,则要困难得多。首先,需要编写一个可以执行Index Server查询对象ixsso.dll的ActiveX DLL,对它进行自动操作,从Index Server目录中获得信息,并通过一个方法将信息返回到存储过程中。然后把这些数据保存到一个临时表中,再对它进行联结操作。COM自动操作再一次帮我解决了问题。
在存储过程中执行COM自动操作几乎可以使我们完成任何想完成的操作。SQL Server 2000中的COM自动操作没有什么变化,因此采用这种方法编写的代码在将来仍然可以使用下去。
查看本文来源