【问题标题】:loading and calling C# (assembly) from a sql stored proc从 sql 存储过程中加载和调用 C#(程序集)
【发布时间】:2011-06-08 12:31:43
【问题描述】:

假设我有简单的 C# 代码 来打印 HELLO WORLD,如图所示 in here

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)。题目也 向您展示如何编写、编译和 运行一个简单的 CLR 存储过程 用 Microsoft Visual C# 编写。

CLR 集成功能是 暴露在一个名为 system.data.dll,它是 .NET 框架。这个组件可以 在全局程序集缓存中找到 (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

介绍之后:

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

我如何在 C# 中使用我的 C++ 代码(也使用 extern dll),就像在示例中一样,所以,在我执行存储过程的那一刻创建程序集之后,以下是透明的:

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

所以我只做

执行你好

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

  • 如何使所有这些 dll 方继续并共存,所以我只在 SQL Server 中执行存储过程,例如 执行你好

我在想

[DllImport("cCode.dll")]

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

【问题讨论】:

  • 你最终想要做什么?如果您需要对一组数据执行复杂的逻辑,为什么不在应用程序中对从数据库检索的一组数据执行该逻辑呢?留下数据库来存储/检索数据,把你的业务逻辑放在应用程序中。
  • 这是一个重大的设计失败。仅仅因为MS做了这个功能,使用它并不是一个好主意。就像从 aspx 页面直接调用数据库一样。
  • @adymitruk:我想使用大量源代码并避免重新编码

标签: c# c++ sql-server-2008 dll


【解决方案1】:

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

相反,您可以在服务器上创建和注册一个 C++ COM+ 应用程序 (example),然后使用 sp_OACreate 和相关的 procedures 从 SQL Server 调用它。仅供参考:如果需要,您也可以在 C# 中创建 COM+ 应用程序,但与 C++ dll 交互可能需要更多工作。

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

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

【讨论】:

  • 我正在尝试一种新方法,在 C# 中编译和部署 CLR 程序集,然后带有存储过程的 SQL Server 可以执行 dll ......,我喜欢你的 COM+ 解决方案,有吗在 DBMS 中执行所有操作的其他方式??
  • 我不确定您所说的“全部在 DBMS 中”是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多