T-SQL与外部应用程序集成

在需要在SQL Server数据库中存储或检索数据时,通常会使用T-SQL。但是,如何将T-SQL与外部应用程序集成呢?例如,想要将SQL Server与Microsoft Word、Excel或Microsoft Exchange Server等集成。那么,如何实现这一点呢?

使用代码

有七个扩展存储过程可以调用外部应用程序,如DLL。以下是这些存储过程的名称和描述:

  • sp_OACreate:在MicrosoftSQL Server的一个实例上创建OLE对象的实例。
  • sp_OADestroy:销毁创建的OLE对象。
  • sp_OAGetErrorInfo:获取OLE Automation错误信息。
  • sp_OAGetProperty:获取OLE对象的属性值。
  • sp_OASetProperty:将OLE对象的属性设置为新值。
  • sp_OAMethod:调用OLE对象的方法。
  • sp_OAStop:停止服务器范围内的OLE Automation存储过程执行环境。

参考:SQL Server Books Online。

让通过一个简单的例子来实现这一点。需求是从SQL Server存储过程中访问第三方DLL。

以下是用C# .NET开发的两个函数:

  • 函数 (a) getOSPlatform:将返回系统平台。
  • 函数 (b) writeToFile:将文本写入名为CLRTempE.txt的文本文件,值由参数给出。
public string getOSPlatform() { // 返回系统平台。 return Convert.ToString(System.Environment.OSVersion.Platform); } public int writeToFile(string strPath, string strText) { int intResult = -1; try { if (strPath != "") { if (System.IO.File.Exists(strPath)) { FileStream stream = new FileStream(strPath, FileMode.Open, FileAccess.Write); StreamWriter writer = new StreamWriter(stream); writer.BaseStream.Seek(0, SeekOrigin.End); writer.Write("\nTimeStamp: [ " + Convert.ToString(System.DateTime.Now) + " ] " + strText + " || (:-> || Info ! [Successfully inserted.]"); writer.Write(Environment.NewLine); writer.Flush(); writer.Close(); } else { FileStream stream = new FileStream(strPath, FileMode.CreateNew, FileAccess.Write); StreamWriter writer = new StreamWriter(stream); writer.BaseStream.Seek(0, SeekOrigin.End); writer.Write("\nTimeStamp: [ " + Convert.ToString(System.DateTime.Now) + " ] " + strText + " || (:-> || Info ! [Successfully inserted.]"); writer.Write(Environment.NewLine); writer.Flush(); writer.Close(); } intResult = 0; } } catch (Exception ex) { throw ex; } return intResult; } CREATE PROCEDURE dbo.spCLRExample AS BEGIN DECLARE @intResult INT DECLARE @comHandle INT DECLARE @errorSource VARCHAR(8000) DECLARE @errorDescription VARCHAR(8000) DECLARE @inputText VARCHAR(500) DECLARE @OSPlatform VARCHAR(500) DECLARE @isSuccess INT SET @inputText = 'This is a simple text.' EXEC @intResult = sp_OACreate 'CLRExample.Example', @comHandle OUTPUT, 4 IF (@intResult <> 0) BEGIN -- 错误处理 EXEC sp_OAGetErrorInfo @comHandle, @errorSource OUTPUT, @errorDescription OUTPUT SELECT [Error Source] = @errorSource, [Description] = @errorDescription RETURN END -- 调用组件中的方法 EXEC @intResult = sp_OAMethod @comHandle, 'getOSPlatform', @OSPlatform OUTPUT PRINT @OSPlatform IF (@intResult <> 0) BEGIN -- 错误处理 EXEC sp_OAGetErrorInfo @comHandle, @errorSource OUTPUT, @errorDescription OUTPUT SELECT [Error Source] = @errorSource, [Description] = @errorDescription RETURN END -- 调用组件中的方法 EXEC @intResult = sp_OAMethod @comHandle, 'writeToFile', @isSuccess OUTPUT, 'C:\CLRTempE.txt', @inputText IF (@intResult <> 0) BEGIN -- 错误处理 EXEC sp_OAGetErrorInfo @comHandle, @errorSource OUTPUT, @errorDescription OUTPUT SELECT [Error Source] = @errorSource, [Description] = @errorDescription RETURN END -- 释放对COM对象的引用 EXEC sp_OADestroy @comHandle END GO

现在将讨论上述代码是如何工作的。

sp_OACreate将创建一个DLL实例到SQL Server。如果成功创建,输出将是0。如果不是零,则发送到sp_OAGetErrorInfo并获取错误消息。

sp_OAMethod用于调用DLL的方法。在第一种情况下,调用方法getOSPlatform,它只返回一个值。sp_OACreate的最后一个参数必须是1、4或5中的一个。它指定新创建的OLE对象运行的执行上下文。如果指定,此值必须是以下之一:

  • 1 = 仅限进程中(.dll) OLE服务器
  • 4 = 仅限本地(.exe) OLE服务器
  • 5 = 允许进程中和本地OLE服务器

如果没有指定,默认值是5。

如果指定上下文值为4,本地OLE服务器无法访问任何SQL Server资源,它无法损坏SQL Server内存或资源。最后,sp_OADestroy将销毁SQL Server中创建的OLE对象。

参考:SQL Server Books Online。

感兴趣的要点

在注册COM+时,必须使用以下命令使用Visual Studio命令提示符。

  • 命令:C:\Program Files\Microsoft Visual Studio 9.0\VC> RegAsm CLRExample.dll \ tlb: CLRExample.tlb \ codebase

注意:不要使用regsvr32注册COM+。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485