CORRECÇÃO: O método DataSet.WriteXML produz um valor decimal como notação científica e provoca uma excepção System.FormatException em chamadas de método DataSet.ReadXML subsequentes

Traduções de Artigos Traduções de Artigos
Artigo: 321542 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando utiliza um documento XML que contém um atributo ou um elemento com um valor decimal como 0,00001, o esquema marca esse atributo ou elemento como um decimal. Se utilizar o método DataSet.ReadXML para ler um ficheiro XML e, em seguida, utilize o método de DataSet.WriteXML para escrever o valor no ficheiro de XML, o resultado contém um valor em notação científica. Se voltar a utilizar o método DataSet.ReadXML , receberá a seguinte mensagem de excepção:
System.FormatException - cadeia de entrada não era um formato correcto.

Causa

O método DataSet.WriteXML internamente chama o método Decimal.ToString quando escreve números decimais. O método Decimal.ToString escreve números decimais, tais como 0,00001 em notação científica. Não é possível definir a enumeração NumberStyles para o objecto DataSet efectuar para notação científica ser lidas como um valor decimal. Por conseguinte, quando utiliza o método DataSet.ReadXML para ler o número novamente num conjunto de dados, ocorre uma excepção FormatException .

Resolução

Agora é disponibilizada pela Microsoft uma correcção suportada, mas destina-se apenas a corrigir o problema descrito neste artigo. Aplique-a apenas em sistemas que tenham este problema específico. Esta correcção poderá submetida a testes adicionais. Por conseguinte, se não estiver a ser gravemente afectado por este problema, recomendamos que aguarde pelo próximo service pack que contenha esta correcção.

Para resolver este problema imediatamente, contacte o suporte técnico da Microsoft para obter a correcção. Para obter uma lista completa de números de telefone do suporte técnico da Microsoft e informações sobre os custos de suporte, visite o seguinte Web site da Microsoft:
http://support.microsoft.com/contactus/?ws=support
Nota Em casos especiais, os custos normalmente inerentes às chamadas de suporte poderão ser anulados, se um técnico de suporte da Microsoft determinar que uma actualização específica resolverá o problema. Os custos normais do suporte serão aplicados a problemas adicionais e questões de suporte que não se enquadrem na atualização específica em questão.A versão inglesa desta correcção tem os atributos de ficheiro (ou atributos de ficheiro posteriores) listados na seguinte tabela. As datas e horas destes ficheiros são indicadas no formato de universal hora (UTC) coordenada Coordinated. Quando visualiza as informações do ficheiro, é convertido para a hora local. Para determinar a diferença entre a UTC e a hora local, utilize o separador fuso horário na ferramenta Data e hora no painel de controlo.
   Date         Time   Version       Size       File name
   -----------------------------------------------------------
   03-May-2002  02:17  1.0.3705.271  1,294,336  System.xml.dll   

Como contornar

Pode marcar o valor como uma cadeia em vez de como um decimal no esquema e pode manualmente converter a cadeia para um valor de número decimal, utilizando o método Decimal.Parse com o sinalizador AllowExponent NumberStyles .

Ponto Da Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a".

Mais Informação

Passos para reproduzir o comportamento

Este método utiliza um objecto de DataSet para ler, escrever e ler um valor decimal de um XML documento:
  1. Criar uma nova aplicação de consola do Microsoft Visual C# .NET.
    1. Inicie o Microsoft Visual Studio NET..
    2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
    3. Em Project Types , clique em Visual C# Projects e clique em Aplicação de consola em modelos . Por predefinição, é criada uma classe denominada Aula1.
  2. Adicione o seguinte utilizando a instrução no início do ficheiro Class1.cs:
    using System.Data;
    using System.Xml; 
    
  3. Adicionar o seguinte código ao campo principal no ds Class1.cs:
    DataSet ds = new DataSet();
    ds.ReadXmlSchema("..\\..\\XMLSchema1.xsd");
    ds.ReadXml("..\\..\\XMLFile1.xml");
    ds.WriteXml("..\\..\\XMLFile1.xml");		
    ds.ReadXml("..\\..\\XMLFile1.xml");
    
  4. No Solution Explorer, clique com o botão direito do rato no nome do projecto, aponte para Adicionar e, em seguida, clique em Adicionar novo item . Aparece a caixa Adicionar novo item .
  5. Clique em Esquema XML em modelos e, em seguida, clique em Abrir . Por predefinição, é criado XMLSchema1.
  6. Mude para campo XML e, em seguida, substitua o codificador o seguinte código:
    <?xml version="1.0" standalone="yes"?>
    <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
      <xs:element name="NewDataSet" msdata:IsDataSet="true">
        <xs:complexType>
          <xs:choice maxOccurs="unbounded">
            <xs:element name="Table">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="name" type="xs:string" minOccurs="0" />
                  <xs:element name="tax" type="xs:decimal" minOccurs="0" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    
  7. Repita o passo 4, clique em Ficheiro XML em modelos e, em seguida, clique em Abrir . Por predefinição, é criado XMLFile1.
  8. Substitua o código com o seguinte código:
    <?xml version="1.0" standalone="yes" ?>
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    	<NewDataSet>
    		<Table diffgr:id="Table1" msdata:rowOrder="0">
    			<name>test </name>
    			<tax>0.00001</tax>
    		</Table>
    		<Table diffgr:id="Table2" msdata:rowOrder="1">
    			<name>234</name>
    			<tax>12</tax>
    		</Table>
    	</NewDataSet>
    </diffgr:diffgram>
    
  9. No menu Debug , clique em Iniciar .
Recebe a mensagem de erro mencionada na secção "Sintomas".

Propriedades

Artigo: 321542 - Última revisão: 11 de outubro de 2005 - Revisão: 1.6
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Studio .NET 2002 Professional Edition
  • Microsoft Visual Studio .NET 2002 Enterprise Architect
  • Microsoft Visual Studio .NET 2002 Enterprise Developer
  • Microsoft Visual Studio .NET 2002 Academic Edition
  • Microsoft .NET Framework 1.0
  • Microsoft .NET Framework 1.0 Service Pack 1
  • Microsoft .NET Framework 1.0 Service Pack 2
Palavras-chave: 
kbmt kbhotfixserver kbqfe kbvs2002sp1sweep kbprogramming kbschema kbxml kbqfe kbbug kbfix KB321542 KbMtpt
Traduçã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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 321542

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com