⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 介绍了数据库方面的基础知识
💻
📖 第 1 页 / 共 2 页
字号:

  sp_OADestroy objecttoken

  调用sp_OADestroy存储过程可以释放由参数objecttoken指定的对象,同时还释放这个对象所使用的内存和其他资源。下面是一个调用sp_OADestroy的命令:

  Exec sp_OADestroy @Object

  需要注意的是,T-SQL中的数据类型与其他的编程语言并非是一一对应的,在调用一个需要特定的数据类型的方法时就可能出错。"数据类型转换"工具条可以将SQL Server的数据类型转换为Visual Basic的数据类型。

  错误处理

  象在前面提到的那样,如果对存储过程的调用成功了,则会返回一个为0的HRESULT值,其他的HRESULT值则意味着发生了错误。要判断一个非零的HRESULT值,可以把HRESULT值传递给sp_OAGetErrorInfo存储过程,其语法如下:

  sp_OAGetErrorInfo [objecttoken] [, source OUTPUT] [, description OUTPUT] [, helpfile OUTPUT] [, helpid OUTPUT]

  第一个参数objecttoken是由sp_OACreate返回的对象标记。下面的四个参数返回错误信息。Source是产生这一错误信息的应用程序或库,Description是该错误的描述,如果有帮助文件的话,则该Helpfile是帮助文件的路径。这三个参数都是有符号或无符号字符型数据,sp_OAGetErrorInfo会根据定义的变量的大小截取返回的值。最后一个参数helpid是特定错误在帮助文件中的索引号。下面的命令调用sp_OAGetErrorInfo以获得某一个错误的更详细的信息:

  Declare @Source varchar(100), @Description varchar(255), @HelpFile varchar(260),@HelpID int


  Exec sp_OAGetErrorInfo @Object, @Source OUTPUT, @Description OUTPUT, @HelpFile OUTPUT, @HelpID OUTPUT

  SQL Server在线手册还提供了一个有关sp_DisplayOAErrorInfo存储过程的例子,该存储过程可以调用sp_OAGetErrorInfo把返回的值组织成格式化的字符串,以便把该信息写入日志文件中。关于sp_DisplayOAErrorInfo的更详细的信息,请参阅工具条, 另外,调用sp_OAStop储存过程可以关闭SQL Server的COM自动操作环境,它无需任何参数。关闭自动操作环境在大多数情况下并非是必需的,第一次调用sp_OACreate时自动操作环境会自动开启,SQL Server关闭时自动操作环境也会自动关闭。如果一个存储过程正在对一个对象进行自动操作,而另一个过程调用sp_OAStop时就会出现错误,因此我们不建议在程序中调用sp_OAStop,只有在调试一个没有运行的过程时,才可以通过一个查询窗口调用它。

  在实际工作中使用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自动操作没有什么变化,因此采用这种方法编写的代码在将来仍然可以使用下去。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -