DetailPage-MSS-KB

Microsoft Knowledge Base

Identificativo articolo: 932491 - Ultima modifica: lunedì 3 dicembre 2007 - Revisione: 1.8

 

Sintomi

Quando si tenta di utilizzare un componente in un'applicazione basata su Microsoft .NET Framework 2.0, è possono che i dati che sono associati il componente venga danneggiati. Questo problema si verifica quando il componente utilizza un oggetto System.Data.DataSet . Quando si verifica questo problema, è possibile si verifichi uno o più dei seguenti problemi:
  • Quando viene chiamato il metodo AcceptChanges in una classe DataView , è possibile che il gestore di record venga danneggiato.
  • I valori calcolati in una colonna espressione non venga aggiornati correttamente.
  • Quando il metodo DataTable.Select viene chiamato utilizzando più istruzioni, è possibile che un risultato non corretto venga restituito.
  • L'indice interno di un oggetto DataTable potrebbe venire danneggiato. Inoltre, è visualizzato un messaggio di errore '13'.
  • Quando si verifica un'operazione di unione, il gestore di record potrebbe venire danneggiato se la riga di destinazione è nello stato di modifica.
  • L'indice interno di un oggetto DataTable potrebbe venire danneggiato. Inoltre, è visualizzato un messaggio di errore '5'.

Risoluzione

Informazioni sull'hotfix



È disponibile un hotfix supportato. Questo hotfix è tuttavia destinato esclusivamente alla risoluzione del problema descritto in questo articolo. Consente di applicare questo aggiornamento rapido (hotfix) solo ai sistemi in cui si verifica questo problema specifico. Questo aggiornamento rapido (hotfix) potrebbe essere eseguiti ulteriori test. Se non si è notevolmente interessati da questo problema, si consiglia pertanto di attendere il successivo aggiornamento di software che contiene questo aggiornamento rapido (hotfix).

Per scaricare questo aggiornamento rapido (hotfix) da MSDN Code Gallery, il seguente sito Microsoft Web:
http://code.msdn.microsoft.com/KB932491 (http://code.msdn.microsoft.com/KB932491)

Nota MSDN Code Gallery vengono visualizzate le lingue per i quali l'aggiornamento rapido è disponibile. Se non viene visualizzata la lingua elencata, è perché la pagina di risorse di Code Gallery non è disponibile per tale lingua.

Nota Se si verificano ulteriori problemi o se la risoluzione dei problemi è necessario, potrebbe essere necessario creare una richiesta di servizio separato. I costi di supporto normale verranno applicati per eventuali ulteriori domande e problemi che non dovessero rientrare nello specifico hotfix in questione. Per un elenco completo, di Microsoft Customer Service and Support numeri di telefono o a creare una richiesta di servizio distinto, visitare il seguente sito Web Microsoft:
http://support.microsoft.com/contactus/?ws=support (http://support.microsoft.com/contactus/?ws=support)

Prerequisiti

Non esistono prerequisiti per l'installazione di questo aggiornamento rapido (hotfix).

Necessità di riavvio

Non è necessario riavviare il computer dopo avere applicato questo aggiornamento rapido (hotfix).

Informazioni sulla sostituzione della correzione

Questo aggiornamento rapido (hotfix) non sostituisce eventuali altri hotfix.

Informazioni sui file

La versione di lingua inglese di questo aggiornamento rapido (hotfix) presenta gli attributi di file (o attributi successivi) elencati nella tabella riportata di seguito. Le date e le ore per questi file sono indicati in UTC (Coordinated Universal Time). Quando si visualizzano le informazioni sul file, viene convertito in ora locale. Per calcolare la differenza tra ora UTC e l'ora locale, utilizzare la scheda fuso orario dello Data e ora nel Pannello di controllo.
Per computer basati su 86 x
Riduci questa tabellaEspandi questa tabella
Nome del fileVersione del fileDimensione del fileDataOraPiattaforma
Mscordacwks.dll2.0.50727.802802,30403-02-200711: 22x 86
Mscorjit.dll2.0.50727.802326.65603-02-200711: 22x 86
Mscorlib.dll2.0.50727.8024,308,99203-02-200711: 22x 86
Mscorpe.dll2.0.50727.802102,91203-02-200711: 22x 86
Mscorwks.dll2.0.50727.8025,625,34403-02-200711: 21x 86
Normalization.dll2.0.50727.80215.36003-02-200711: 22x 86
Normidna.nlpNon applicabile59,34203-02-200711: 22Non applicabile
Normnfc.nlpNon applicabile45,79403-02-200711: 22Non applicabile
Normnfd.nlpNon applicabile39,28403-02-200711: 22Non applicabile
Normnfkc.nlpNon applicabile66,38403-02-200711: 22Non applicabile
Normnfkd.nlpNon applicabile60,29403-02-200711: 22Non applicabile
Peverify.dll2.0.50727.802136.19203-02-200711: 21x 86
Sos.dll2.0.50727.802382.46403-02-200711: 22x 86
System.Data.dll2.0.50727.8022,902,01603-02-200711: 22x 86
System.Data.OracleClient.dll2.0.50727.802482,30403-02-200711: 22x 86
Vsavb7rt.dll8.0.50727.8021,330,68803-02-200711: 21x 86
Per computer basati su 64 x
Riduci questa tabellaEspandi questa tabella
Nome del fileVersione del fileDimensione del fileDataOraPiattaforma
Mscordacwks.dll2.0.50727.8021.597.44003-02-200703: 14x 64
Mscordacwks.dll2.0.50727.802802,30403-02-200711: 22x 86
Mscorjit.dll2.0.50727.8021,587,71203-02-200703: 13x 64
Mscorjit.dll2.0.50727.802326.65603-02-200711: 22x 86
Mscorlib.dll2.0.50727.8023,960,83203-02-200706: 28x 64
Mscorlib.dll2.0.50727.8024,308,99203-02-200711: 22x 86
Mscorpe.dll2.0.50727.802157,18403-02-200703: 07x 64
Mscorpe.dll2.0.50727.802102,91203-02-200711: 22x 86
Mscorpjt.dll2.0.50727.8022,004,99203-02-200703: 13x 64
Normalization.dll2.0.50727.80218.43203-02-200703: 12x 64
Normalization.dll2.0.50727.80215.36003-02-200711: 22x 86
Normidna.nlpNon applicabile59,34203-02-200703: 14Non applicabile
Normidna.nlpNon applicabile59,34203-02-200711: 22Non applicabile
Normnfc.nlpNon applicabile45,79403-02-200703: 14Non applicabile
Normnfc.nlpNon applicabile45,79403-02-200711: 22Non applicabile
Normnfd.nlpNon applicabile39,28403-02-200703: 14Non applicabile
Normnfd.nlpNon applicabile39,28403-02-200711: 22Non applicabile
Normnfkc.nlpNon applicabile66,38403-02-200703: 14Non applicabile
Normnfkc.nlpNon applicabile66,38403-02-200711: 22Non applicabile
Normnfkd.nlpNon applicabile60,29403-02-200703: 14Non applicabile
Normnfkd.nlpNon applicabile60,29403-02-200711: 22Non applicabile
Peverify.dll2.0.50727.802136.19203-02-200711: 21x 86
Peverify.nlp2.0.50727.802205,82403-02-200703: 13Non applicabile
Sos.dll2.0.50727.802480,76803-02-200703: 22x 64
Sos.dll2.0.50727.802382.46403-02-200711: 22x 86
System.Data.dll2.0.50727.8022,967,04003-02-200706: 28x 64
System.Data.dll2.0.50727.8022,902,01603-02-200711: 22x 86
System.Data.OracleClient.dll2.0.50727.802498,68803-02-200706: 28x 64
System.Data.OracleClient.dll2.0.50727.802482,30403-02-200711: 22x 86
Mscorwks.dll2.0.50727.80210,323,45603-02-200703: 11x 64
Mscorwks.dll2.0.50727.8025,625,34403-02-200711: 21x 86
Vsavb7rt.dll8.0.50727.8021,330,68803-02-200711: 21x 86
Per i computer basati su Itanium
Riduci questa tabellaEspandi questa tabella
Nome del fileVersione del fileDimensione del fileDataOraPiattaforma
Mscordacwks.dll2.0.50727.8022,719,23203-02-200703: 15IA-64
Mscordacwks.dll2.0.50727.802802,30403-02-200711: 22x 86
Mscorjit.dll2.0.50727.8022,705,92003-02-200703: 13IA-64
Mscorjit.dll2.0.50727.802326.65603-02-200711: 22x 86
Mscorlib.dll2.0.50727.8023,960,83203-02-200706: 42IA-64
Mscorlib.dll2.0.50727.8024,308,99203-02-200711: 22x 86
Mscorpe.dll2.0.50727.802313,85603-02-200703: 06IA-64
Mscorpe.dll2.0.50727.802102,91203-02-200711: 22x 86
Mscorpjt.dll2.0.50727.8023,501,05603-02-200703: 14IA-64
Normalization.dll2.0.50727.80215.36003-02-200711: 22x 86
Normalization.dll2.0.50727.80244.03203-02-200703: 12IA-64
Fl_normidna.nlpNon applicabile59,34203-02-200711: 22Non applicabile
Normidna.nlpNon applicabile59,34203-02-200703: 14Non applicabile
Normnfc.nlpNon applicabile45,79403-02-200711: 22Non applicabile
Normnfc.nlpNon applicabile45,79403-02-200703: 14Non applicabile
Normnfd.nlpNon applicabile39,28403-02-200711: 22Non applicabile
Normnfd.nlpNon applicabile39,28403-02-200703: 14Non applicabile
Normnfkc.nlpNon applicabile66,38403-02-200711: 22Non applicabile
Normnfkc.nlpNon applicabile66,38403-02-200703: 14Non applicabile
Normnfkd.nlpNon applicabile60,29403-02-200711: 22Non applicabile
Normnfkd.nlpNon applicabile60,29403-02-200703: 14Non applicabile
Peverify.dll2.0.50727.802136.19203-02-200711: 21x 86
Peverify.dll2.0.50727.802383,48803-02-200703: 13IA-64
Sos.dll2.0.50727.802382.46403-02-200711: 22x 86
Sos.dll2.0.50727.802862,72003-02-200703: 23IA-64
System.Data.dll2.0.50727.8022,902,01603-02-200711: 22x 86
System.Data.dll2.0.50727.8023,109,88803-02-200706: 42IA-64
System.Data.OracleClient.dll2.0.50727.802482,30403-02-200711: 22x 86
System.Data.OracleClient.dll2.0.50727.802501,76003-02-200706: 42IA-64
Mscorwks.dll2.0.50727.8025,625,34403-02-200711: 21x 86
Mscorwks.dll2.0.50727.80221,309,95203-02-200703: 11IA-64
Vsavb7rt.dll8.0.50727.8021,330,68803-02-200711: 21x 86

Status

Microsoft ha confermato che questo problema riguarda i prodotti sono elencati nella sezione "Si applica a".

Informazioni

Problema 1: Quando viene chiamato il metodo AcceptChanges in una classe DataView, la gestione dei record potrebbe essere danneggiata

Gestione record potrebbero essere danneggiati durante un'operazione di scrittura da un gestore eventi. In questo caso, può essere generata un'eccezione System.NullreferenceException. Quando l'applicazione esegue un'operazione di scrittura in un evento ListChanged , gli aggiornamenti di indici possono inoltre verificarsi nell'ordine corretto.

Si consideri ad esempio, nello scenario riportato di seguito:
  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. L'esecuzione dell'applicazione.
In questo scenario, riceverai un messaggio di errore analogo al seguente:
System.NullReferenceException: il riferimento del oggetto non è impostato a un'istanza di un oggetto. in System.Data.DataView.IsOriginalVersion (indice Int32) in System.Data.DataRowView.get_Item (Int32 ndx) in Test.Main() in c:\Work\bugs\newbug1\Test.cs:line 42
Per risolvere questo problema, non eseguire operazioni di scrittura in un evento ListChanged . Si consiglia di utilizzare l'evento RowChanged invece dell'evento ListChanged .

Problema 2: I valori calcolati in una colonna espressione potrebbero non essere aggiornati correttamente

Quando si tenta di calcolare i valori di una colonna di espressione in un oggetto DataSet e la colonna espressione fa parte di una relazione, i valori calcolati della colonna espressioni non venga aggiornati correttamente. Si consideri ad esempio, nello scenario riportato di seguito:
  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. L'esecuzione dell'applicazione.
In questo scenario, è stato visualizzato il seguente output:
<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>
nell'output di questo l'elemento di NumberOfReports nel primo elemento T2 contiene il valore corretto pari a 0 invece di 1.

Problema 3: Quando il metodo DataTable.Select viene chiamato utilizzando più istruzioni, un risultato non corretto può essere restituito

Quando si utilizza il metodo SELECT di un oggetto DataTable con la clausola AND per recuperare i dati per più istruzioni, il metodo SELECT è possibile che restituiscono un risultato errato. Ad esempio, il codice riportato di seguito restituisce un risultato non corretto:
string filter = "(NOT ColTwo = 1) AND (ColOne = 2)";
DataTable.Select(filter);
tuttavia, il codice seguente restituisce il risultato corretto:
string filter = "NOT ColTwo = 1 AND ColOne = 2";
DataTable.Select(filter);
inoltre, si consideri lo scenario seguente:
  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. L'esecuzione dell'applicazione.
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: L'indice interno di una DataTable potrebbe essere danneggiato e viene visualizzato un messaggio di errore '13'

Quando si tenta di utilizzare il metodo AcceptChanges di un oggetto DataSet utilizzato da un oggetto DataTable e si imposta una regola ForeignKey su AcceptRule.Cascade , è possono che i valori di indice interno che vengono utilizzati dall'oggetto DataSet venga danneggiati. Questo problema si verifica se le seguenti condizioni sono vere:
  • L'oggetto DataSet contiene uno o più tabelle che hanno relazioni uno-a-molti.
  • Il metodo AcceptChanges dell'oggetto DataSet è chiamato.
  • Il valore AcceptRejectRule dell'oggetto DataSet è impostato su CASCADE. Quando questo valore è impostato su CASCADE, la tabella figlio viene modificata in modo che automaticamente sia accetta i dati o rifiuta i dati.
Si consideri ad esempio, nello scenario riportato di seguito:
  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. L'esecuzione dell'applicazione.
In questa situazione viene visualizzato il seguente messaggio d'errore:
Indice interno di DataTable è danneggiato: '13'.

Problema 5: Quando si verifica un'operazione di unione, il gestore di record potrebbe essere danneggiato se la riga di destinazione è nello stato di modifica

Se la modifica una o più righe di un oggetto DataTable e quindi si verifica un'operazione DataTable.Merge o si verifica un'operazione DataSet.Merge , è possibile che il gestore di record per l'oggetto DataSet dell'oggetto DataTable venga danneggiato.

Nota Quando viene modificata una riga in un oggetto DataTable , il valore di DataRowVersion della riga è impostato su proposto.

Si consideri ad esempio, nello scenario riportato di seguito:
  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. L'esecuzione dell'applicazione.
In questo scenario, il gestore di record per l'oggetto DataSet dell'oggetto DataTable è danneggiato.

Per aggirare il problema, assicurarsi che non esistono righe nell'oggetto di DataSet di destinazione con il valore di DataRowVersion impostato su proposto prima di utilizzare il metodo DataTable.Merge o il metodo DataSet.Merge .

Problema 6: L'indice interno di un oggetto DataTable potrebbe essere danneggiato e viene visualizzato un messaggio di errore '5'

I seguenti scenari di causano il danneggiamento di un oggetto DataTable modificando i dati nell'oggetto DataTable senza aggiornare gli indici interni dell'oggetto DataTable :
  1. Il valore DataColumn.Expression viene modificato da un'espressione per nessuna espressione. In questo scenario, tutti i dati dell'oggetto DataColumn è impostare su DBNull.
  2. Quando il metodo DataTable.Clear è chiamato tutti i dati nell'oggetto DataTable vengono rimossi e vengono aggiornati gli indici. Tuttavia, non vengono aggiornate altre tabelle che fanno riferimento l'oggetto DataTable .
Si consideri ad esempio, nello scenario riportato di seguito:
  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. L'esecuzione dell'applicazione.
In questa situazione viene visualizzato il seguente messaggio d'errore:
Indice interno di DataTable è danneggiato: '5'.
Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
824684  (http://support.microsoft.com/kb/824684/ ) Descrizione della terminologia standard utilizzata per descrivere gli aggiornamenti software Microsoft

Le informazioni in questo articolo si applicano a:
  • Microsoft .NET Framework 2.0
Chiavi: 
kbmt kbfix kbbug kbprb kbexpertiseinter kbexpertisebeginner kbqfe kbpubtypekc KB932491 KbMtit
Traduzione automatica articoliTraduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell’articolo: 932491  (http://support.microsoft.com/kb/932491/en-us/ )
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
Condividi
Altre opzioni per il supporto
Forum del supporto di Microsoft Community
Contattaci direttamente
Ricerca di un partner certificato Microsoft
Microsoft Store