在需要在SQL Server数据库中存储或检索数据时,通常会使用T-SQL。但是,如何将T-SQL与外部应用程序集成呢?例如,想要将SQL Server与Microsoft Word、Excel或Microsoft Exchange Server等集成。那么,如何实现这一点呢?
有七个扩展存储过程可以调用外部应用程序,如DLL。以下是这些存储过程的名称和描述:
参考:SQL Server Books Online。
让通过一个简单的例子来实现这一点。需求是从SQL Server存储过程中访问第三方DLL。
以下是用C# .NET开发的两个函数:
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对象运行的执行上下文。如果指定,此值必须是以下之一:
如果没有指定,默认值是5。
如果指定上下文值为4,本地OLE服务器无法访问任何SQL Server资源,它无法损坏SQL Server内存或资源。最后,sp_OADestroy将销毁SQL Server中创建的OLE对象。
参考:SQL Server Books Online。
在注册COM+时,必须使用以下命令使用Visual Studio命令提示符。
注意:不要使用regsvr32注册COM+。