场景: 我有一个使用 C# 调用普通 SQL Server 存储过程的现有应用程序。我正在考虑删除一些现有的存储过程并用 CLR 存储过程替换它们。我从未编写过 CLR 存储过程。
问题:
前提是 CLR 存储过程与它们要替换的存储过程具有相同的名称和参数。我是否必须对调用存储过程的 C# 代码进行任何更改?
场景: 我有一个使用 C# 调用普通 SQL Server 存储过程的现有应用程序。我正在考虑删除一些现有的存储过程并用 CLR 存储过程替换它们。我从未编写过 CLR 存储过程。
问题:
前提是 CLR 存储过程与它们要替换的存储过程具有相同的名称和参数。我是否必须对调用存储过程的 C# 代码进行任何更改?
制作 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");
}
}