Échec de création d'un assembly dans SQL

J'ai déjà plongé dans la programmation SQL clr. Malheureusement, ma première tentative est troublée. Mon code d'assemblage C # est juste comme ça:

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

Et le code SQL est:

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

Mais j'obtiens ce message d'erreur de MSSMSE:

Msg 6218, niveau 16, état 3, ligne 1
CREATE ASSEMBLY pour l'assembly 'SQL_CLR' a échoué car l'assembly 'SQL_CLR' a échoué à la vérification. Vérifiez si les assemblys référencés sont à jour et fiables (pour external_access ou dangereux) à exécuter dans la database. Les messages d'erreur du vérificateur CLR, le cas échéant, suivront ce message

Je viens de rencontrer exactement le même problème.

C'est une vieille page, mais d'abord, formost et finalement, la DLL doit être construite avec .NET 2.0. SqlServer 2005 est construit avec .net 2.0, parce que c'est le dernier disponible quand il a été écrit. SqlServer 2008 peut également avoir le même problème.

La DLL et le SqlServer doivent tous les deux referencer la même version .NET framekwork. Une fois que j'ai compris cela, j'ai créé un projet séparé sous 2.0 et shazam! travaillé parfait la première fois.

Pour voir quelle version de .net votre server sql utilise:

 select * from sys.dm_clr_properties 

La réponse acceptée, tout en semblant résoudre le problème du PO, n'est que partiellement correcte et présente une explication trop simplist de la cause sous-jacente, qui pourrait conduire d'autres personnes ayant un problème similaire dans la mauvaise direction.

Le problème avec la réponse acceptée est un malentendu de l'environnement .NET, et ce même malentendu peut également être vu dans la question elle-même. Au sein de .NET, le CLR et le Framework sont deux choses distinctes, chacune avec leurs propres versions.

Le CLR (Common Language Runtime) est ce qui exécute le code managé. Ce n'est pas mis à jour presque aussi souvent que le cadre. Le .NET Framework est une collection de bibliothèques qui fournissent les moyens d'interaction avec une version particulière du CLR.

Une version unique du CLR a généralement plusieurs versions du Framework avec lequel il fonctionne. Une version unique du Framework ne fonctionne cependant qu'avec une version spécifique du CLR. Par exemple, CLR version 2.0 fonctionne avec Framework version 2.0, 3.0 et 3.5, tandis que CLR version 4.0 fonctionne avec toutes les versions 4.x du .NET Framework (par exemple 4.0, 4.5, 4.5.1, 4.5.2, 4.6 , etc). Pour afficher le graphique de la version CLR vers les relations de version Framework, consultez la page MSDN pour les versions .NET Framework et les dependencies .

En ce qui concerne le code SQLCLR, SQL Server ne fonctionne qu'avec une seule version du CLR et la version spécifique dépend de la version de SQL Server. SQL Server 2005, 2008 et 2008 R2 fonctionnent uniquement avec CLR version 2. Puisque CLR version 2 fonctionne uniquement avec .NET Framework versions 2.0, 3.0 et 3.5, cela signifie que SQL Server 2005, 2008 et 2008 R2 fonctionnent uniquement avec. NET Framework versions 2.0, 3.0 et 3.5. Bien sûr, SQL Server 2005 incluait uniquement .NET Framework version 2.0, de sorte qu'il existe quelques bibliothèques plus récentes dans .NET Framework version 3.0 et 3.5 qui ne fonctionnent pas dans SQL Server 2005 sans les importer manuellement ( System.Core et System par exemple). Xml.Linq ). Dans le même ordre d'idées, SQL Server 2012, 2014 et 2016 sont liés statiquement à CLR version 4, qui fonctionne avec .NET Framework versions 4.0, 4.5, 4.5.1, 4.5.2, 4.6.

En ce qui concerne les informations renvoyées à la fois par System.Environment.Version (dans la question) et par sys.dm_clr_properties.version (dans la réponse acceptée), elles signalent la version CLR et non la version Framework . Veillez donc à ne pas confondre ces deux choses rapportant 2.0 ou 4.0, ce qui signifie que vous ne pouvez utiliser que Framework version 2.0 ou 4.0.

Et heureusement, grâce à la rétrocompatibilité, le code compilé avec les versions de CLR 2 Framework (2.0, 3.0 et 3.5) fonctionnera sans avoir besoin d'être recompilé dans SQL Server 2012 et plus récent, même s'ils sont sur CLR version 4.

Ainsi, vous ne pouvez généralement pas vous tromper en utilisant une version de Framework Framework 2.0, mais vous pouvez certainement utiliser les versions de Framework au-delà de la version 2.0.

Pour un regard plus approfondi sur le développement du code SQLCLR, consultez l'article suivant (et la série en général), que j'ai écrit:

Stairway to SQLCLR Level 5: Développement (Utilisation de .NET dans SQL Server)

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

Essayez cela, et laissez-moi savoir si cela fonctionne.

La bibliothèque, System.Environment, n'est pas prise en charge pour CLR: http://msdn.microsoft.com/en-us/library/ms403279.aspx

Vous pouvez toujours l'utiliser, comme indiqué dans la section "Bibliothèques non sockets en charge" de l'article ci-dessus, mais gardez à l'esprit que le code n'a pas été testé pour la security et la fiabilité. Cela peut entraîner des résultats imprévisibles dans un environnement de production, pensez donc aux risques et testez soigneusement avant de les déployer.

Aussi, je crois que soit il doit avoir un nom fort ou être déployé dans une database marquée comme "Trustworthy" avant qu'il ne s'exécute.

Réponse courte: définissez la version de Sql Server et la version de .Net Framework sur la propriété de projet.

Tout d'abord, vous devez cocher définir la propriété de votre projet. Dans la propriété de projet, définissez la version du server SQL que vous souhaitez créer CLR pour celui-ci. puis choisissez la version .Net Framework. Par exemple, si vous voulez créer CLR pour SQL Server 2008, vous devez définir .Net Framework à 3.5 et pour 2005 choisir .Net 2.0. J'espère que cette solution vous aidera.