从sql存储过程加载和调用C#(程序集)

cMi*_*nor 5 c# c++ dll sql-server-2008

假设我有简单的C#代码打印HELLO WORLD如在这里

using System;
using System.Data;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;

public class HelloWorldProc
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void HelloWorld()
    {
        SqlContext.Pipe.Send("HELLO WORLD!\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

所以他们在那页说:

本主题概述了使用Microsoft SQL Server与Microsoft .NET Framework公共语言运行时(CLR)集成来编译数据库对象所需的命名空间和库.该主题还向您展示了如何编写,编译和运行用Microsoft Visual C#编写的简单CLR存储过程.

CLR集成功能在名为system.data.dll的程序集中公开,该程序集是.NET Framework的一部分.可以在全局程序集缓存(GAC)以及.NET Framework目录中找到此程序集.通常由命令行工具和Microsoft Visual Studio自动添加对此程序集的引用,因此无需手动添加它.

在创建(编译它并添加到路径dll)之后,您可以将该代码用作存储过程,如:

CREATE ASSEMBLY helloworld from 'c:\helloworld.dll' WITH PERMISSION_SET = SAFE
Run Code Online (Sandbox Code Playgroud)

一旦创建了程序集,我们现在可以使用create procedure语句访问我们的HelloWorld方法.我们将调用我们的存储过程"hello":

CREATE PROCEDURE hello
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld
Run Code Online (Sandbox Code Playgroud)

一旦创建了该过程,就可以像在Transact-SQL中编写的普通存储过程一样运行它.执行以下命令:

EXEC hello
Run Code Online (Sandbox Code Playgroud)

删除该proc:

drop procedure hello
Run Code Online (Sandbox Code Playgroud)

删除该过程后,您可以删除包含示例代码的程序集.

drop assembly helloworld
Run Code Online (Sandbox Code Playgroud)

介绍之后:

我需要使用也使用extern dll的C++代码,我的问题如下,

我怎么能在C#中使用我的C++代码(也使用extern dll),例如,在我执行存储过程的那一刻创建程序集之后,以下是transparant:

  1. SQL创建程序集,然后在DLL中调用C#代码.
  2. C#代码调用C++代码(在dll中)
  3. C++代码调用extern dll.

所以我只做

EXEC你好

以及所有发生的事情(SQL SERVER - > C# - > C++ - > extern dll).

  • 如何使所有这个dll派对继续并存,所以我只在SQL Server中执行Stored proc,如 EXEC hello

我在考虑

[DllImport("cCode.dll")]
Run Code Online (Sandbox Code Playgroud)

但如果c ++代码依赖于extern dll ...我迷路了

Mic*_*ito 5

好吧,如果你要走这条路,你可能会跳过使用C#作为C++ dll的包装器(因为听起来你只是想尝试使用SQL Server CLR集成作为调用C++例程).

相反,您可以在服务器上创建并注册C++ COM +应用程序(示例),并使用sp_OACreate和相关过程从SQL Server调用它.仅供参考:如果需要,您也可以在C#中创建COM +应用程序,但与C++ DLL进行交互可能需要更多工作.

我认为您可以更好地使用此方法,因为COM +应用程序可以配置为在专用服务器进程中运行,而不是在SQL Server进程中运行.

也许你的情况另有说明,但正如其他人评论的那样,最好将这种"集成"留在数据库之外并将其放入一个单独的应用层.