REVISIÓN: Datos que está asociados con un componente que utiliza el objeto System.Data pueden dañarse en una aplicación creada en Microsoft .NET Framework 2.0

Seleccione idioma Seleccione idioma
Id. de artículo: 932491 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Síntomas

Cuando intenta utilizar un componente en una aplicación creada en Microsoft .NET Framework 2.0, los datos que está asociados con el componente pueden dañarse. Este problema se produce cuando el componente utiliza un objeto de System.Data.DataSet . Cuando se produce este problema, puede experimentar uno o varios de los problemas siguientes:
  • Cuando se llama al método AcceptChanges en una clase DataView , el Administrador de registro puede dañarse.
  • Los valores calculados de una columna de expresión no se puede actualizar correctamente.
  • Cuando se llama al método DataTable.Select utilizando varias instrucciones, se puede devolver un resultado incorrecto.
  • El índice interno de un objeto DataTable puede resultar dañado. Además, recibirá un mensaje de error '13'.
  • Cuando se produce una operación de combinación, el Administrador de registro puede dañarse si la fila de destino está en el estado de edición.
  • El índice interno de un objeto DataTable puede resultar dañado. Además, recibirá un mensaje de error '5'.

Solución

Información de revisiones



Hay una revisión compatible de Microsoft. Sin embargo, esta revisión se diseñó para corregir el problema descrito en este artículo. Aplíquela sólo a los sistemas que experimenten este problema específico. Esta revisión podría sometida a comprobaciones adicionales. Por lo tanto, si no se ve muy afectado por este problema, recomendamos que espere a la siguiente actualización de software que contenga este hotfix.

Para descargar esta revisión desde MSDN Code Gallery, visite el siguiente sitio Web de Microsoft:
http://code.msdn.microsoft.com/KB932491

Nota MSDN Code Gallery muestra los idiomas para que la revisión está disponible. Si no ve su idioma aparecen, es porque la página de recursos de galería de código no está disponible para ese idioma.

Nota Si se producen problemas adicionales o si cualquier solución de problemas es necesario, quizás tenga que crear una solicitud de servicio independiente. Los costos habituales de soporte se aplicarán a las preguntas de soporte técnico adicionales y problemas que no guarden relación con esta revisión específica. Para obtener una lista completa de números de teléfono de servicio de atención al cliente y soporte técnico o para crear una solicitud de servicio independiente, visite el siguiente sitio Web:
http://support.microsoft.com/contactus/?ws=support

Requisitos previos

No hay ningún requisito previo para instalar este hotfix.

Requisito de reinicio

No es necesario que reinicie el equipo una vez aplicado este hotfix.

Información acerca de la sustitución de la revisión

Este hotfix no sustituye a otros hotfix.

Información de archivo

La versión en inglés de este hotfix tiene los atributos de archivo (o atributos de último archivo) mostrados en la siguiente tabla. Las fechas y las horas de estos archivos se muestran en hora universal coordinada (UTC). La información de los archivos se convertirá a la hora local cuando la vea. Para averiguar la diferencia entre hora UTC y la hora local, utilice la ficha zona horaria el elemento fecha y hora en el panel de control.
Para equipos basados en 86 en x
Contraer esta tablaAmpliar esta tabla
Nombre de archivoArchivo VersiónTamaño del archivoFechaTiempoPlataforma
Mscordacwks.dll2.0.50727.802802,30403-Feb-200711: 22x 86
Mscorjit.dll2.0.50727.802326,65603-Feb-200711: 22x 86
Mscorlib.dll2.0.50727.8024,308,99203-Feb-200711: 22x 86
Mscorpe.dll2.0.50727.802102,91203-Feb-200711: 22x 86
Mscorwks.dll2.0.50727.8025,625,34403-Feb-200711: 21x 86
Normalization.dll2.0.50727.80215,36003-Feb-200711: 22x 86
Normidna.nlpNo aplicable59,34203-Feb-200711: 22No aplicable
Normnfc.nlpNo aplicable45,79403-Feb-200711: 22No aplicable
Normnfd.nlpNo aplicable39,28403-Feb-200711: 22No aplicable
Normnfkc.nlpNo aplicable66,38403-Feb-200711: 22No aplicable
Normnfkd.nlpNo aplicable60,29403-Feb-200711: 22No aplicable
Peverify.dll2.0.50727.802136,19203-Feb-200711: 21x 86
SOS.dll2.0.50727.802382,46403-Feb-200711: 22x 86
System.Data.dll2.0.50727.8022,902,01603-Feb-200711: 22x 86
System.Data.OracleClient.dll2.0.50727.802482,30403-Feb-200711: 22x 86
Vsavb7rt.dll8.0.50727.8021,330,68803-Feb-200711: 21x 86
Para equipos basados en 64 x
Contraer esta tablaAmpliar esta tabla
Nombre de archivoArchivo VersiónTamaño del archivoFechaTiempoPlataforma
Mscordacwks.dll2.0.50727.8021,597,44003-Feb-200703: 14x 64
Mscordacwks.dll2.0.50727.802802,30403-Feb-200711: 22x 86
Mscorjit.dll2.0.50727.8021,587,71203-Feb-200713: 03x 64
Mscorjit.dll2.0.50727.802326,65603-Feb-200711: 22x 86
Mscorlib.dll2.0.50727.8023,960,83203-Feb-200706: 28x 64
Mscorlib.dll2.0.50727.8024,308,99203-Feb-200711: 22x 86
Mscorpe.dll2.0.50727.802157,18403-Feb-200703: 07x 64
Mscorpe.dll2.0.50727.802102,91203-Feb-200711: 22x 86
Mscorpjt.dll2.0.50727.8022,004,99203-Feb-200713: 03x 64
Normalization.dll2.0.50727.80218,43203-Feb-200712: 03x 64
Normalization.dll2.0.50727.80215,36003-Feb-200711: 22x 86
Normidna.nlpNo aplicable59,34203-Feb-200703: 14No aplicable
Normidna.nlpNo aplicable59,34203-Feb-200711: 22No aplicable
Normnfc.nlpNo aplicable45,79403-Feb-200703: 14No aplicable
Normnfc.nlpNo aplicable45,79403-Feb-200711: 22No aplicable
Normnfd.nlpNo aplicable39,28403-Feb-200703: 14No aplicable
Normnfd.nlpNo aplicable39,28403-Feb-200711: 22No aplicable
Normnfkc.nlpNo aplicable66,38403-Feb-200703: 14No aplicable
Normnfkc.nlpNo aplicable66,38403-Feb-200711: 22No aplicable
Normnfkd.nlpNo aplicable60,29403-Feb-200703: 14No aplicable
Normnfkd.nlpNo aplicable60,29403-Feb-200711: 22No aplicable
Peverify.dll2.0.50727.802136,19203-Feb-200711: 21x 86
Peverify.nlp2.0.50727.802205,82403-Feb-200713: 03No aplicable
SOS.dll2.0.50727.802480,76803-Feb-200703: 22x 64
SOS.dll2.0.50727.802382,46403-Feb-200711: 22x 86
System.Data.dll2.0.50727.8022,967,04003-Feb-200706: 28x 64
System.Data.dll2.0.50727.8022,902,01603-Feb-200711: 22x 86
System.Data.OracleClient.dll2.0.50727.802498,68803-Feb-200706: 28x 64
System.Data.OracleClient.dll2.0.50727.802482,30403-Feb-200711: 22x 86
Mscorwks.dll2.0.50727.80210,323,45603-Feb-200711: 03x 64
Mscorwks.dll2.0.50727.8025,625,34403-Feb-200711: 21x 86
Vsavb7rt.dll8.0.50727.8021,330,68803-Feb-200711: 21x 86
Para equipos basados en Itanium
Contraer esta tablaAmpliar esta tabla
Nombre de archivoArchivo VersiónTamaño del archivoFechaTiempoPlataforma
Mscordacwks.dll2.0.50727.8022,719,23203-Feb-200703: 15IA-64
Mscordacwks.dll2.0.50727.802802,30403-Feb-200711: 22x 86
Mscorjit.dll2.0.50727.8022,705,92003-Feb-200713: 03IA-64
Mscorjit.dll2.0.50727.802326,65603-Feb-200711: 22x 86
Mscorlib.dll2.0.50727.8023,960,83203-Feb-200706: 42IA-64
Mscorlib.dll2.0.50727.8024,308,99203-Feb-200711: 22x 86
Mscorpe.dll2.0.50727.802313.85603-Feb-200703: 06IA-64
Mscorpe.dll2.0.50727.802102,91203-Feb-200711: 22x 86
Mscorpjt.dll2.0.50727.8023,501,05603-Feb-200703: 14IA-64
Normalization.dll2.0.50727.80215,36003-Feb-200711: 22x 86
Normalization.dll2.0.50727.80244,03203-Feb-200712: 03IA-64
Fl_normidna.nlpNo aplicable59,34203-Feb-200711: 22No aplicable
Normidna.nlpNo aplicable59,34203-Feb-200703: 14No aplicable
Normnfc.nlpNo aplicable45,79403-Feb-200711: 22No aplicable
Normnfc.nlpNo aplicable45,79403-Feb-200703: 14No aplicable
Normnfd.nlpNo aplicable39,28403-Feb-200711: 22No aplicable
Normnfd.nlpNo aplicable39,28403-Feb-200703: 14No aplicable
Normnfkc.nlpNo aplicable66,38403-Feb-200711: 22No aplicable
Normnfkc.nlpNo aplicable66,38403-Feb-200703: 14No aplicable
Normnfkd.nlpNo aplicable60,29403-Feb-200711: 22No aplicable
Normnfkd.nlpNo aplicable60,29403-Feb-200703: 14No aplicable
Peverify.dll2.0.50727.802136,19203-Feb-200711: 21x 86
Peverify.dll2.0.50727.802383,48803-Feb-200713: 03IA-64
SOS.dll2.0.50727.802382,46403-Feb-200711: 22x 86
SOS.dll2.0.50727.802862,72003-Feb-200703: 23IA-64
System.Data.dll2.0.50727.8022,902,01603-Feb-200711: 22x 86
System.Data.dll2.0.50727.8023,109,88803-Feb-200706: 42IA-64
System.Data.OracleClient.dll2.0.50727.802482,30403-Feb-200711: 22x 86
System.Data.OracleClient.dll2.0.50727.802501,76003-Feb-200706: 42IA-64
Mscorwks.dll2.0.50727.8025,625,34403-Feb-200711: 21x 86
Mscorwks.dll2.0.50727.80221,309,95203-Feb-200711: 03IA-64
Vsavb7rt.dll8.0.50727.8021,330,68803-Feb-200711: 21x 86

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:".

Más información

Problema 1: Cuando se llama al método AcceptChanges en una clase DataView, el Administrador de registro puede dañarse

Administrador de registro pueden dañarse durante una operación de escritura de un controlador de eventos. Cuando esto ocurre, puede provocar una excepción System.NullreferenceException. Además, cuando la aplicación realiza una operación de escritura en un evento ListChanged , pueden producirse las actualizaciones del índice en orden incorrecto.

Por ejemplo, considere la situación siguiente:
  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. Ejecute la aplicación.
En esta situación, recibe un mensaje de error similar a la siguiente mensaje de error:
System.NullReferenceException: Referencia a objeto no establecida como una instancia de un objeto. en System.Data.DataView.IsOriginalVersion (Int32 index), en System.Data.DataRowView.get_Item (ndx Int32) en Test.Main() en c:\Work\bugs\newbug1\Test.cs:line 42
Para evitar este problema, no realice las operaciones de escritura en un evento ListChanged . Es mejor utilizar el evento RowChanged en lugar del evento ListChanged .

Problema 2: Los valores calculados en una columna de expresión no se puede actualizar correctamente

Cuando intenta calcular los valores de una columna de expresión en un objeto DataSet , y la columna de expresión es parte de una relación, los valores calculados de la columna de expresión no se puede actualizar correctamente. Por ejemplo, considere la situación siguiente:
  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. Ejecute la aplicación.
En esta situación, recibe el siguiente resultado:
<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>
en esta salida, el elemento NumberOfReports el primer elemento de T2 contiene el valor incorrecto de 0 en lugar de 1.

Problema 3: Cuando se llama al método DataTable.Select utilizando varias instrucciones, un resultado incorrecto puede devolverse

Cuando utilice el método SELECT de un objeto DataTable junto con la cláusula AND para recuperar datos de varias instrucciones, el método SELECT puede devolver un resultado incorrecto. Por ejemplo, el código siguiente devuelve un resultado incorrecto:
string filter = "(NOT ColTwo = 1) AND (ColOne = 2)";
DataTable.Select(filter);
sin embargo, el código siguiente devuelve el resultado correcto:
string filter = "NOT ColTwo = 1 AND ColOne = 2";
DataTable.Select(filter);
Además, considere la situación siguiente:
  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. Ejecute la aplicación.
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: El índice interno de una DataTable puede dañarse y recibirá un mensaje de error '13'

Cuando trata de utilizar el método AcceptChanges de un objeto DataSet que utiliza el objeto DataTable y establecer una regla de ForeignKey a AcceptRule.Cascade , pueden dañarse los valores de índice interno que se utilizan por el objeto DataSet . Este problema ocurre cuando se cumplen las condiciones siguientes:
  • El objeto DataSet contiene uno o más tablas que tienen relaciones uno a varios.
  • Se llama al método AcceptChanges del objeto DataSet .
  • El valor de AcceptRejectRule del objeto DataSet se establece como Cascade. Cuando este valor se establece como CASCADE, la tabla secundaria se cambia para que lo automáticamente acepta datos o rechazará los datos.
Por ejemplo, considere la situación siguiente:
  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. Ejecute la aplicación.
En esta situación, recibe el siguiente mensaje de error:
Índice interno de DataTable está dañado: '13'.

Problema 5: Cuando se produce una operación de combinación, el Administrador de registro puede dañarse si la fila de destino está en el estado de edición

Si se están editando una o más filas de un objeto DataTable , se produce una operación DataTable.Merge o se produce una operación DataSet.Merge , el Administrador de registro para el objeto DataSet del objeto DataTable puede resultar dañado.

Nota Cuando se está editando una fila de un objeto DataTable , se establece el valor de DataRowVersion de la fila a propuesto.

Por ejemplo, considere la situación siguiente:
  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. Ejecute la aplicación.
En este escenario, el Administrador de registro para el objeto DataSet del objeto DataTable está dañado.

Para evitar este problema, asegúrese de que no queden filas en el objeto DataSet de destino que tienen el valor de DataRowVersion establecido en propuesto antes de utilizar el método DataTable.Merge o el método DataSet.Merge .

Problema 6: El índice interno de un objeto DataTable puede resultar dañado y recibirá un mensaje de error '5'

Los siguientes escenarios provoquen daños en un objeto DataTable cambiando los datos en el objeto DataTable sin actualizar los índices internos del objeto DataTable :
  1. El valor de DataColumn.Expression se cambia de una expresión a ninguna expresión. En este escenario, todos los datos en el objeto DataColumn se establece en DBNull.
  2. Cuando se llama al método DataTable.Clear , todos los datos en el objeto DataTable se quitan y se actualizan los índices. Sin embargo, no se actualizan otras tablas hacen referencia al objeto DataTable .
Por ejemplo, considere la situación siguiente:
  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. Ejecute la aplicación.
En esta situación, recibe el siguiente mensaje de error:
Índice interno de DataTable está dañado: '5'.
Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
824684Descripción de la terminología estándar utilizada para describir las actualizaciones de software de Microsoft

Propiedades

Id. de artículo: 932491 - Última revisión: lunes, 03 de diciembre de 2007 - Versión: 1.8
La información de este artículo se refiere a:
  • Microsoft .NET Framework 2.0
Palabras clave: 
kbmt kbfix kbbug kbprb kbexpertiseinter kbexpertisebeginner kbqfe kbpubtypekc KB932491 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 932491

Enviar comentarios

 

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