DetailPage-MSS-KB

Base de Dados de Conhecimento

ID do artigo: 932491 - Última revisão: segunda-feira, 3 de dezembro de 2007 - Revisão: 1.8

 

Sintomas

Quando você tenta usar um componente em um aplicativo que é criado no Microsoft .NET Framework 2.0, dados que está associados com o componente podem se tornar corrompidos. Esse problema ocorre quando o componente usa um objeto System.Data.DataSet . Quando esse problema ocorre, você pode enfrentar um ou mais dos seguintes problemas:
  • Quando o método AcceptChanges em uma classe de DataView é chamado, o Gerenciador de registro pode ficar corrompido.
  • Os valores calculados em uma coluna de expressão não podem ser atualizados corretamente.
  • Quando o método DataTable.Select é chamado usando várias instruções, um resultado incorreto pode ser retornado.
  • O índice interno de um objeto DataTable pode ficar corrompido. Além disso, você recebe uma mensagem de erro '13'.
  • Quando ocorre uma operação de mesclagem, o Gerenciador de registro pode ficar corrompido se a linha de destino estiver em estado de edição.
  • O índice interno de um objeto DataTable pode ficar corrompido. Além disso, você recebe uma mensagem de erro '5'.

Resolução

Informações sobre o hotfix



Um hotfix suportado está disponível no Microsoft. No entanto, esse hotfix destina-se a corrigir o problema descrito neste artigo. Aplique-o somente aos sistemas que apresentarem esse problema específico. Esta correcção poderá submetida a testes adicionais. Portanto, se você não tiver sido gravemente afetado por esse problema, recomendamos que você aguarde a próxima atualização de software que contém esse hotfix.

Para baixar esse hotfix a partir do MSDN Code Gallery, visite o seguinte site da Microsoft:
http://code.msdn.microsoft.com/KB932491 (http://code.msdn.microsoft.com/KB932491)

Observação MSDN Code Gallery exibe os idiomas para os quais o hotfix está disponível. Se você não vir seu idioma listado, é porque a página de recursos da Galeria de código não está disponível para esse idioma.

Observação Se ocorrerem problemas adicionais ou se qualquer solução de problemas é necessária, talvez você precise criar uma solicitação de serviço separada. Os custos normais de suporte serão aplicados a questões de suporte adicionais e problemas que não se qualificam para esse hotfix específico. Para obter uma lista completa de números de telefone de suporte e Atendimento Microsoft ou para criar uma solicitação de serviço separada, visite o seguinte site:
http://support.microsoft.com/contactus/?ws=support (http://support.microsoft.com/contactus/?ws=support)

Pré-requisitos

Não há nenhum pré-requisito para instalar esse hotfix.

Requisitos de reinicialização

Não é necessário reiniciar o computador após aplicar esse hotfix.

Informações sobre a substituição do hotfix

Esse hotfix não substitui outros hotfixes.

Informações sobre o arquivo

A versão em inglês deste hotfix tem atributos de arquivo (ou atributos de arquivo posteriores) listados na tabela a seguir. As datas e horas desses arquivos estão listadas no horário de universal coordenado (UTC). Quando você exibe as informações do arquivo, ele é convertido para a hora local. Para encontrar a diferença entre o UTC e a hora local, use a guia fuso horário no item Data e hora no painel de controle.
Para computadores 86 x
Recolher esta tabelaExpandir esta tabela
Nome de arquivoVersão do arquivoTamanho do arquivoDataTempoPlataforma
Mscordacwks.dll2.0.50727.802802,30403 De fevereiro de 200711: 22x 86
Mscorjit.dll2.0.50727.802326,65603 De fevereiro de 200711: 22x 86
Mscorlib.dll2.0.50727.8024,308,99203 De fevereiro de 200711: 22x 86
Mscorpe.dll2.0.50727.802102,91203 De fevereiro de 200711: 22x 86
Mscorwks.dll2.0.50727.8025,625,34403 De fevereiro de 200711: 21x 86
Normalization.dll2.0.50727.80215.36003 De fevereiro de 200711: 22x 86
Normidna.nlpNão aplicável59,34203 De fevereiro de 200711: 22Não aplicável
Normnfc.nlpNão aplicável45,79403 De fevereiro de 200711: 22Não aplicável
Normnfd.nlpNão aplicável39,28403 De fevereiro de 200711: 22Não aplicável
Normnfkc.nlpNão aplicável66,38403 De fevereiro de 200711: 22Não aplicável
Normnfkd.nlpNão aplicável60,29403 De fevereiro de 200711: 22Não aplicável
Peverify.dll2.0.50727.802136,19203 De fevereiro de 200711: 21x 86
Sos.dll2.0.50727.802382,46403 De fevereiro de 200711: 22x 86
System.Data.dll2.0.50727.8022,902,01603 De fevereiro de 200711: 22x 86
System.Data.OracleClient.dll2.0.50727.802482,30403 De fevereiro de 200711: 22x 86
Vsavb7rt.dll8.0.50727.8021,330,68803 De fevereiro de 200711: 21x 86
Para computadores com 64 x
Recolher esta tabelaExpandir esta tabela
Nome de arquivoVersão do arquivoTamanho do arquivoDataTempoPlataforma
Mscordacwks.dll2.0.50727.8021,597,44003 De fevereiro de 200703: 14x 64
Mscordacwks.dll2.0.50727.802802,30403 De fevereiro de 200711: 22x 86
Mscorjit.dll2.0.50727.8021,587,71203 De fevereiro de 200703: 13x 64
Mscorjit.dll2.0.50727.802326,65603 De fevereiro de 200711: 22x 86
Mscorlib.dll2.0.50727.8023,960,83203 De fevereiro de 200706: 28x 64
Mscorlib.dll2.0.50727.8024,308,99203 De fevereiro de 200711: 22x 86
Mscorpe.dll2.0.50727.802157,18403 De fevereiro de 200703: 07x 64
Mscorpe.dll2.0.50727.802102,91203 De fevereiro de 200711: 22x 86
Mscorpjt.dll2.0.50727.8022,004,99203 De fevereiro de 200703: 13x 64
Normalization.dll2.0.50727.80218,43203 De fevereiro de 200712: 03x 64
Normalization.dll2.0.50727.80215.36003 De fevereiro de 200711: 22x 86
Normidna.nlpNão aplicável59,34203 De fevereiro de 200703: 14Não aplicável
Normidna.nlpNão aplicável59,34203 De fevereiro de 200711: 22Não aplicável
Normnfc.nlpNão aplicável45,79403 De fevereiro de 200703: 14Não aplicável
Normnfc.nlpNão aplicável45,79403 De fevereiro de 200711: 22Não aplicável
Normnfd.nlpNão aplicável39,28403 De fevereiro de 200703: 14Não aplicável
Normnfd.nlpNão aplicável39,28403 De fevereiro de 200711: 22Não aplicável
Normnfkc.nlpNão aplicável66,38403 De fevereiro de 200703: 14Não aplicável
Normnfkc.nlpNão aplicável66,38403 De fevereiro de 200711: 22Não aplicável
Normnfkd.nlpNão aplicável60,29403 De fevereiro de 200703: 14Não aplicável
Normnfkd.nlpNão aplicável60,29403 De fevereiro de 200711: 22Não aplicável
Peverify.dll2.0.50727.802136,19203 De fevereiro de 200711: 21x 86
Peverify.nlp2.0.50727.802205,82403 De fevereiro de 200703: 13Não aplicável
Sos.dll2.0.50727.802480,76803 De fevereiro de 200703: 22x 64
Sos.dll2.0.50727.802382,46403 De fevereiro de 200711: 22x 86
System.Data.dll2.0.50727.8022,967,04003 De fevereiro de 200706: 28x 64
System.Data.dll2.0.50727.8022,902,01603 De fevereiro de 200711: 22x 86
System.Data.OracleClient.dll2.0.50727.802498,68803 De fevereiro de 200706: 28x 64
System.Data.OracleClient.dll2.0.50727.802482,30403 De fevereiro de 200711: 22x 86
Mscorwks.dll2.0.50727.80210,323,45603 De fevereiro de 200703: 11x 64
Mscorwks.dll2.0.50727.8025,625,34403 De fevereiro de 200711: 21x 86
Vsavb7rt.dll8.0.50727.8021,330,68803 De fevereiro de 200711: 21x 86
Para computadores baseados no Itanium
Recolher esta tabelaExpandir esta tabela
Nome de arquivoVersão do arquivoTamanho do arquivoDataTempoPlataforma
Mscordacwks.dll2.0.50727.8022,719,23203 De fevereiro de 200703: 15IA-64
Mscordacwks.dll2.0.50727.802802,30403 De fevereiro de 200711: 22x 86
Mscorjit.dll2.0.50727.8022,705,92003 De fevereiro de 200703: 13IA-64
Mscorjit.dll2.0.50727.802326,65603 De fevereiro de 200711: 22x 86
Mscorlib.dll2.0.50727.8023,960,83203 De fevereiro de 200706: 42IA-64
Mscorlib.dll2.0.50727.8024,308,99203 De fevereiro de 200711: 22x 86
Mscorpe.dll2.0.50727.802313,85603 De fevereiro de 200703: 06IA-64
Mscorpe.dll2.0.50727.802102,91203 De fevereiro de 200711: 22x 86
Mscorpjt.dll2.0.50727.8023,501,05603 De fevereiro de 200703: 14IA-64
Normalization.dll2.0.50727.80215.36003 De fevereiro de 200711: 22x 86
Normalization.dll2.0.50727.80244,03203 De fevereiro de 200712: 03IA-64
Fl_normidna.nlpNão aplicável59,34203 De fevereiro de 200711: 22Não aplicável
Normidna.nlpNão aplicável59,34203 De fevereiro de 200703: 14Não aplicável
Normnfc.nlpNão aplicável45,79403 De fevereiro de 200711: 22Não aplicável
Normnfc.nlpNão aplicável45,79403 De fevereiro de 200703: 14Não aplicável
Normnfd.nlpNão aplicável39,28403 De fevereiro de 200711: 22Não aplicável
Normnfd.nlpNão aplicável39,28403 De fevereiro de 200703: 14Não aplicável
Normnfkc.nlpNão aplicável66,38403 De fevereiro de 200711: 22Não aplicável
Normnfkc.nlpNão aplicável66,38403 De fevereiro de 200703: 14Não aplicável
Normnfkd.nlpNão aplicável60,29403 De fevereiro de 200711: 22Não aplicável
Normnfkd.nlpNão aplicável60,29403 De fevereiro de 200703: 14Não aplicável
Peverify.dll2.0.50727.802136,19203 De fevereiro de 200711: 21x 86
Peverify.dll2.0.50727.802383,48803 De fevereiro de 200703: 13IA-64
Sos.dll2.0.50727.802382,46403 De fevereiro de 200711: 22x 86
Sos.dll2.0.50727.802862,72003 De fevereiro de 200703: 23IA-64
System.Data.dll2.0.50727.8022,902,01603 De fevereiro de 200711: 22x 86
System.Data.dll2.0.50727.8023,109,88803 De fevereiro de 200706: 42IA-64
System.Data.OracleClient.dll2.0.50727.802482,30403 De fevereiro de 200711: 22x 86
System.Data.OracleClient.dll2.0.50727.802501,76003 De fevereiro de 200706: 42IA-64
Mscorwks.dll2.0.50727.8025,625,34403 De fevereiro de 200711: 21x 86
Mscorwks.dll2.0.50727.80221,309,95203 De fevereiro de 200703: 11IA-64
Vsavb7rt.dll8.0.50727.8021,330,68803 De fevereiro de 200711: 21x 86

Situação

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

Mais Informações

Problema 1: Quando o método AcceptChanges em uma classe de DataView é chamado, o Gerenciador de registro pode estar corrompido

Gerenciador de registro corrupção pode ocorrer durante uma operação de gravação de um manipulador de eventos. Quando isso ocorre, uma exceção System.NullreferenceException pode ser elevada. Além disso, quando o aplicativo executa uma operação de gravação em um evento ListChanged , atualizações de índice podem ocorrer na ordem incorreta.

Por exemplo, considere o seguinte cenário:
  1. You use the following code in the application:
    using System;
    using System.ComponentModel;
    using System.Data;
    
    class Test {
        private static DataRow _dr = null;
        private static bool _accept = false;
        
        public static void Main()
        {
            try {
                DataSet ds = new DataSet();
                DataTable dt = ds.Tables.Add("Customers");
                DataColumn c = dt.Columns.Add("Id", typeof(int));
                dt.PrimaryKey = new DataColumn[] { c };
                dt.Columns.Add("Name", typeof(string));
                dt.Columns.Add("Age", typeof(int));
                
                dt.Rows.Add(new object[] { 1, "A", 10 });
                dt.Rows.Add(new object[] { 2, "B", 20 });
                dt.Rows.Add(new object[] { 3, "G", 30 });
                dt.Rows.Add(new object[] { 4, "H", 40 });
                dt.Rows.Add(new object[] { 5, "I", 50 });
    
                ds.AcceptChanges();
                            
                DataView dv = new DataView(dt);
                dv.Sort = "Name ASC";
                                        
                dv.ListChanged += new ListChangedEventHandler(OnListChanged);
                            
                _dr = dt.Rows[4];
                
                _accept = true;
                _dr["Name"] = "C";
                _accept = false;
                            
                _dr["Name"] = "D";
                _dr["Age"] = 55;            
                            
                Console.WriteLine(dv[2][1]);                        
            } catch (Exception exc) {
                Console.WriteLine(exc);
            }
        }
        
        public static void OnListChanged(object sender, ListChangedEventArgs args)
        {
            if (_dr != null && _accept) {
                _dr.AcceptChanges();
            }
        }
    }
  2. Execute o aplicativo.
Nesse cenário, você receber uma mensagem de erro semelhante a seguinte mensagem de erro:
System.NullReferenceException: Referência de objeto não definida para uma instância de um objeto. em System.Data.DataView.IsOriginalVersion (Int32 index) em System.Data.DataRowView.get_Item (Int32 ndx) em Test.Main() em c:\Work\bugs\newbug1\Test.cs:line 42
Para contornar esse problema, não execute qualquer operação de gravação em um evento ListChanged . É melhor usar o evento RowChanged em vez do evento ListChanged .

Problema 2: Os valores calculados em uma coluna de expressão podem não ser atualizados corretamente

Quando você tenta calcular os valores de uma coluna de expressão em um objeto DataSet e a coluna de expressão é parte de um relacionamento, os valores calculados da coluna de expressão não podem ser atualizados corretamente. Por exemplo, considere o seguinte cenário:
  1. You use the following code in the application:
    using System;
    using System.ComponentModel;
    using System.Data;
    
    class Test {
        public static void Main()
        {
            try {
                DataSet ds = new DataSet();
    
                DataTable dt1 = ds.Tables.Add("T1");
                dt1.Columns.Add("CustId", typeof(int));
                dt1.Columns.Add("CustName", typeof(string));
    
                DataTable dt2 = ds.Tables.Add("T2");
                dt2.Columns.Add("EmpId", typeof(int));
                DataColumn dcEmpName = dt2.Columns.Add("EmpName", typeof(string));
                DataColumn dcMgrName = dt2.Columns.Add("MgrName", typeof(string));
                DataColumn dcReports = dt2.Columns.Add("NumberOfReports", typeof(int));
                
                DataRelation rel1 = ds.Relations.Add("T1T2", dt1.Columns["CustId"], dt2.Columns["EmpId"], false);
                DataRelation rel2 = ds.Relations.Add("T2T2", dt2.Columns["EmpName"], dt2.Columns["MgrName"], false);
    
                dcEmpName.Expression = "Parent(T1T2).CustName";
                dcMgrName.Expression = "Parent(T1T2).CustName"; 
    
                //Each person is a manager to himself.
                dcReports.Expression = "Count(Child(T2T2).EmpName)"; 
    
                AddRow(dt1, 1, "N1");
                AddRow(dt1, 2, "N2");
                AddRow(dt1, 3, "N3");
    
                AddRow(dt2, 1);
                AddRow(dt2, 2);
                AddRow(dt2, 3);
    
                Console.WriteLine(ds.GetXml());
    
                dt1.Rows[0]["CustName"] = "N4";
    
                Console.WriteLine(ds.GetXml());
            } catch (Exception exc) {
                Console.WriteLine(exc);
            }
        }
    
        public static void AddRow(DataTable dt, params object[] objArr)
        {
            Console.WriteLine("Adding row to table {0}", dt.TableName);
            dt.Rows.Add(objArr);
        }
    }
  2. Execute o aplicativo.
Nessa situação, você recebe a seguinte saída:
<NewDataSet>
 <T1>
   <CustId>1</CustId>
   <CustName>N4</CustName>
 </T1>
 <T1>
   <CustId>2</CustId>
   <CustName>N2</CustName>
 </T1>
 <T1>
   <CustId>3</CustId>
   <CustName>N3</CustName>
 </T1>
 <T2>
   <EmpId>1</EmpId>
   <EmpName>N4</EmpName>
   <MgrName>N4</MgrName>
   <NumberOfReports>0</NumberOfReports> 
 </T2>
 <T2>
   <EmpId>2</EmpId>
   <EmpName>N2</EmpName>
   <MgrName>N2</MgrName>
   <NumberOfReports>1</NumberOfReports>
 </T2>
 <T2>
   <EmpId>3</EmpId>
   <EmpName>N3</EmpName>
   <MgrName>N3</MgrName>
   <NumberOfReports>1</NumberOfReports>
 </T2>
</NewDataSet>
nessa saída, o elemento NumberOfReports no primeiro elemento T2 contém o valor incorreto de 0 em vez de 1.

Problema 3: Quando o método DataTable.Select é chamado usando várias instruções, um resultado incorreto pode ser retornado

Quando você usa o método Select de um objeto DataTable junto com a cláusula AND para recuperar dados de várias instruções, o método Select pode retornar um resultado incorreto. Por exemplo, o código a seguir retorna um resultado incorreto:
string filter = "(NOT ColTwo = 1) AND (ColOne = 2)";
DataTable.Select(filter);
Contudo, o código a seguir retorna o resultado correto:
string filter = "NOT ColTwo = 1 AND ColOne = 2";
DataTable.Select(filter);
Além disso, considere o seguinte cenário:
  1. You use the following code in the application:
    public static void Main()
    {
      DataTable table = new DataTable();
      table.Columns.Add("ColID", typeof(int));
      table.Columns.Add("ColOne", typeof(int));
      table.Columns.Add("ColTwo", typeof(int));
      table.Rows.Add(new object[] { 1, 1, 1 });
      table.Rows.Add(new object[] { 2, 1, 2 });
      table.Rows.Add(new object[] { 3, 2, 1 });
      table.Rows.Add(new object[] { 4, 2, 2 });
    
      string[] queries = new string[] {
          "(NOT ColTwo = 1) AND (ColOne = 2)",
          "(ColOne = 2) AND (NOT ColTwo = 1)",
    
          "NOT ColTwo = 1 AND ColOne = 2",
          "ColOne = 2 AND NOT ColTwo = 1",
    
          "NOT ColTwo = 1 AND (ColOne = 2)",
          "(ColOne = 2) AND NOT ColTwo = 1",
    
          "(NOT ColTwo = 1) AND ColOne = 2",
          "ColOne = 2 AND (NOT ColTwo = 1)",
      };
    
      Console.WriteLine("Select");
      foreach(string query in queries) {
          DataRow[] rows = table.Select(query);
          Console.WriteLine("query=\"{0}\" count={1}", query, rows.Length);
          foreach(DataRow row in rows) {
              Console.WriteLine("\t{0}, {1}, {2}", row[0], row[1], row[2]);
          }
      }
    }
    
  2. Execute o aplicativo.
In this scenario, you receive the following output:
query="(NOT ColTwo = 1) AND (ColOne = 2)" count=2
        3, 2, 1
        4, 2, 2
query="(ColOne = 2) AND (NOT ColTwo = 1)" count=1
        4, 2, 2
query="NOT ColTwo = 1 AND ColOne = 2" count=1
        4, 2, 2
query="ColOne = 2 AND NOT ColTwo = 1" count=1
        4, 2, 2
query="NOT ColTwo = 1 AND (ColOne = 2)" count=2
        3, 2, 1
        4, 2, 2
query="(ColOne = 2) AND NOT ColTwo = 1" count=1
        4, 2, 2
query="(NOT ColTwo = 1) AND ColOne = 2" count=1
        4, 2, 2
query="ColOne = 2 AND (NOT ColTwo = 1)" count=1
        4, 2, 2
In this output, "(ColOne = 2)" is incorrectly displayed on the right side of an AND clause.

Problema 4: O índice interno de uma DataTable pode ficar corrompido, e você recebe uma mensagem de erro '13'

Quando você tentar usar o método AcceptChanges de um objeto de DataSet que é usado pelo objeto DataTable , e você definir uma regra ForeignKey para AcceptRule.Cascade , os valores de índice interno que são usados pelo objeto DataSet podem ficar corrompidos. Esse problema ocorre se as seguintes condições forem verdadeiras:
  • O objeto de DataSet contém uma ou mais tabelas possuem relacionamentos um-para-muitos.
  • O método AcceptChanges do objeto DataSet é chamado.
  • O valor AcceptRejectRule do objeto DataSet é definido como em cascata. Quando esse valor é definido como em cascata, a tabela filho é alterada para que ele automaticamente aceita dados ou rejeita dados.
Por exemplo, considere o seguinte cenário:
  1. You use the following code in the application:
    public void Main()
    {
    			DataTable Table = new DataTable("Employee");
    			Table.Columns.Add("Id", typeof(int));
    			Table.Columns.Add("ManagerId", typeof(int));
    			Table.Columns.Add("Name", typeof(string));
    
    			Table.Columns["Name"].AllowDBNull = false;
    			Table.PrimaryKey = new DataColumn[] {Table.Columns["Id"]};
    
    			DataSet Employees = new DataSet();
    			Employees.Tables.Add(Table);
    
    			DataRelation rel = Employees.Relations.Add(Table.Columns["ID"], Table.Columns["ManagerId"]);
    			rel.ChildKeyConstraint.AcceptRejectRule = AcceptRejectRule.Cascade;
    
    			DataRow ManagerA = Table.NewRow();
    			ManagerA["ID"] = 2019;
    			ManagerA["Name"] = "Manager A";
    			Table.Rows.Add(ManagerA);
    
    			DataRow ManagerB = Table.NewRow();
    			ManagerB["ID"] = 392;
    			ManagerB["Name"] = "Manager B";
    			Table.Rows.Add(ManagerB);
    
    			DataRow EmployeeB = Table.NewRow();
    			EmployeeB["ID"] = 716;
    			EmployeeB["Name"] = "Employee of B";
    			EmployeeB.SetParentRow(ManagerB);
    			Table.Rows.Add(EmployeeB);
    
    			EmployeeB = Table.NewRow();
    			EmployeeB["ID"] = 637;
    			EmployeeB["Name"] = "2nd employee of B";
    			EmployeeB.SetParentRow(ManagerB);
    			Table.Rows.Add(EmployeeB);
    
    			Employees.AcceptChanges();
    			Table.Rows.Find(392).Delete();
    			Employees.AcceptChanges();
    }
  2. Execute o aplicativo.
Nesse cenário, você receber a seguinte mensagem de erro:
Índice interno DataTable está corrompido: '13'.

Problema 5: Quando ocorre uma operação de mesclagem, o Gerenciador de registro pode ser corrompido se a linha de destino estiver em estado edição

Se uma ou mais linhas em um objeto DataTable estão sendo editadas, ocorre uma operação DataTable.Merge ou uma operação DataSet.Merge ocorre, o Gerenciador de registro para o objeto DataSet do objeto DataTable pode ser corrompido.

Observação Quando uma linha em um objeto DataTable está sendo editada, o valor de DataRowVersion da linha é definido como proposta.

Por exemplo, considere o seguinte cenário:
  1. You use the following code in the application:
    using System;
    using System.Data;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                DataSet set = new DataSet();
                DataTable table = set.Tables.Add("table");
                table.Columns.Add("C1", typeof(int));
                table.Columns.Add("C2", typeof(char));
                table.PrimaryKey = new DataColumn[] { table.Columns[0] };
                for (int i = 0; i < 26; ++i)
                {
                    table.Rows.Add(new object[] { i, (char)((ushort)'a' + i) });
                }
                table.AcceptChanges();
    
                DataSet clone = set.Copy();
                clone.Tables[0].Rows[0][1] = 'Z';
                //clone.AcceptChanges();
    
                table.Rows[0][1] = '1';
                table.Rows[0].BeginEdit();
                table.Rows[0][1] = '2';
    
    
                try
                {
                    set.Merge(clone);
                }
                finally
                {
                   foreach (DataRow row in table.Rows) {
    																	Console.WriteLine("{0}={1}", row[0], row[1]);
    															}
                }
    
            }
        }
    }
  2. Execute o aplicativo.
Nesse cenário, o Gerenciador de registro para o objeto DataSet do objeto DataTable está corrompido.

Para contornar este problema, certifique-se que não existem linhas no objeto de DataSet de destino que possuem o valor de DataRowVersion definido para proposta antes de usar o método DataTable.Merge ou o método DataSet.Merge .

Problema 6: O índice interno de um objeto DataTable pode ficar corrompido, e você recebe uma mensagem de erro '5'

Os seguintes cenários causar corrupção em um objeto DataTable alterando dados no objeto DataTable sem atualizar os índices do objeto DataTable internos:
  1. O valor DataColumn.Expression é alterado de uma expressão para nenhuma expressão. Nesse cenário, todos os dados no objeto DataColumn está definido como DBNull.
  2. Quando o método DataTable.Clear é chamado, todos os dados no objeto DataTable são removidos e os índices são atualizados. No entanto, outras tabelas que fazem referência o objeto DataTable não serão atualizadas.
Por exemplo, considere o seguinte cenário:
  1. You use the following code in the application:
    using System;
    using System.Data;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                DataSet set = new DataSet("s");
                DataTable table1 = set.Tables.Add("a");
                table1.Columns.Add("C1", typeof(int));
                table1.Columns.Add("C2", typeof(int));
                table1.DefaultView.Sort = "C2";
    
                DataTable table2 = set.Tables.Add("b");
                table2.Columns.Add("C1", typeof(int));
                table2.Columns.Add("C2", typeof(int));
                table2.DefaultView.Sort = "C2";
    
                set.Relations.Add(new DataRelation("t1t2", table1.Columns[0], table2.Columns[0], false));
                table1.Columns[1].Expression = "Sum(Child(t1t2).C2)";
    
                AddData(table1, 1);
                AddData(table2, 2);
    
                table1.Columns[1].Expression = null;
    
                AddData(table2, 2);
                AddData(table1, 2);
    
            }
            private static void AddData(DataTable table, int y)
            {
                object[] x = new object[y];
                Random rand = new Random(20070125);
                for (int i = 0; i < 1000; ++i)
                {
                    switch (rand.Next(3))
                    {
                        case 0:
                        case 1:
                            for (int k = 0; k < x.Length; ++k)
                            {
                                x[k] = rand.Next(500);
                            }
                            table.Rows.Add(x);
                            break;
                        case 2:
                            if (0 < table.Rows.Count)
                            {
                                table.Rows.RemoveAt(rand.Next(table.Rows.Count));
                            }
                            break;
                    }
                }
            }
    
        }
    }
    
    
  2. Execute o aplicativo.
Nesse cenário, você receber a seguinte mensagem de erro:
Índice interno DataTable está corrompido: '5'.
Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
824684  (http://support.microsoft.com/kb/824684/ ) Descrição da terminologia padrão que é usada para descrever as atualizações de software

A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 2.0
Palavras-chave: 
kbmt kbfix kbbug kbprb kbexpertiseinter kbexpertisebeginner kbqfe kbpubtypekc KB932491 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: 932491  (http://support.microsoft.com/kb/932491/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