技术开发 频道

在SQL Server2005中使用.Net代码


重点


    希望从上面的代码中发现一点新的东西。首先所有的[SqlProcedure]是附加于GetMessage功函数上的,这暗示着CLR可以从SQL Server存储过程中调用函数。我要告诉你的是我自己的一些体会和经验。这些都是你不可能在出版的刊物和互联网上看到的。你必须记住,在调用CLR某一个函数时,SQL server nvarchar等同于System.String。但最重要一点是CLR使程序只能返回Int32, Int和无效数据类型。那就是我为什么使用GetMessage函数的输出参数了。我也用了SqlString代替System.String。请把上面所有的东西给牢牢记住。

    现在,我们来创建工程并且以后不去理会它了,因为从.net类库的角度来看,你的工作已经结束了。现在,我们再来看看SQL Server。我希望你还记着,在文章的开头我们能在服务器中使CLR集成。

    在数据库中,大家应把ManagedCode(受控代码)和SQLServer.dl注册一个集,为了注册这个集,你应在数据库中拥有主动权或者你应成为此地的系统和服务器的管理者。这个将要注册的集应在不安全的方式下注册。否则,它们将无法使源接近SQL Server 2005外部。还有,为了注册一个不安全的集,你应该能在你的角色或用户名里行使你的“不安全”的权利。以上所讲到的都是非常重要的,你应多加注意,否则就无法注册集。接下来,创建一个名为TestingCLR的数据库。在注册数据库中的.net集之前,你必须使用如下代码设置值得信赖的数据库选项。
ALTER DATABASE TestingCLR SET TRUSTWORTHY ON 
GO
    现在使用如下代码来注册ManagedCodeAndSQLServer.dll。

CREATE ASSEMBLY HelloDotNet 
AUTHORIZATION dbo
FROM 'E:\Important\SQL\ManagedCodeAndSQLServer\ManagedCodeAndSQLServer\bin\Debug\ManagedCodeAndSQLServer.dll'
WITH PERMISSION_SET = UNSAFE
GO
    我在重申一遍,dbo要是没有“不安全集的”权利,它是不会运行的。同样,如果我要在dll中使用.net某个特定的类的话,我必须以同样的方法在注册dll之前注册。例如,如果集中使用System.Messaging,将使用如下代码来注册:

CREATE ASSEMBLY Messaging 
AUTHORIZATION dbo
FROM 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll'
WITH PERMISSION_SET = UNSAFE
GO
    在资源管理器中,不必为了使用正常的泛函的特性而去注册dll,到TestingCLR database中打开Programmability选项,然后你将会在程序集中发现有一个已经用i.e. "HelloDotNet给定的名注册的集。到现在为止,做的已经差不多了。你必须知道你将要从集中调用到的函数的整个途径。在本文的例子中:ManagedCodeAndSQLServer.BaseFunctionClass 和 GetMessage都是我们要调用到的函数。现在,我用下面的程序集来创建一个简单的存储过程。

CREATE PROCEDURE usp_UseHelloDotNetAssembly 
@name nvarchar(200),
@msg nvarchar(MAX)OUTPUT
AS EXTERNAL NAME ManagedCodeAndSQLServer.[ManagedCodeAndSQLServer.BaseFunctionClass].GetMessage
GO
0
相关文章