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

5
假设我有简单的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");
    }
}

他们在该页面中说:
这个主题提供了一个概述,介绍了使用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

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

CREATE PROCEDURE hello
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld

一旦存储过程被创建,它可以像普通的 Transact-SQL 存储过程一样运行。执行以下命令:

EXEC hello

放弃该过程:
drop procedure hello

一旦该过程被删除,您可以移除包含样本代码的程序集。
drop assembly helloworld

在这个介绍之后:
我需要使用一个同时使用外部dll的C++代码,我的问题是:
如何在C#中使用我的C++代码(也使用外部dll),就像示例中一样,在创建程序集后,当我执行存储过程时,以下内容是透明的:
1. SQL创建程序集,然后调用dll中的C#代码。
2. C#代码调用C++代码(在dll中)。
3. C++代码调用外部dll。
所以我只需要执行
EXEC hello
所有这些发生的事情(SQL SERVER-> C#-> C++->外部dll)。
如何使所有这些dll同时运行并共存,以便我只需在SQL Server中执行存储过程,例如
EXEC hello
我正在考虑
[DllImport("cCode.dll")]

但如果C++代码依赖于外部DLL...我就会迷失方向。


你最终想要做什么?如果你需要对一组数据执行复杂的逻辑操作,为什么不在应用程序中对从数据库检索到的数据进行逻辑处理呢?将数据库留给存储/检索数据,将业务逻辑放在应用程序中。 - Daniel Mann
1
这是一个重大的设计失误。仅仅因为微软开发了这个功能,并不意味着使用它是一个好主意。就像从aspx页面直接调用数据库一样。 - Adam Dymitruk
@adymitruk:我想要使用大量的源代码并避免重新编码。 - edgarmtze
1个回答

5

如果你想沿着这条路走,你可以跳过使用C#作为C++ dll的包装器(因为听起来你只是想使用SQL Server CLR集成来调用C++例程)。

相反,你可以在服务器上创建和注册一个C++ COM+应用程序(示例),并使用sp_OACreate和相关过程从SQL Server调用它。顺便说一句,你也可以用C#创建COM+应用程序,但与C++ dll进行接口可能需要更多的工作。

我认为你采用这种方法会更加成功,因为COM+应用程序可以被配置为在专用服务器进程中运行,而不是在SQL Server进程中运行。

也许你的情况有所不同,但正如其他人评论的那样,最好将这种“集成”留在数据库之外,并将其放入单独的应用程序层中。


我正在尝试一种新的方法,使用C#编译和部署CLR程序集,然后SQL Server通过存储过程可以执行dll文件...我喜欢你的COM+解决方案,是否有其他方法可以在数据库管理系统内完成所有操作? - edgarmtze
我不确定你所说的“全部在DBMS内部”是什么意思? - Michael Petito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接