315技术社区's Archiver

咨询客服QQ:604164

wolaile 发表于 2008-5-11 10:53

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

[b]什么是扩展[/b][b]存储[/b][b]过程?

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

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

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

    [b]使用 C# 编写扩展存储过程
[/b]
    下面就以一个简单的例子来演示如何用 C# 编写扩展存储过程。首先,我们创建一个简单的C#类库文件: [color=#008000]//[/color][color=#008000]C# file: Csserver.cs [/color]

[color=#0000ff]using[/color][color=#000000] System;[/color][color=#0000ff]using[/color][color=#000000] System.Runtime.InteropServices;[/color][color=#0000ff]using[/color][color=#000000] System.Reflection;[/color][color=#0000ff]using[/color][color=#000000] System.Runtime.CompilerServices;[assembly: AssemblyTitle([/color][color=#000000]"[/color][color=#000000]CSServer[/color][color=#000000]"[/color][color=#000000])][assembly: AssemblyDescription([/color][color=#000000]"[/color][color=#000000]Test SQL .NET interop[/color][color=#000000]"[/color][color=#000000])][assembly: AssemblyVersion([/color][color=#000000]"[/color][color=#000000]1.0.0.1[/color][color=#000000]"[/color][color=#000000])][assembly: AssemblyDelaySign([/color][color=#0000ff]false[/color][color=#000000])][assembly: AssemblyKeyFile([/color][color=#000000]"[/color][color=#000000]MyKey.snk[/color][color=#000000]"[/color][color=#000000])][/color][color=#0000ff]namespace[/color][color=#000000] SQLInterop {[/color][color=#0000ff]public[/color]
[color=#0000ff]interface[/color][color=#000000] ITest{[/color][color=#0000ff]string[/color][color=#000000] SayHello();}[ClassInterface(ClassInterfaceType.AutoDual)][/color][color=#0000ff]public[/color]
[color=#0000ff]class[/color][color=#000000] CsharpHelper : ITest {[/color][color=#0000ff]public[/color]
[color=#0000ff]string[/color][color=#000000] SayHello() {[/color][color=#0000ff]return[/color]
[color=#000000]"[/color][color=#000000]Hello from CSharp[/color][color=#000000]"[/color][color=#000000];}}} [/color]

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

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

    这样一个扩展存储过程就编写注册完了,下面我们在sql server中测试一下效果。T-SQL stored proc.
[color=#0000ff]DECLARE[/color]
[color=#008000]@object[/color]
[b]int[/b]
[color=#0000ff]DECLARE[/color]
[color=#008000]@hr[/color]
[b]int[/b]
[color=#0000ff]DECLARE[/color]
[color=#008000]@property[/color]
[b]varchar[/b][color=#000000]([/color][b]255[/b][color=#000000])[/color][color=#0000ff]DECLARE[/color]
[color=#008000]@return[/color]
[b]varchar[/b][color=#000000]([/color][b]255[/b][color=#000000])[/color][color=#0000ff]DECLARE[/color]
[color=#008000]@src[/color]
[b]varchar[/b][color=#000000]([/color][b]255[/b][color=#000000]), [/color][color=#008000]@desc[/color]
[b]varchar[/b][color=#000000]([/color][b]255[/b][color=#000000])[/color][color=#008080]--[/color][color=#008080] 创建对象实例。 [/color]
[color=#0000ff]EXEC[/color]
[color=#008000]@hr[/color]
[color=#808080]=[/color][color=#000000] sp_OACreate [/color][color=#ff0000]'[/color][color=#ff0000]SQLInterop.CsharpHelper[/color][color=#ff0000]'[/color][color=#000000], [/color][color=#008000]@object[/color][color=#000000] OUT[/color][color=#0000ff]IF[/color]
[color=#008000]@hr[/color]
[color=#808080]<>[/color]
[b]0[/b]
[color=#0000ff]BEGIN[/color]
[color=#0000ff]EXEC[/color][color=#000000] sp_OAGetErrorInfo [/color][color=#008000]@object[/color][color=#000000], [/color][color=#008000]@src[/color][color=#000000] OUT, [/color][color=#008000]@desc[/color][color=#000000] OUT[/color][color=#0000ff]SELECT[/color][color=#000000] hr[/color][color=#808080]=[/color][color=#ff00ff]convert[/color][color=#000000]([/color][b]varbinary[/b][color=#000000]([/color][b]4[/b][color=#000000]),[/color][color=#008000]@hr[/color][color=#000000]), Source[/color][color=#808080]=[/color][color=#008000]@src[/color][color=#000000], Description[/color][color=#808080]=[/color][color=#008000]@desc[/color]
[color=#0000ff]RETURN[/color]
[color=#0000ff]END[/color]
[color=#008080]--[/color][color=#008080] 调用对象方法。 [/color]
[color=#0000ff]EXEC[/color]
[color=#008000]@hr[/color]
[color=#808080]=[/color][color=#000000] sp_OAMethod [/color][color=#008000]@object[/color][color=#000000], [/color][color=#ff0000]'[/color][color=#ff0000]SayHello[/color][color=#ff0000]'[/color][color=#000000], [/color][color=#008000]@return[/color][color=#000000] OUT[/color][color=#0000ff]IF[/color]
[color=#008000]@hr[/color]
[color=#808080]<>[/color]
[b]0[/b]
[color=#0000ff]BEGIN[/color]
[color=#0000ff]EXEC[/color][color=#000000] sp_OAGetErrorInfo [/color][color=#008000]@object[/color][color=#000000], [/color][color=#008000]@src[/color][color=#000000] OUT, [/color][color=#008000]@desc[/color][color=#000000] OUT[/color][color=#0000ff]SELECT[/color][color=#000000] hr[/color][color=#808080]=[/color][color=#ff00ff]convert[/color][color=#000000]([/color][b]varbinary[/b][color=#000000]([/color][b]4[/b][color=#000000]),[/color][color=#008000]@hr[/color][color=#000000]), Source[/color][color=#808080]=[/color][color=#008000]@src[/color][color=#000000], Description[/color][color=#808080]=[/color][color=#008000]@desc[/color]
[color=#0000ff]RETURN[/color]
[color=#0000ff]END[/color]
[color=#0000ff]PRINT[/color]
[color=#008000]@return[/color]
[color=#008080]--[/color][color=#008080] 销毁对象实例。 [/color]
[color=#0000ff]EXEC[/color]
[color=#008000]@hr[/color]
[color=#808080]=[/color][color=#000000] sp_OADestroy [/color][color=#008000]@object[/color]
[color=#0000ff]IF[/color]
[color=#008000]@hr[/color]
[color=#808080]<>[/color]
[b]0[/b]
[color=#0000ff]BEGIN[/color]
[color=#0000ff]EXEC[/color][color=#000000] sp_OAGetErrorInfo [/color][color=#008000]@object[/color][color=#000000], [/color][color=#008000]@src[/color][color=#000000] OUT, [/color][color=#008000]@desc[/color][color=#000000] OUT[/color][color=#0000ff]SELECT[/color][color=#000000] hr[/color][color=#808080]=[/color][color=#ff00ff]convert[/color][color=#000000]([/color][b]varbinary[/b][color=#000000]([/color][b]4[/b][color=#000000]),[/color][color=#008000]@hr[/color][color=#000000]), Source[/color][color=#808080]=[/color][color=#008000]@src[/color][color=#000000], Description[/color][color=#808080]=[/color][color=#008000]@desc[/color]
[color=#0000ff]RETURN[/color]
[color=#0000ff]END[/color]

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.