2011-11-01 45 views
20

我已經潛入SQL clr編程。不幸的是,我的第一次嘗試是困擾。 我的C#彙編代碼就是這樣:無法在SQL中創建彙編

enter code here 
public partial class FirstCLRRoutines 
{ 
    public static int GetCLRFrameworkMajorVersion() 
    { 
     return System.Environment.Version.Major; 
    } 
} 

和SQL代碼爲:

USE master 
GO 
CREATE ASSEMBLY [Chapter2.FirstCLRRoutine] 
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll' 

但我從MSSMSE此錯誤消息:

消息6218,級別16,狀態3,第1行
程序集「SQL_CLR」的CREATE ASSEMBLY失敗,因爲程序集「SQL_CLR」驗證失敗。檢查引用程序集是否爲 最新和可信(用於external_access或unsafe)在 數據庫中執行。 CLR驗證錯誤消息,如果有的話將遵循這一 消息

回答

36

我剛剛遇到完全相同的問題。

這是一箇舊頁面,但首先,formost最後,DLL 必須與.NET 2.0構建。 SqlServer 2005使用.net 2.0構建,因爲這是寫入時的最新版本。 SqlServer 2008也可能有同樣的問題。

DLL和SqlServer都必須引用相同的.NET框架版本。一旦我明白了這一點,我在2.0和shazam下創建了一個單獨的項目!第一次工作完美。

要查看版本的.NET您的SQL Server的使用:

select * from sys.dm_clr_properties 
+0

我有同樣的問題,但這一次,它爲System.Xaml。我如何解決這個問題?組件'System.Xaml'的CREATE ASSEMBLY失敗,因爲組件'System.Xaml'驗證失敗。檢查引用的程序集是否在數據庫中執行最新和可信(用於external_access或unsafe)。 CLR驗證錯誤消息,如果任何將遵循此消息 [:System.Windows.Markup.ValueSerializer :: CanConvertToString] [mdToken = 0x6000002] [偏移00000000]代碼大小爲零。 –

+0

不確定。聽起來可能是同一個問題。有沒有什麼辦法來驗證你的System.Xaml內建的.net版本?如果不同,這可能會導致問題。 – horace

+1

儘管這有效,但解釋並不完全正確。有關詳細信息,請參閱我的[回覆](http://stackoverflow.com/a/32334611/577765)(這些內容太多以至於無法發表評論)。 –

4
USE master 
GO 
CREATE ASSEMBLY [Chapter2.FirstCLRRoutine] 
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll' 
WITH PERMISSION_SET = UNSAFE 

嘗試這一點,讓我知道是否可行。

+0

我已經試過了 「不安全」 的模式,也不起作用 – Mesut

+0

公共部分類FirstCLRRoutines { 公共靜態INT GetCLRFrameworkMajorVersion(){ 回報 12; } } – Mesut

+0

對於OP的特定問題,這不是必需的,但是我需要這樣做來創建另一個程序集,當我試圖用'WITH PERMISSION_SET = EXTERNAL_ACCESS'創建它時,SQL Server最初會報告相同類型的錯誤。 –

0

圖書館,統環境,不支持CLR: http://msdn.microsoft.com/en-us/library/ms403279.aspx

,您仍然可以使用它,作爲上述文章的「不支持庫」章節中指出,但要記住的是,代碼尚未經過安全性和可靠性測試。這可能會在生產環境中導致不可預知的結果,因此在部署之前應考慮風險並進行認真測試。

另外,我相信它要麼必須具有強大的名稱,要麼在被執行之前被部署到標記爲「可信」的數據庫中。

+0

這並不工作,並給予同樣的錯誤信息,以及: – Mesut

+0

公共部分類FirstCLRRoutines { 公共靜態INT GetCLRFrameworkMajorVersion(){ 回報 12; } } – Mesut

+0

您是否嘗試過從Visual Studio進行部署? – brian

7

接受的答案,而似乎解決了OP的問題,只是部分正確的,並提出了基本的過於簡單化的解釋這可能會導致其他人在錯誤的方向上出現類似的問題。

接受答案的問題是對.NET環境的誤解,同樣的問題本身也可能會出現同樣的誤解。在.NET中,CLR和框架是兩個獨立的東西,每個都有自己的版本。

CLR(公共語言運行時)是什麼執行託管代碼。這不會像框架那樣經常更新。 .NET Framework是一組庫,提供與特定版本的CLR進行交互的基本手段。

單一版本的CLR通常具有多個版本的Framework,它可以使用。然而,單一版本的框架只適用於CLR的一個特定版本。例如,CLR 2.0版與Framework 2.0,3.0和3.5版一起工作,而CLR 4.0版與.NET Framework的所有4.x版(即4.0,4.5,4.5.1,4.5.2,4.6等)。要查看CLR版本的圖表以瞭解Framework版本關係,請參閱.NET Framework Versions and Dependencies的MSDN頁面。

關於SQLCLR代碼,SQL Server僅適用於單一版本的CLR,具體版本取決於SQL Server的版本。 SQL Server 2005,2008和2008 R2僅適用於CLR版本2.由於CLR版本2僅適用於.NET Framework版本2.0,3.0和3.5,這意味着SQL Server 2005,2008和2008 R2僅適用於。 NET Framework版本2.0,3.0和3.5。當然,SQL Server 2005只包含.NET Framework 2.0版本,因此.NET Framework 3.0和3.5版本中有一些更新的庫,在SQL Server 2005中無法手動導入它們(例如System.CoreSystem.Xml.Linq)。沿着同樣的路線,SQL Server 2012,2014和2016靜態鏈接到CLR版本4,該版本與.NET Framework版本4.0,4.5,4.5.1,4.5.2,4.6一起使用。

至於,他們所報告的CLR版本(在接受的答案)來自System.Environment.Version(在問題)和sys.dm_clr_properties.version返回的信息,框架版本。所以要小心,不要混淆報告2.0或4.0這兩個東西,因爲您只能使用Framework 2.0或4.0版本。

幸運的是,由於向後兼容性,針對CLR 2 Framework版本(2.0,3.0和3.5)編譯的代碼將無需在SQL Server 2012及更新版本中重新編譯即可運行,即使它們在CLR版本4上

因此,使用2.0版的目標框架版本時通常不會出錯,但您絕對可以使用2.0以後的Framework版本。

要更深入地瞭解開發SQLCLR代碼,請查看下面的文章(和一般的系列),我寫道:

Stairway to SQLCLR Level 5: Development (Using .NET within SQL Server)

0

簡短的回答: 集的SQL Server版本和項目屬性上的.Net Framework版本。

首先你必須檢查設置你的項目屬性。在項目屬性中設置要爲其創建CLR的SQL Server版本。然後選擇.Net Framework版本。例如,如果要爲SQL Server 2008創建CLR,則必須將.Net Framework設置爲3.5,對於2005,則選擇.Net 2.0。 我希望這個解決方案可以幫助你。