CORRECÇÃO: Dados que está associados um componente que usa o objeto System.data poderão ficar danificados numa aplicação criada no Microsoft .NET Framework 2.0

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

Sintomas

Quando tenta utilizar um componente numa aplicação criada no Microsoft .NET Framework 2.0, dados que está associados com o componente ficar danificados. Este problema ocorre quando o componente utiliza um objecto System.Data.DataSet . Quando este problema ocorre, poderá detectar um ou mais dos seguintes problemas:
  • Quando é chamado o método AcceptChanges numa classe DataView , o Gestor de registo ficar danificado.
  • Os valores calculados uma coluna da expressão poderão não ser correctamente actualizados.
  • Quando é chamado o método DataTable.Select utilizando várias instruções, um resultado incorrecto pode ser devolvido.
  • O índice interno de um objecto de DataTable poderá ficar danificado. Além disso, recebe uma mensagem de erro '13'.
  • Quando ocorre uma operação de impressão em série, o Gestor de registo pode ficar danificado se a linha destino estiver no estado de edição.
  • O índice interno de um objecto de DataTable poderá ficar danificado. Além disso, recebe uma mensagem de erro '5'.

Resolução

Informações sobre a correcção



Está disponível a partir da Microsoft uma correcção suportada. No entanto, esta correcção destina-se a corrigir o problema descrito neste artigo. Aplique esta correcção 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 pela próxima actualização de software que contenha esta correcção.

Para transferir esta correcção da Galeria de código da MSDN, visite o seguinte Web site da Microsoft:
http://code.msdn.microsoft.com/KB932491

Nota A Galeria de código da MSDN apresenta os idiomas para a qual a correcção está disponível. Se não vir o idioma listado, é porque a página de recursos de galeria de código não está disponível para esse idioma.

Nota Se ocorram problemas adicionais ou se for necessária qualquer resolução de problemas, poderá ter de criar um pedido de assistência separado. Os custos normais do suporte serão aplicados a problemas adicionais e questões de suporte que não se enquadrem esta correcção específica. Para obter uma lista completa dos números de telefone do suporte de cliente do Microsoft ou para criar um pedido serviço separado, visite o seguinte Web site da Microsoft:
http://support.microsoft.com/contactus/?ws=support

Pré-requisitos

Existem não pré-requisitos para instalar esta correcção.

Requisito de reinício

Não é necessário reiniciar o computador depois de aplicar esta correcção.

Informações sobre substituição de correcções

Esta correcção não substitui quaisquer outras correcções.

Informações do ficheiro

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 na hora universal coordenada (UTC). 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 no item data e hora no painel de controlo.
Para computadores baseados em 86 em x
Reduzir esta tabelaExpandir esta tabela
Nome de ficheiroVersão do ficheiroTamanho do ficheiroDataTempoPlataforma
Mscordacwks.dll2.0.50727.802802,30403-Fev-200711: 22x 86
Mscorjit.dll2.0.50727.802326,65603-Fev-200711: 22x 86
Mscorlib.dll2.0.50727.8024,308,99203-Fev-200711: 22x 86
Mscorpe.dll2.0.50727.802102,91203-Fev-200711: 22x 86
Mscorwks.dll2.0.50727.8025,625,34403-Fev-200711: 21x 86
Normalization.dll2.0.50727.80215,36003-Fev-200711: 22x 86
Normidna.nlpNão aplicável59,34203-Fev-200711: 22Não aplicável
Normnfc.nlpNão aplicável45,79403-Fev-200711: 22Não aplicável
Normnfd.nlpNão aplicável39,28403-Fev-200711: 22Não aplicável
Normnfkc.nlpNão aplicável66,38403-Fev-200711: 22Não aplicável
Normnfkd.nlpNão aplicável60,29403-Fev-200711: 22Não aplicável
Peverify.dll2.0.50727.802136,19203-Fev-200711: 21x 86
Sos.dll2.0.50727.802382,46403-Fev-200711: 22x 86
System.data.dll2.0.50727.8022,902,01603-Fev-200711: 22x 86
System.data.OracleClient.dll2.0.50727.802482,30403-Fev-200711: 22x 86
Vsavb7rt.dll8.0.50727.8021,330,68803-Fev-200711: 21x 86
Para computadores baseados em 64 x
Reduzir esta tabelaExpandir esta tabela
Nome de ficheiroVersão do ficheiroTamanho do ficheiroDataTempoPlataforma
Mscordacwks.dll2.0.50727.8021,597,44003-Fev-200703: 14x 64
Mscordacwks.dll2.0.50727.802802,30403-Fev-200711: 22x 86
Mscorjit.dll2.0.50727.8021,587,71203-Fev-200713: 03x 64
Mscorjit.dll2.0.50727.802326,65603-Fev-200711: 22x 86
Mscorlib.dll2.0.50727.8023,960,83203-Fev-200706: 28x 64
Mscorlib.dll2.0.50727.8024,308,99203-Fev-200711: 22x 86
Mscorpe.dll2.0.50727.802157,18403-Fev-200703: 07x 64
Mscorpe.dll2.0.50727.802102,91203-Fev-200711: 22x 86
Mscorpjt.dll2.0.50727.8022,004,99203-Fev-200713: 03x 64
Normalization.dll2.0.50727.80218,43203-Fev-200703: 12x 64
Normalization.dll2.0.50727.80215,36003-Fev-200711: 22x 86
Normidna.nlpNão aplicável59,34203-Fev-200703: 14Não aplicável
Normidna.nlpNão aplicável59,34203-Fev-200711: 22Não aplicável
Normnfc.nlpNão aplicável45,79403-Fev-200703: 14Não aplicável
Normnfc.nlpNão aplicável45,79403-Fev-200711: 22Não aplicável
Normnfd.nlpNão aplicável39,28403-Fev-200703: 14Não aplicável
Normnfd.nlpNão aplicável39,28403-Fev-200711: 22Não aplicável
Normnfkc.nlpNão aplicável66,38403-Fev-200703: 14Não aplicável
Normnfkc.nlpNão aplicável66,38403-Fev-200711: 22Não aplicável
Normnfkd.nlpNão aplicável60,29403-Fev-200703: 14Não aplicável
Normnfkd.nlpNão aplicável60,29403-Fev-200711: 22Não aplicável
Peverify.dll2.0.50727.802136,19203-Fev-200711: 21x 86
Peverify.nlp2.0.50727.802205,82403-Fev-200713: 03Não aplicável
Sos.dll2.0.50727.802480,76803-Fev-200703: 22x 64
Sos.dll2.0.50727.802382,46403-Fev-200711: 22x 86
System.data.dll2.0.50727.8022,967,04003-Fev-200706: 28x 64
System.data.dll2.0.50727.8022,902,01603-Fev-200711: 22x 86
System.data.OracleClient.dll2.0.50727.802498,68803-Fev-200706: 28x 64
System.data.OracleClient.dll2.0.50727.802482,30403-Fev-200711: 22x 86
Mscorwks.dll2.0.50727.80210,323,45603-Fev-200703: 11x 64
Mscorwks.dll2.0.50727.8025,625,34403-Fev-200711: 21x 86
Vsavb7rt.dll8.0.50727.8021,330,68803-Fev-200711: 21x 86
Para computadores baseados em Itanium
Reduzir esta tabelaExpandir esta tabela
Nome de ficheiroVersão do ficheiroTamanho do ficheiroDataTempoPlataforma
Mscordacwks.dll2.0.50727.8022,719,23203-Fev-200703: 15IA-64
Mscordacwks.dll2.0.50727.802802,30403-Fev-200711: 22x 86
Mscorjit.dll2.0.50727.8022,705,92003-Fev-200713: 03IA-64
Mscorjit.dll2.0.50727.802326,65603-Fev-200711: 22x 86
Mscorlib.dll2.0.50727.8023,960,83203-Fev-200706: 42IA-64
Mscorlib.dll2.0.50727.8024,308,99203-Fev-200711: 22x 86
Mscorpe.dll2.0.50727.802313,85603-Fev-200703: 06IA-64
Mscorpe.dll2.0.50727.802102,91203-Fev-200711: 22x 86
Mscorpjt.dll2.0.50727.8023,501,05603-Fev-200703: 14IA-64
Normalization.dll2.0.50727.80215,36003-Fev-200711: 22x 86
Normalization.dll2.0.50727.80244,03203-Fev-200703: 12IA-64
Fl_normidna.nlpNão aplicável59,34203-Fev-200711: 22Não aplicável
Normidna.nlpNão aplicável59,34203-Fev-200703: 14Não aplicável
Normnfc.nlpNão aplicável45,79403-Fev-200711: 22Não aplicável
Normnfc.nlpNão aplicável45,79403-Fev-200703: 14Não aplicável
Normnfd.nlpNão aplicável39,28403-Fev-200711: 22Não aplicável
Normnfd.nlpNão aplicável39,28403-Fev-200703: 14Não aplicável
Normnfkc.nlpNão aplicável66,38403-Fev-200711: 22Não aplicável
Normnfkc.nlpNão aplicável66,38403-Fev-200703: 14Não aplicável
Normnfkd.nlpNão aplicável60,29403-Fev-200711: 22Não aplicável
Normnfkd.nlpNão aplicável60,29403-Fev-200703: 14Não aplicável
Peverify.dll2.0.50727.802136,19203-Fev-200711: 21x 86
Peverify.dll2.0.50727.802383,48803-Fev-200713: 03IA-64
Sos.dll2.0.50727.802382,46403-Fev-200711: 22x 86
Sos.dll2.0.50727.802862,72003-Fev-200703: 23IA-64
System.data.dll2.0.50727.8022,902,01603-Fev-200711: 22x 86
System.data.dll2.0.50727.8023,109,88803-Fev-200706: 42IA-64
System.data.OracleClient.dll2.0.50727.802482,30403-Fev-200711: 22x 86
System.data.OracleClient.dll2.0.50727.802501,76003-Fev-200706: 42IA-64
Mscorwks.dll2.0.50727.8025,625,34403-Fev-200711: 21x 86
Mscorwks.dll2.0.50727.80221,309,95203-Fev-200703: 11IA-64
Vsavb7rt.dll8.0.50727.8021,330,68803-Fev-200711: 21x 86

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

Problema 1: Quando o método AcceptChanges numa classe DataView é chamado, o Gestor de registo poderá ficar danificado

Poderão ocorrer danos Gestor de registo durante uma operação de escrita a partir de um processador de eventos. Quando esta situação ocorre, uma excepção System.NullreferenceException pode ser aumentada. Além disso, quando a aplicação efectua uma operação de escrita num evento ListChanged , actualizações do índice podem ocorrer na ordem incorrecta.

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. Executar a aplicação.
Neste cenário, receberá uma mensagem de erro semelhante à seguinte:
System.NullReferenceException: Referência de objecto não definida para uma instância de um objecto. em System.Data.DataView.IsOriginalVersion (Int32 índice) no System.Data.DataRowView.get_Item (Int32 ndx) em Test.Main() em c:\Work\bugs\newbug1\Test.cs:line 42
Para contornar este problema, não efectue quaisquer operações de escrita num evento ListChanged . É melhor utilizar o evento RowChanged em vez do evento ListChanged .

Problema 2: Os valores calculados numa coluna expressão poderão não ser actualizados correctamente

Quando tenta calcular os valores de uma coluna da expressão num objecto DataSet e a coluna da expressão é uma parte de uma relação, os valores calculados da coluna da expressão poderão não ser correctamente actualizados. 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. Executar a aplicação.
Este cenário, 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>
neste resultado, o elemento NumberOfReports o primeiro elemento T2 contém o valor incorrecto de 0 em vez de 1.

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

Quando utiliza o método Select de um objecto de DataTable em conjunto com a cláusula AND para obter dados de várias instruções, método Select poderá devolver um resultado incorrecto. Por exemplo, o código seguinte devolve um resultado incorrecto:
string filter = "(NOT ColTwo = 1) AND (ColOne = 2)";
DataTable.Select(filter);
no entanto, o código seguinte devolve o resultado correcto:
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. Executar a aplicação.
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 poderá ficar danificado e receberá uma mensagem de erro '13'

Quando tenta utilizar o método AcceptChanges de um objecto de DataSet é utilizado pelo objecto DataTable e definir uma regra ForeignKey para AcceptRule.Cascade , os valores de índice interno que são utilizados pelo objecto DataSet poderão ficar danificados. Este problema ocorre caso se verifiquem as seguintes condições:
  • O objecto de DataSet contém uma ou mais tabelas que têm relações um-para-muitos.
  • O método AcceptChanges do objecto DataSet é chamado.
  • O valor de AcceptRejectRule do objecto DataSet é definido como em cascata. Quando este valor é definido como em cascata, a tabela subordinada é alterada para que automaticamente ou aceitar dados ou rejeitar 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. Executar a aplicação.
Neste cenário, receberá a seguinte mensagem de erro:
Índice interno do DataTable está danificado: '13'.

Problema 5: Quando ocorre uma operação de impressão em série, o Gestor de registo pode ficar danificado se a linha destino estiver no estado de edição

Se um ou mais linhas de um objecto do DataTable estão a ser editadas e ocorre uma operação DataTable.Merge ou uma operação DataSet.Merge ocorre, o Gestor de registo para o objecto DataSet do objecto DataTable ficar danificado.

Nota Quando uma linha de um objecto do DataTable está a ser editada, o valor de DataRowVersion da linha estiver definido como proposto.

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. Executar a aplicação.
Neste cenário, o Gestor de registo para o objecto DataSet do objecto DataTable está danificado.

Para contornar este problema, certifique-se de que não existem linhas no objecto de DataSet de destino com o conjunto DataRowVersion valor proposto antes de utilizar o método DataTable.Merge ou o método DataSet.Merge .

Problema 6: O índice interno de um objecto de DataTable poderá ficar danificado e receberá uma mensagem de erro '5'

Os seguintes cenários danificar num objecto de DataTable alterando os dados no objecto DataTable sem actualizar os índices internos do DataTable objecto:
  1. O valor de DataColumn.Expression é alterado de uma expressão para uma expressão. Neste cenário, os dados no objecto DataColumn está definido para DBNull.
  2. Quando é chamado o método DataTable.Clear , todos os dados no objecto DataTable é removido e os índices estão actualizados. No entanto, outras tabelas que referenciam o objecto de DataTable não são actualizadas.
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. Executar a aplicação.
Neste cenário, receberá a seguinte mensagem de erro:
Índice interno do DataTable está danificado: '5'.
Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
824684Descrição da terminologia padrão utilizada para descrever actualizações de software da Microsoft

Propriedades

Artigo: 932491 - Última revisão: 3 de dezembro de 2007 - Revisão: 1.8
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á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: 932491

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