0

场景: 我有一个使用 C# 调用普通 SQL Server 存储过程的现有应用程序。我正在考虑删除一些现有的存​​储过程并用 CLR 存储过程替换它们。我从未编写过 CLR 存储过程。

问题:

前提是 CLR 存储过程与它们要替换的存储过程具有相同的名称和参数。我是否必须对调用存储过程的 C# 代码进行任何更改?

4

1 回答 1

2

制作 CLR proc 后,您还制作了一个调用底层 CLR proc 的存储 proc——因此,客户端应用程序无需更改。

真的有很简单的写。调试起来就更少了。

除非您打开安全漏洞,否则您只能使用 .net Framework 2.0 代码——根据我的经验,这是一个容易被忽视的问题。

在投入大量时间之前,还要确保您将拥有所需的权限(或愿意为您安装这些权限的 DBA)。

添加数据库绑定代码示例如下:

-- You must do the following once to enable CLR procs
-- sp_configure 'clr enabled', 1 
-- reconfigure

-- This adds .net 3.5 core to sql, reduces DB security, not recommended by MS
-- ALTER DATABASE [Mercedes] SET TRUSTWORTHY ON
-- Create assembly [System.Core] from 'C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\system.core.dll' with permission_set = unsafe 

-- Assuming the custom CLR dll is c:\abc\SqlModules\adlib.dll

/* If you are "rebinding" to this first

drop proc MB_ProcessInboundFiles
drop proc MB_Hello
drop assembly MB

*/

create assembly MB from 'c:\abc\SqlModules\adlib.dll'
with permission_set = EXTERNAL_ACCESS
GO

CREATE PROCEDURE MB_Hello (@say nvarchar(80)) WITH EXECUTE AS CALLER AS
EXTERNAL NAME MB.MBLib.MBhello

CREATE PROCEDURE MB_ProcessInboundFiles (@FtpInbound nvarchar(200), @FtpProcessed nvarchar(200)) WITH EXECUTE AS CALLER AS
EXTERNAL NAME MB.MBLib.MBProcessInboundFiles

-- add a quick test of the binding
exec MB_Hello 'Hi Dan'

这就是 MB_hEllo 的 C# 胆量

  [SqlProcedure]
  public static void MBhello(SqlString yousaid)
  {
    if (yousaid.IsNull)
    {
      yousaid = "Not too chatty are you " + Environment.UserDomainName + "\\" + Environment.UserName;
      SqlContext.Pipe.Send("Mercedes Benz says, '" + yousaid.ToString() + "'\n");
    }
    else
    {
      SqlContext.Pipe.Send("Mercedes Benz says, you said '" + yousaid.ToString() + "'\n");
    }
  }
于 2014-05-13T19:12:49.353 回答