2011-06-08 55 views
4

假設我有簡單C#代碼打印HELLO WORLD如圖in here裝載和從SQL存儲過程

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"); 
    } 
} 

所以他們在網頁說調用C#(組裝):

本主題概述 名稱空間和庫所需的 編譯數據庫對象使用 Microsoft SQL Server集成 Micro軟.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 

一旦組件已經創建,我們現在可以訪問我們的HelloWorld方法通過使用create procedure語句。我們將調用我們的存儲過程「你好」:

CREATE PROCEDURE hello 
AS 
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld 

一旦程序被創建,它可以像寫在Transact-SQL正常的存儲過程運行。執行以下命令:

EXEC hello 

要丟棄PROC:

drop procedure hello 

一旦程序已被刪除,您可以刪除包含示例代碼的程序集。

drop assembly helloworld 

加完後:

我需要使用C++代碼,還使用一個外部的dll,我的問題是下面,

我怎樣使用我的C++代碼(這也使用extern dll)在這個C#裏面,就像這個例子,所以,在創建彙編之後,我執行存儲過程,下面是透明的:

  1. SQL創建程序集,然後調用dll內的C#代碼。
  2. C#代碼調用C++代碼(在dll中)
  3. C++代碼調用extern dll。

所以我只能做

EXEC你好

和所發生的一切(SQL SERVER - > C# - > C++ - > EXTERN DLL)。

  • 如何使這一切的dll方去和共存,所以我只執行在SQL Server存儲過程像 EXEC你好

我想在

[DllImport("cCode.dll")] 

但如果C++代碼依賴於extern dll ...我迷路了

+0

你最終想做什麼?如果您需要對一組數據執行復雜的邏輯,那麼爲什麼不在應用程序中對從數據庫檢索的一組數據執行該邏輯?保留數據庫以存儲/檢索數據,將業務邏輯放入應用程序中。 – 2011-06-08 00:40:20

+1

這是一個主要的設計失敗。僅僅因爲MS做了這個功能,使用它不是一個好主意。就像直接從aspx頁面調用db一樣。 – 2011-06-08 01:01:45

+0

@adymitruk:我想使用很多的源代碼,並避免重新編碼 – cMinor 2011-06-08 01:13:51

回答

4

那麼,如果你要走這條路,你可以跳過使用C#作爲C++ dll的包裝器(因爲它聽起來像你只是試圖使用SQL Server CLR集成作爲調用C++例程的手段)。

取而代之,您可以在服務器上創建並註冊C++ COM +應用程序(example),並使用sp_OACreate和相關的procedures從SQL Server調用此應用程序。僅供參考:如果需要,您也可以在C#中創建COM +應用程序,但與C++ dll的接口可能更多。

我想你會對這種方法有更好的運氣,因爲COM +應用程序可以配置爲在專用服務器進程中運行,而不是在SQL Server進程中運行。

也許您的情況會有其他規定,但正如其他人所評論的,最好將這種「集成」置於數據庫之外並將其放入單獨的應用程序層。

+0

我想做一個新的方法,編譯和部署一個CLR程序集所有在C#中,然後SQL Server與存儲過程可以執行一個DLL ... ,我喜歡你的COM +解決方案,有沒有其他方法可以做到DBMS內部的全部? – cMinor 2011-06-08 06:10:26

+0

我不確定你的意思是「所有DBMS內部」? – 2011-06-09 05:13:43