загрузка и вызов C # (сборка) из хранимого процесса sql - PullRequest
5 голосов
/ 08 июня 2011

предположим, у меня есть простой 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). Тема также показывает, как писать, компилировать и запустить простую хранимую процедуру CLR написано в Microsoft Visual C #.

Функциональность интеграции CLR выставлены в сборке под названием system.data.dll, который является частью .NET Framework. Эта сборка может быть находится в глобальном кэше сборок (GAC), а также в .NET Framework каталог. Ссылка на это сборка обычно добавляется автоматически обеими командными строками инструменты и Microsoft Visual Studio, так нет необходимости добавлять его вручную.

После создания (скомпилируя его и добавив в путь к DLL), вы можете использовать этот код в качестве хранимой процедуры, например:

CREATE ASSEMBLY helloworld from 'c:\helloworld.dll' WITH PERMISSION_SET = SAFE

После того, как сборка была создана, мы теперь можем получить доступ к нашему методу HelloWorld, используя оператор процедуры create. Мы будем называть нашу хранимую процедуру "привет":

CREATE PROCEDURE hello
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld

После того, как процедура была создана, ее можно запустить, как обычную хранимую процедуру, написанную на Transact-SQL. Выполните следующую команду:

EXEC hello

Чтобы бросить этот процесс:

drop procedure hello

После удаления процедуры вы можете удалить сборку, содержащую ваш пример кода.

drop assembly helloworld

После этого введения:

Мне нужно использовать код C ++, который также использует extern dll, и мой вопрос следующий,

Как я мог бы использовать мой код C ++ (который также использует extern dll) внутри этого C #, как в примере, поэтому после создания сборки в момент выполнения хранимого процесса следующее будет прозрачным:

  1. SQL создает сборку и затем вызывает код C # внутри dll.
  2. C # код вызывает C ++ код (внутри dll)
  3. Код C ++ вызывает extern dll.

Так что я делаю только

EXEC привет

и все, что происходит (SQL SERVER -> C # -> C ++ -> extern dll).

  • Как заставить всю эту dll-вечеринку продолжать и сосуществовать, поэтому я выполняю только хранимый процесс в SQL Server, как EXEC привет

Я думал в

[DllImport("cCode.dll")]

но если код c ++ зависит от внешней библиотеки dll ... я теряюсь

1 Ответ

5 голосов
/ 08 июня 2011

Что ж, если вы собираетесь пойти по этому пути, вы можете пропустить использование C # в качестве оболочки для вашей C ++ dll (поскольку, похоже, вы просто пытаетесь использовать интеграцию SQL Server CLR в качестве средства длявызов подпрограммы C ++).

Вместо этого вы можете создать и зарегистрировать приложение C ++ COM + ( пример ) на сервере и вызвать его из SQL Server, используя sp_OACreate и связанные процедуры .К вашему сведению: вы также можете создать приложение COM + в C #, если хотите, но может потребоваться больше усилий для взаимодействия с dll C ++.

Я думаю, вам больше повезет с этим подходом, поскольку приложение COM + может бытьнастроен для запуска в выделенном серверном процессе, а не в процессе SQL Server.

Может быть, ваша ситуация диктует иное, но, как прокомментировали другие люди, лучше оставить этот вид "интеграции" вне базы данных ипоместите его в отдельный прикладной уровень.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...