DetailPage-MSS-KB

Base de Dados de Conhecimento

ID do artigo: 913668 - Última revisão: quarta-feira, 23 de maio de 2007 - Revisão: 2.1

 
Bug #: 101935 (SQLBUDT)

Nesta página

Sintomas

Quando você usa um objeto de runtime (CLR) de linguagem comum no Microsoft SQL Server 2005, você receberá uma mensagem de erro semelhante à seguinte:
Msg 6522, nível 16, estado 2, linha 1
Ocorreu um erro do .NET Framework durante execução da rotina definida pelo usuário ou agregada 'ObjectName':
System.InvalidOperationException: Não é possível carregar assembly de serialização gerados dinamicamente. Em alguns assembly de ambientes de hospedagem funcionalidade de carga é restrita, considere o uso de serializador pre-generated. Consulte a exceção interna para obter mais informações. ---> System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) e LoadModule() foram desabilitados pelo host.
System.IO.FileLoadException:
em System.Reflection.Assembly.nLoadImage (byte [] rawAssembly, byte rawSymbolStore [], evidências evidências, StackCrawlMark & stackMark, Boolean fIntrospection)
em System.Reflection.Assembly.Load (byte [] rawAssembly byte [] rawSymbolStore, evidência securityEvidence)
em Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (CompilerParameters opções, String [] nomes de arquivos)
em Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources)
em Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources)
em System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] s
...
System.InvalidOperationException:
em System.Xml.Serialization.Compiler.Compile (conjunto pai, String ns, CompilerParameters parâmetros, evidência prova)
em System.Xml.Serialization.TempAssembly.GenerateAssembly (XmlMapping [] xmlMappings, tipos de [] tipo, String defaultNamespace, evidências de evidências, CompilerParameters parâmetros, assembly do assembly, assemblies Hashtable)
em System.Xml.Serialization.TempAssemblyconstrutor (XmlMapping [] xmlMappings, tipos de [] tipo, defaultNamespace String, String local, evidência prova)
em System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
em System.Xml.Serialization.XmlSerializerctor(Type Type, String defaultNamespace)
em System.Xml.Serialization.XmlSe...
Por exemplo, você receberá a mensagem de erro quando você usa um objeto CLR que chama um serviço da Web ou executa a conversão de tipos definidos pelo usuário em XML dentro do SQL Server.

Causa

Esse problema ocorre quando um objeto CLR é convertido para o XML tipo de dados. Quando esta conversão ocorre, o Windows Communication Foundation (anteriormente conhecido pelo codinome "Indigo") tenta fazer o seguinte:
  • Gere um novo assembly de serialização de XML.
  • Salve o assembly no disco.
  • Carregar o assembly no domínio de aplicativo atual.
No entanto, SQL Server não permite esse tipo de acesso a disco em SQL CLR por razões de segurança. Portanto, você receber a mensagem de erro mencionada na seção "Sintomas". Vários cenários, talvez o objeto CLR a ser convertido para o tipo de dados XML.

Para obter mais informações sobre o Windows Communication Foundation, visite o seguinte site da Web Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/library/ms735119.aspx (http://msdn2.microsoft.com/en-us/library/ms735119.aspx)
Você pode receber a mensagem de erro mencionada na seção "Sintomas" nas seguintes situações:
  • O código CLR que implementa objetos CLR explicitamente usa a classe XmlSerializer . Esses objetos CLR podem incluir procedimentos armazenados, funções, tipos definidos pelo usuário, agregados e disparadores.
  • Você pode usar um serviço da Web no código CLR.
  • Enviar ou receber objetos CLR para ou do SQL Server usando o acesso direto de SOAP/HTTP ao SQL Server.
  • O objeto CLR converte um tipo definido pelo usuário para o tipo de dados XML.

Resolução

Para resolver esse problema, você deve usar a ferramenta de XML serializador Generator (Sgen.exe) para criar o assembly de serialização de XML para o assembly original manualmente. Em seguida, carrega os assemblies em um SQL Server banco de dados.

Exemplo de código

For example, you may want to create a CLR function that returns XML data by using an assembly that is created by the following code example:
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();
        }

    }
}
When you call the XMLTest function in SQL Server Management Studio, you expect to receive the following result:
<?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>
para retornar o resultado correto, você deve criar manualmente o XML assembly de serialização para o assembly original. Use um dos seguintes métodos para criar o assembly de serialização manualmente.

Observação Esses métodos presumem que a seguintes condições forem verdadeiras:
  • Você criou um banco de dados dbTest em uma instância do SQL Server 2005.
  • Todos os arquivos de projeto são salvos na C:\CLRTest pasta.

Método 1: Criar um projeto SQL Server CLR usando o Microsoft Visual Studio 2005

Você pode criar o assembly de serialização usando a opção Build Events no Microsoft Visual Studio 2005. Para fazer isso, execute as seguintes etapas:
  1. Inicie o Visual Studio 2005.
  2. Crie um novo projeto SQL Server chamado MyTest.
  3. Na caixa de diálogo Add Database Reference , clique na referência que se conecta ao banco de dados dbTest e, em seguida, clique em OK .

    Se a referência não estiver na lista, você deve criar uma nova referência. Para fazer isso, clique em Adicionar nova referência .
  4. No menu Project , clique em Add User-Defined Function . A caixa de diálogo Add New Item aparece.
  5. Clique em Adicionar para adicionar um novo arquivo. Por padrão, o arquivo é chamado Function1.cs.

    Observação Você receber a mensagem de erro mencionada na "Sintomas" seção se você implantar o projeto para o banco de dados e, em seguida, execute a seguinte instrução Transact-SQL:
    SELECT [dbTest].[dbo].[XMLTest] ()
    você deve seguir as etapas 6-16 para resolver esse problema.
  6. Adicione o código listado na seção "Código de exemplo" para o arquivo Function1.cs.
  7. No menu Project , clique em MyTest propriedades .
  8. Na caixa de diálogo MyTest , clique na opção Build Events .
  9. Digite o seguinte comando na caixa Post-build linha de comando do evento :
    "C:\Arquivos de Programas\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe"/force"$ (TargetPath)"
    Observação A opção /force gera um novo assembly de serialização toda vez que você modifique o assembly de origem. Além disso, você deve modificar esse comando se você instalou o Visual Studio 2005 em outra pasta.
  10. Na pasta C:\CLRTest, crie dois arquivos de texto que são nomeados Predeployscript.sql e Postdeployscript.sql.
  11. Adicione instruções Transact-SQL a seguir ao arquivo Predeployscript.sql:
    IF EXISTS (SELECT [name] FROM sys.assemblies WHERE [name] = N'MyTest.XmlSerializers') 
    	DROP ASSEMBLY [MyTest.XmlSerializers]
    
  12. Adicione instruções Transact-SQL a seguir ao arquivo Postdeployscript.sql:
    CREATE ASSEMBLY [MyTest.XmlSerializers] from
    'C:\CLRTest\MyTest\MyTest\bin\Debug\MyTest.XmlSerializers.dll'
    WITH permission_set = SAFE
    
  13. No menu Project , clique em Adicionar Item existente .
  14. Na caixa de diálogo Add Existing Item , localize a pasta C:\CLRTest e, em seguida, clique em todos os arquivos (*. *) na lista arquivos do tipo .
  15. Na caixa nome do arquivo , digite Postdeployscript.sql;Predeployscript.sql e, em seguida, clique em OK .
  16. No menu Build , clique em implantar MyTest .
  17. Execute a seguinte instrução Transact-SQL no SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    recebe o resultado correto.

Método 2: Criar um projeto SQL CLR na janela Visual Studio Command Prompt

  1. Localize a pasta C:\CLRTest.
  2. Crie um arquivo de texto chamado MyTest.cs.
  3. Adicione o código listado na seção "Código de exemplo" para o arquivo MyTest.cs.
  4. Abra a janela Visual Studio 2005 Command Prompt.
  5. Digite CD C:\CLRTest e, em seguida, pressione ENTER.
  6. Digite csc/t: Library MyTest.cs e, em seguida, pressione ENTER.
  7. Digite sgen.exe /force MyTest.dll e, em seguida, pressione ENTER.
  8. Execute as seguintes instruções de Transact-SQL no SQL Server Management Studio:
    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
  9. Execute a seguinte instrução Transact-SQL no SQL Server Management Studio:
    SELECT [dbTest].[dbo].[XMLTest] ()
    recebe o resultado correto.

Se você usar um assembly principal que faz referência a outros assemblies, você deve gerar assemblies de serialização de XML para todos os assemblies são referenciados pelo assembly principal. Em seguida, você deve carregar esses assemblies de serialização de XML no banco de dados SQL Server usando a instrução CREATE ASSEMBLY.

Situação

Esse comportamento é por design.

Referências

Para obter mais informações sobre a serialização de XML do CLR o objetos de banco de dados, visite o seguinte site da MSDN:
http://msdn2.microsoft.com/en-us/library/ms131088.aspx (http://msdn2.microsoft.com/en-us/library/ms131088.aspx)
Para obter mais informações sobre a ferramenta de gerador do serializador XML, visite o seguinte site da MSDN:
http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx (http://msdn2.microsoft.com/en-us/library/bk3w6240.aspx)

A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Workgroup Edition
Palavras-chave: 
kbmt kbsql2005clr kbexpertiseadvanced kbprb KB913668 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 913668  (http://support.microsoft.com/kb/913668/en-us/ )
Compartilhar
Opções de suporte adicionais
Fóruns de Suporte do Microsoft Community
Contate-nos diretamente
Localize um parceiro certificado da Microsoft
Microsoft Store