N° de bogue : 101935 (SQLBUDT)
Symptômes
Lorsque vous utilisez un objet du common language runtime (CLR) de Microsoft SQL Server 2005, vous pouvez recevoir un message d’erreur semblable au suivant :
Msg 6522, niveau 16, état 2, ligne 1
Une erreur.NET Framework s’est produite lors de l’exécution de la routine de défini par l’utilisateur ou l’agrégat 'ObjectName' :
System.InvalidOperationException : Impossible de charger l’assembly de sérialisation généré dynamiquement. Dans un assembly des environnements d’hébergement, les fonctionnalités de charge sont limitées, envisagez d’utiliser le sérialiseur pré-généré. Consultez l’exception interne pour plus d’informations. ---> System.IO.FileLoadException : LoadFrom(), LoadFile(), Load et LoadModule() ont été désactivées par l’hôte.
System.IO.FileLoadException:
à System.Reflection.Assembly.nLoadImage (Byte [] rawAssembly, rawSymbolStore [] de Byte, preuve des éléments de preuve, StackCrawlMark et stackMark, Boolean fIntrospection)
à System.Reflection.Assembly.Load (Byte [] rawAssembly, Byte [] rawSymbolStore, securityEvidence de preuve)
à Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters options, les noms de fichiers String [])
à Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch (options de CompilerParameters, sources de String [])
à Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch (options de CompilerParameters, sources de String [])
à System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource (options de CompilerParameters, String [] s
...
System.InvalidOperationException:
à System.Xml.Serialization.Compiler.Compile (parent d’assemblage, chaîne ns, paramètres de CompilerParameters, preuve evidence)
à System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] xmlMappings, Type [] types, chaîne defaultNamespace, preuve evidence, paramètres de CompilerParameters, assemblage, Hashtable assemblys)
à System.Xml.Serialization.TempAssembly... ctor (XmlMapping [] xmlMappings, Type [] types, chaîne defaultNamespace, emplacement de la chaîne, preuve evidence)
à System.Xml.Serialization.XmlSerializer.GenerateTempAssembly (XmlMapping xmlMapping, de type chaîne defaultNamespace)
à System.Xml.Serialization.XmlSerializer... ctor (Type type, chaîne defaultNamespace)
à System.Xml.Serialization.XmlSe...
Par exemple, vous pouvez recevoir le message d’erreur lorsque vous utilisez un objet CLR qui appelle un service Web ou qui effectue la conversion de types définis par l’utilisateur au format XML à l’intérieur de SQL Server.
Cause
Ce problème se produit lorsqu’un objet CLR est converti en type de données XML. Lors de cette conversion se produit, Windows Communication Foundation (ancien nom de code « Indigo ») tente d’effectuer les opérations suivantes :
-
Générer un nouvel assembly de sérialisation XML.
-
Enregistrez l’assembly sur le disque.
-
Charger l’assembly dans le domaine d’application actuel.
Toutefois, SQL Server n’autorise pas ce type d’accès de disque dans le CLR SQL pour des raisons de sécurité. Par conséquent, vous recevez le message d’erreur qui est mentionné dans la section « Symptômes ». Plusieurs scénarios de risque de l’objet CLR être converti en type de données XML.
Pour plus d’informations sur Windows Communication Foundation, visitez le site Web de Microsoft Developer Network (MSDN) à l’adresse suivante :
http://msdn2.microsoft.com/en-us/library/ms735119.aspxVous pouvez recevoir le message d’erreur qui est mentionné dans la section « Symptômes » dans les scénarios suivants :
-
Le code CLR qui implémente explicitement les objets CLR utilise la classe XmlSerializer . Ces objets CLR peuvent inclure des procédures stockées, les fonctions, les types définis par l’utilisateur, les agrégats et les déclencheurs.
-
Vous utilisez un service Web dans le code CLR.
-
Vous envoyez ou recevez des objets CLR dans SQL Server à l’aide d’un accès HTTP/SOAP direct à SQL Server.
-
L’objet CLR convertit un type défini par l’utilisateur pour le type de données XML.
Résolution
Pour résoudre ce problème, vous devez utiliser l’outil XML Serializer Generator (Sgen.exe) pour créer l’assembly de sérialisation XML pour l’assembly d’origine manuellement. Ensuite, chargez les assemblys dans une base de données SQL Server.
Exemple de code
Par exemple, vous souhaiterez créer une fonction CLR qui renvoie des données XML à l’aide d’un assembly qui est créé par l’exemple de code suivant :
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Xml;
using System.Xml.Serialization;
using System.Text;
using System.IO;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString XMLTest()
{
Person p = new Person();
return new SqlString(p.GetXml());
}
public class Person
{
public String m_FirstName = "Jane";
public String m_LastName = "Dow";
public String GetXml()
{
XmlSerializer ser = new XmlSerializer(typeof(Person));
StringBuilder sb = new StringBuilder();
StringWriter wr = new StringWriter(sb);
ser.Serialize(wr, this);
return sb.ToString();
}
}
}
Lorsque vous appelez la fonction XMLTest dans SQL Server Management Studio, vous vous attendez à recevoir le résultat suivant :
<?xml version="1.0" encoding="utf-16"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m_FirstName>Jane</m_FirstName>
<m_LastName>Dow</m_LastName>
</Person>
Pour retourner le résultat correct, vous devez créer manuellement l’assembly de sérialisation XML pour l’assembly d’origine. Utilisez une des méthodes suivantes pour créer l’assembly de sérialisation manuellement.
Remarque Ces méthodes supposent que les conditions suivantes sont remplies :
-
Vous avez créé une base de données dbTest dans une instance de SQL Server 2005.
-
Tous les fichiers projet sont enregistrés dans le dossier C:\CLRTest.
Méthode 1 : Créer un projet CLR de SQL Server à l’aide de Microsoft Visual Studio 2005
Vous pouvez créer l’assembly de sérialisation à l’aide de l’option Générer des événements dans Microsoft Visual Studio 2005. Pour ce faire, procédez comme suit :
-
Démarrez Visual Studio 2005.
-
Créer un nouveau projet SQL Server appelée MyTest.
-
Dans la boîte de dialogue Ajouter une référence de base de données , cliquez sur la référence qui se connecte à la base de données dbTest , puis cliquez sur OK.
Si la référence n’est pas dans la liste, vous devez créer une nouvelle référence. Pour ce faire, cliquez sur Ajouter une nouvelle référence. -
Dans le menu projet , cliquez sur Ajouter un fonction. La boîte de dialogue Ajouter un nouvel élément s’affiche.
-
Cliquez sur Ajouter pour ajouter un nouveau fichier. Par défaut, le fichier est nommé Function1.cs.
Remarque Vous recevez le message d’erreur qui est mentionné dans la section « Symptômes » si vous déployez le projet sur la base de données, puis exécutez l’instruction Transact-SQL suivante :SELECT [dbTest].[dbo].[XMLTest] ()
Vous devez suivre les étapes 6 à 16 pour résoudre ce problème.
-
Ajoutez le code qui est répertorié dans la section « Exemple de Code » dans le fichier Function1.cs.
-
Dans le menu projet , cliquez sur Propriétés de MyTest.
-
Dans la boîte de dialogue MyTest , cliquez sur le
Option d’Événements de génération . -
Tapez la commande suivante dans la zone de ligne de commande d’événement après génération :
« C:\Program Files\Microsoft les Visual Studio 8\SDK\v2.0\Bin\sgen.exe » /force « $(TargetPath) »Remarque L’option /force génère un nouvel assembly de sérialisation chaque fois que vous modifiez l’assembly source. En outre, vous devez modifier cette commande si vous avez installé Visual Studio 2005 dans un autre dossier.
-
Dans le dossier C:\CLRTest, créez deux fichiers texte nommés scripts Predeployscript.sql et Postdeployscript.sql.
-
Ajoutez les instructions Transact-SQL suivantes dans le fichier de scripts Predeployscript.sql :
IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers')
DROP ASSEMBLY [MyTest.XmlSerializers] -
Ajoutez les instructions Transact-SQL suivantes dans le fichier Postdeployscript.sql :
CREATE ASSEMBLY [MyTest.XmlSerializers] from
'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
WITH permission_set = SAFE -
Dans le menu projet , cliquez sur Ajouter un élément existant.
-
Dans la boîte de dialogue Ajouter un élément existant , recherchez le dossier C:\CLRTest, puis cliquez sur tous les fichiers (*. *)dans la liste type de fichiers .
-
Dans la zone nom de fichier , tapez
Postdeployscript.sql de ; Scripts PreDeployScript.SQL, puis cliquez sur
OK. -
Dans le menu Générer , cliquez sur Déployer les MyTest.
-
Dans SQL Server Management Studio, exécutez l’instruction Transact-SQL suivante :
SELECT [dbTest].[dbo].[XMLTest] ()
Vous recevez le bon résultat.
Méthode 2 : Créer un projet SQL CLR dans la fenêtre d’invite de commandes de Visual Studio
-
Recherchez le dossier C:\CLRTest.
-
Créez un fichier texte nommé MyTest.cs.
-
Ajoutez le code qui est répertorié dans la section « Exemple de Code » dans le fichier MyTest.cs.
-
Ouvrez la fenêtre d’invite de commandes de Visual Studio 2005.
-
Tapez CD C:\CLRTestet appuyez sur ENTRÉE.
-
Tapez csc/t : library MyTest.cset appuyez sur ENTRÉE.
-
Tapez sgen.exe /force MyTest.dllet appuyez sur ENTRÉE.
-
Dans SQL Server Management Studio, exécutez les instructions Transact-SQL suivantes :
USE dbTest
GO
CREATE ASSEMBLY [MyTest] from 'C:\CLRTest\MyTest.dll'
GO
CREATE ASSEMBLY [MyTest.XmlSerializers.dll] from 'C:\CLRTest\MyTest.XmlSerializers.dll'
GO
CREATE FUNCTION XMLTest()
RETURNS nvarchar (max)
AS
EXTERNAL NAME MyTest.StoredProcedures.XMLTest
GO -
Dans SQL Server Management Studio, exécutez l’instruction Transact-SQL suivante :
SELECT [dbTest].[dbo].[XMLTest] ()
Vous recevez le bon résultat.
Si vous utilisez un assembly principal qui référence d’autres assemblys, vous devez générer les assemblys de sérialisation XML pour tous les assemblys qui sont référencés par l’assembly principal. Ensuite, vous devez charger ces assemblys de sérialisation XML dans la base de données SQL Server à l’aide de l’instruction CREATE ASSEMBLY.
État
Ce comportement est voulu par la conception.
Références
Pour plus d’informations sur la sérialisation XML à partir d’objets de base de données CLR, visitez le site Web MSDN suivant :
http://msdn2.microsoft.com/en-us/library/ms131088.aspxPour plus d’informations sur l’outil XML Serializer Generator, visitez le site Web MSDN suivant :