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
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'.
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:
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:
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.
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:".
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:
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();
}
}
}
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:
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);
}
}
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:
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.
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:
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]);
}
}
}
}
}
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 :
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.
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:
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;
}
}
}
}
}
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:
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
¡Muchas gracias! Sus comentarios nos ayudarán a mejorar los contenidos de soporte. Para más opciones de asistencia, visite la página de Ayuda y soporte técnico.