什么是扩展?

扩展存储过程使您得以使用象C这样的创建自己的外部例程。对用户来说,扩展存储过程与普通存储过程一样,执行方法也相同。可将参数传递给扩展存储过程,扩展存储过程可返回结果,也可返回状态。扩展存储过程可用于扩展Microsoft SQL Server™2000的功能。

扩展存储过程是SQL Server可以动态装载并执行的动态链接库(DLL)。扩展存储过程直接在SQL Server的地址空间运行,并使用SQL Server开放式数据服务(ODS)API编程。

编写好扩展存储过程后,固定服务器角色sysadmin的成员即可在SQL Server中注册该扩展存储过程,然后授予其他用户执行该过程的权限。扩展存储过程只能添加到master数据库中。

使用C#编写扩展存储过程

下面就以一个简单的例子来演示如何用C#编写扩展存储过程。
首先,我们创建一个简单的C#类库文件:

//C# file: Csserver.cs

usingSystem;
usingSystem.Runtime.InteropServices;
usingSystem.Reflection;
usingSystem.Runtime.CompilerServices;

[assembly:AssemblyTitle("CSServer")]
[assembly:AssemblyDescription("Test SQL .NET interop")]
[assembly:AssemblyVersion("1.0.0.1")]
[assembly:AssemblyDelaySign(false)]
[assembly:AssemblyKeyFile("MyKey.snk")]
namespace SQLInterop
{
    public interface ITest
    {
       string SayHello();
     }
  [ClassInterface(ClassInterfaceType.AutoDual)]
  public class CsharpHelper : ITest
  {
     public string SayHello()
       {
          return "Hello from CSharp";
        }
  }
}

然后创建用 sn-k 为该类库创建一个强名密钥文件,并编译之。
sn-k MyKey.snk
csc /t:library Csserver.cs

注册该类库:
regasm /tlb:Csserver.tlb csserver.dll /codebase

这样一个扩展存储过程就编写注册完了,下面我们在sqlserver中测试一下效果。

T-SQLstoredproc.

DECLARE @object int
DECLARE @hr int
DECLARE @property varchar(255)
DECLARE @return varchar(255)
DECLARE @src varchar(255),@desc varchar(255)

--创建对象实例。
EXEC @hr = sp_OACreate‘SQLInterop.CsharpHelper‘,@object OUT
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END

--调用对象方法。
EXEC@hr=sp_OAMethod @object,‘SayHello‘,@return OUT
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END
PRINT@return

--销毁对象实例。
EXEC @hr=sp_OADestroy @object
IF@hr<>0
BEGIN
EXEC sp_OAGetErrorInfo @object,@src OUT,@desc OUT
SELECT hr=convert(varbinary(4),@hr),Source=@src,Description=@desc
RETURN
END
posted on 2010-08-05 18:26  davidding  阅读(448)  评论(0编辑  收藏  举报