DetailPage-MSS-KB

Knowledge Base

Artikel-ID: 932491 - Geändert am: Montag, 3. Dezember 2007 - Version: 1.8

 

Problembeschreibung

Wenn Sie versuchen, eine Komponente in einer Anwendung verwenden, die auf Microsoft .NET Framework 2.0 erstellt wird, können Daten, die der Komponente zugeordnet sind beschädigt werden. Dieses Problem tritt auf, wenn die Komponente ein System.Data.DataSet -Objekt verwendet. Wenn dieses Problem auftritt, können die folgenden Probleme auftreten:
  • Wenn die AcceptChanges -Methode in einer DataView -Klasse aufgerufen wird, wird der Datensatz-Manager möglicherweise beschädigt.
  • Die berechneten Werte in einer Ausdrucksspalte können nicht ordnungsgemäß aktualisiert werden.
  • Wenn die DataTable.Select -Methode aufgerufen wird, mithilfe mehrerer Anweisungen, möglicherweise falsche Ergebnisse zurückgegeben werden.
  • Der interne Index eines DataTable -Objekts beschädigt werden. Außerdem erhalten Sie eine '13' Fehlermeldung.
  • Tritt eine Seriendruck-Operation aus, der Datensatz-Manager möglicherweise beschädigt wenn die Zielzeile in der bearbeiten-Zustand befindet.
  • Der interne Index eines DataTable -Objekts beschädigt werden. Außerdem erhalten Sie eine '5' Fehlermeldung.

Lösung

Hotfix-Informationen



Es ist ein unterstützter Hotfix von Microsoft erhältlich. Der Hotfix ist jedoch nur die Behebung des Problems die in diesem Artikel beschriebene vorgesehen. Installieren Sie diesen Hotfix nur auf Systemen, bei die dieses spezielle Problem auftritt. Dieser Hotfix kann einem späteren Zeitpunkt zusätzliche Tests unterzogen. Wenn durch dieses Problem nicht schwerwiegend beeinträchtigt ist, empfiehlt Microsoft daher, auf die nächste Softwareupdate zu warten, das diesen Hotfix enthält.

Um diesen Hotfix aus der MSDN Code Gallery herunterzuladen, die folgende Microsoft-Website:
http://code.msdn.microsoft.com/KB932491 (http://code.msdn.microsoft.com/KB932491)

Hinweis: Der MSDN Code Gallery werden die Sprachen für die der Hotfix verfügbar ist angezeigt. Wenn Ihre Sprache aufgeführt nicht angezeigt wird, ist es, da Code Gallery-Ressourcenseite nicht für diese Sprache zur Verfügung steht.

Hinweis: Wenn weitere Probleme auftreten oder wenn eine Problembehandlung erforderlich ist, müssen Sie möglicherweise eine separate Serviceanfrage erstellen. Die normalen Supportkosten gelten die für zusätzliche Supportfragen und Probleme, die für diesen speziellen Hotfix nicht qualifizieren. Eine vollständige Liste der technischen Kundendienst und Support-Telefonnummern oder eine separate Serviceanfrage erstellen die folgende Microsoft-Website:
http://support.microsoft.com/contactus/?ws=support (http://support.microsoft.com/contactus/?ws=support)

Voraussetzungen

Es gibt keine Voraussetzungen für die Installation dieses Hotfixes.

Neustartanforderung

Sie müssen Ihren Computer nicht neu starten, nachdem Sie diesen Hotfix installiert haben.

Ersetzte Hotfixes

Dieser Hotfix ersetzt keine anderen Hotfixes.

Dateiinformationen

Die englische Version dieses Hotfixes weist die Dateiattribute (oder höher Dateiattribute), die in der folgenden Tabelle aufgelistet werden. Die Datums- und Uhrzeitangaben für diese Dateien sind in Coordinated Universal Time (UTC) angegeben. Wenn Sie sich die Dateiinformationen ansehen, werden diese Angaben in die lokale Zeit konvertiert. Verwenden Sie die Registerkarte Zeitzone im Element Datum und Uhrzeit in der Systemsteuerung, um die Differenz zwischen UTC und der Ortszeit zu ermitteln.
Für x 86-basierten Computern
Tabelle minimierenTabelle vergrößern
DateinameDateiversionDateigrößeDatumUhrzeitPlattform
Mscordacwks.dll2.0.50727.802802,30403-Februar 200711: 22X 86
Mscorjit.dll2.0.50727.802326,65603-Februar 200711: 22X 86
Mscorlib.dll2.0.50727.8024,308,99203-Februar 200711: 22X 86
Mscorpe.dll2.0.50727.802102,91203-Februar 200711: 22X 86
"Mscorwks.dll"2.0.50727.8025,625,34403-Februar 200711: 21X 86
Normalization.dll2.0.50727.80215,36003-Februar 200711: 22X 86
Normidna.NLPNicht zutreffend59,34203-Februar 200711: 22Nicht zutreffend
Normnfc.NLPNicht zutreffend45,79403-Februar 200711: 22Nicht zutreffend
Normnfd.NLPNicht zutreffend39,28403-Februar 200711: 22Nicht zutreffend
Normnfkc.NLPNicht zutreffend66,38403-Februar 200711: 22Nicht zutreffend
Normnfkd.NLPNicht zutreffend60,29403-Februar 200711: 22Nicht zutreffend
Peverify.dll2.0.50727.802136,19203-Februar 200711: 21X 86
Sos.dll2.0.50727.802382,46403-Februar 200711: 22X 86
System.Data.dll2.0.50727.8022,902,01603-Februar 200711: 22X 86
System.Data.OracleClient.dll2.0.50727.802482,30403-Februar 200711: 22X 86
Vsavb7rt.dll8.0.50727.8021,330,68803-Februar 200711: 21X 86
Für x 64-basierten Computern
Tabelle minimierenTabelle vergrößern
DateinameDateiversionDateigrößeDatumUhrzeitPlattform
Mscordacwks.dll2.0.50727.8021,597,44003-Februar 200703: 14X 64
Mscordacwks.dll2.0.50727.802802,30403-Februar 200711: 22X 86
Mscorjit.dll2.0.50727.8021,587,71203-Februar 200703: 13X 64
Mscorjit.dll2.0.50727.802326,65603-Februar 200711: 22X 86
Mscorlib.dll2.0.50727.8023,960,83203-Februar 200706: 28X 64
Mscorlib.dll2.0.50727.8024,308,99203-Februar 200711: 22X 86
Mscorpe.dll2.0.50727.802157,18403-Februar 200703: 07X 64
Mscorpe.dll2.0.50727.802102,91203-Februar 200711: 22X 86
Mscorpjt.dll2.0.50727.8022,004,99203-Februar 200703: 13X 64
Normalization.dll2.0.50727.80218,43203-Februar 200703: 12X 64
Normalization.dll2.0.50727.80215,36003-Februar 200711: 22X 86
Normidna.NLPNicht zutreffend59,34203-Februar 200703: 14Nicht zutreffend
Normidna.NLPNicht zutreffend59,34203-Februar 200711: 22Nicht zutreffend
Normnfc.NLPNicht zutreffend45,79403-Februar 200703: 14Nicht zutreffend
Normnfc.NLPNicht zutreffend45,79403-Februar 200711: 22Nicht zutreffend
Normnfd.NLPNicht zutreffend39,28403-Februar 200703: 14Nicht zutreffend
Normnfd.NLPNicht zutreffend39,28403-Februar 200711: 22Nicht zutreffend
Normnfkc.NLPNicht zutreffend66,38403-Februar 200703: 14Nicht zutreffend
Normnfkc.NLPNicht zutreffend66,38403-Februar 200711: 22Nicht zutreffend
Normnfkd.NLPNicht zutreffend60,29403-Februar 200703: 14Nicht zutreffend
Normnfkd.NLPNicht zutreffend60,29403-Februar 200711: 22Nicht zutreffend
Peverify.dll2.0.50727.802136,19203-Februar 200711: 21X 86
Peverify.NLP2.0.50727.802205,82403-Februar 200703: 13Nicht zutreffend
Sos.dll2.0.50727.802480,76803-Februar 200703: 22X 64
Sos.dll2.0.50727.802382,46403-Februar 200711: 22X 86
System.Data.dll2.0.50727.8022,967,04003-Februar 200706: 28X 64
System.Data.dll2.0.50727.8022,902,01603-Februar 200711: 22X 86
System.Data.OracleClient.dll2.0.50727.802498,68803-Februar 200706: 28X 64
System.Data.OracleClient.dll2.0.50727.802482,30403-Februar 200711: 22X 86
"Mscorwks.dll"2.0.50727.80210,323,45603-Februar 200703: 11X 64
"Mscorwks.dll"2.0.50727.8025,625,34403-Februar 200711: 21X 86
Vsavb7rt.dll8.0.50727.8021,330,68803-Februar 200711: 21X 86
Für Itanium-basierte Computer
Tabelle minimierenTabelle vergrößern
DateinameDateiversionDateigrößeDatumUhrzeitPlattform
Mscordacwks.dll2.0.50727.8022,719,23203-Februar 200703: 15IA-64
Mscordacwks.dll2.0.50727.802802,30403-Februar 200711: 22X 86
Mscorjit.dll2.0.50727.8022,705,92003-Februar 200703: 13IA-64
Mscorjit.dll2.0.50727.802326,65603-Februar 200711: 22X 86
Mscorlib.dll2.0.50727.8023,960,83203-Februar 200706: 42IA-64
Mscorlib.dll2.0.50727.8024,308,99203-Februar 200711: 22X 86
Mscorpe.dll2.0.50727.802313,85603-Februar 200703: 06IA-64
Mscorpe.dll2.0.50727.802102,91203-Februar 200711: 22X 86
Mscorpjt.dll2.0.50727.8023,501,05603-Februar 200703: 14IA-64
Normalization.dll2.0.50727.80215,36003-Februar 200711: 22X 86
Normalization.dll2.0.50727.80244,03203-Februar 200703: 12IA-64
Fl_normidna.NLPNicht zutreffend59,34203-Februar 200711: 22Nicht zutreffend
Normidna.NLPNicht zutreffend59,34203-Februar 200703: 14Nicht zutreffend
Normnfc.NLPNicht zutreffend45,79403-Februar 200711: 22Nicht zutreffend
Normnfc.NLPNicht zutreffend45,79403-Februar 200703: 14Nicht zutreffend
Normnfd.NLPNicht zutreffend39,28403-Februar 200711: 22Nicht zutreffend
Normnfd.NLPNicht zutreffend39,28403-Februar 200703: 14Nicht zutreffend
Normnfkc.NLPNicht zutreffend66,38403-Februar 200711: 22Nicht zutreffend
Normnfkc.NLPNicht zutreffend66,38403-Februar 200703: 14Nicht zutreffend
Normnfkd.NLPNicht zutreffend60,29403-Februar 200711: 22Nicht zutreffend
Normnfkd.NLPNicht zutreffend60,29403-Februar 200703: 14Nicht zutreffend
Peverify.dll2.0.50727.802136,19203-Februar 200711: 21X 86
Peverify.dll2.0.50727.802383,48803-Februar 200703: 13IA-64
Sos.dll2.0.50727.802382,46403-Februar 200711: 22X 86
Sos.dll2.0.50727.802862,72003-Februar 200703: 23IA-64
System.Data.dll2.0.50727.8022,902,01603-Februar 200711: 22X 86
System.Data.dll2.0.50727.8023,109,88803-Februar 200706: 42IA-64
System.Data.OracleClient.dll2.0.50727.802482,30403-Februar 200711: 22X 86
System.Data.OracleClient.dll2.0.50727.802501,76003-Februar 200706: 42IA-64
"Mscorwks.dll"2.0.50727.8025,625,34403-Februar 200711: 21X 86
"Mscorwks.dll"2.0.50727.80221,309,95203-Februar 200703: 11IA-64
Vsavb7rt.dll8.0.50727.8021,330,68803-Februar 200711: 21X 86

Status

Microsoft hat bestätigt, dass dies ein Problem in Microsoft-Produkten handelt, die im Abschnitt "Gilt für" aufgeführt sind.

Weitere Informationen

Problem 1: Wenn die AcceptChanges-Methode in einer DataView-Klasse aufgerufen wird, der Datensatz-Manager möglicherweise beschädigt

Während eines Schreibvorgangs von einem Ereignishandler kann bei der Datensatz-Manager kommen. Wenn dies der Fall ist, kann eine System.NullreferenceException-Ausnahme ausgelöst werden. Wenn die Anwendung einen Schreibvorgang in einem ListChanged -Ereignis ausführt, können darüber hinaus Index Updates in der falschen Reihenfolge auftreten.

Gehen wir beispielsweise von folgendem Szenario aus:
  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. Sie können die Anwendung ausführen.
In diesem Szenario wird eine Fehlermeldung etwa folgende Fehlermeldung:
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Instanz eines Objekts festgelegt. am System.Data.DataView.IsOriginalVersion (Int32 Index) unter System.Data.DataRowView.get_Item (Int32 Ndx) unter Test.Main() in c:\Work\bugs\newbug1\Test.cs:line 42
Um dieses Problem zu umgehen, führen Sie keine Schreibvorgänge in einem ListChanged -Ereignis. Es empfiehlt sich, RowChanged -Ereignis statt das ListChanged -Ereignis zu verwenden.

Problem 2: Die berechneten Werte in einer Ausdrucksspalte können nicht korrekt aktualisiert

Wenn Sie versuchen, die Werte einer Ausdrucksspalte in ein DataSet -Objekt zu berechnen und die Ausdrucksspalte Teil einer Beziehung ist, können die berechneten Werte der Ausdrucksspalte nicht ordnungsgemäß aktualisiert werden. Gehen wir beispielsweise von folgendem Szenario aus:
  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. Sie können die Anwendung ausführen.
In diesem Szenario erhalten Sie die folgende Ausgabe:
<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>
in dieser Ausgabe enthält das NumberOfReports -Element im ersten T2-Element den falschen Wert 0 anstelle von 1.

Problem 3: Wenn die DataTable.Select-Methode aufgerufen wird, mithilfe mehrerer Anweisungen, möglicherweise falsche Ergebnisse zurückgegeben

Wenn Sie die Select -Methode der ein DataTable -Objekt zusammen mit der AND-Klausel zum Abrufen von Daten für mehrere Anweisungen verwenden, kann die Select -Methode ein falsches Ergebnis zurückgeben. Z. B. der folgende Code gibt ein falsches Ergebnis zurück:
string filter = "(NOT ColTwo = 1) AND (ColOne = 2)";
DataTable.Select(filter);
jedoch im folgenden Code wird das richtige Ergebnis zurückgegeben:
string filter = "NOT ColTwo = 1 AND ColOne = 2";
DataTable.Select(filter);
betrachten Sie auch das folgende Szenario:
  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. Sie können die Anwendung ausführen.
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.

Problem 4: Der interne Index einer DataTable beschädigt und Sie erhalten eine '13' Fehlermeldung

Wenn Sie versuchen, die AcceptChanges -Methode des ein DataSet -Objekt zu verwenden, die von DataTable -Objekt verwendet wird und Sie eine Regel ForeignKey auf AcceptRule.Cascade festlegen, wird die interne Indexwerte, die von der DataSet -Objekt verwendet werden möglicherweise beschädigt. Dieses Problem tritt auf, wenn folgenden Bedingungen erfüllt sind:
  • Das DataSet -Objekt enthält eine oder mehrere Tabellen, die 1: n-Beziehungen aufweisen.
  • Die AcceptChanges -Methode des DataSet -Objekts wird aufgerufen.
  • Der Wert AcceptRejectRule des DataSet -Objekts ist auf CASCADE festgelegt. Wenn dieser Wert auf CASCADE festgelegt ist, wird die untergeordneten Tabelle geändert, sodass es automatisch Daten akzeptiert oder lehnt Daten ab.
Gehen wir beispielsweise von folgendem Szenario aus:
  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. Sie können die Anwendung ausführen.
In diesem Szenario wird Ihnen folgende Fehlermeldung:
Interne DataTable-Index ist beschädigt: '13'.

Problem 5: Wenn ein Merge-Vorgang auftritt, der Datensatz-Manager möglicherweise beschädigt wenn die Zielzeile in der bearbeiten-Status befindet

Wenn eine oder mehrere Zeilen in einem DataTable -Objekt bearbeitet werden, und eine DataTable.Merge ausgeführt wird oder eine DataSet.Merge ausgeführt wird, wird der Datensatz-Manager für das DataSet -Objekt des DataTable -Objekts möglicherweise beschädigt.

Hinweis: Wenn eine Zeile in einem DataTable -Objekt bearbeitet wird, wird der DataRowVersion -Wert der Zeile auf vorgesehen festgelegt.

Gehen wir beispielsweise von folgendem Szenario aus:
  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. Sie können die Anwendung ausführen.
In diesem Szenario ist der Datensatz-Manager für das DataSet -Objekt des DataTable -Objekts beschädigt.

Um dieses Problem zu umgehen, stellen Sie sicher, dass keine Zeilen in das Ziel DataSet -Objekt, die den DataRowVersion -Wert festgelegt vorgesehen, haben bevor Sie die DataTable.Merge -Methode oder die DataSet.Merge -Methode verwenden.

Problem 6: Der interne Index eines DataTable-Objekts beschädigt und Sie erhalten eine '5' Fehlermeldung

Die folgenden Szenarien führen Beschädigungen in einem DataTable -Objekt durch Ändern der Daten im DataTable -Objekt ohne Aktualisierung die internen Indizes des DataTable -Objekts:
  1. DataColumn.Expression- Wert wird aus einem Ausdruck in kein Ausdruck geändert. Alle Daten in das DataColumn -Objekt wird in diesem Szenario auf DBNull festgelegt.
  2. Wenn die DataTable.Clear -Methode aufgerufen wird, alle Daten in das DataTable -Objekt wird entfernt und die Indizes aktualisiert. Andere Tabellen, die das DataTable -Objekt verweisen werden jedoch nicht aktualisiert.
Gehen wir beispielsweise von folgendem Szenario aus:
  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. Sie können die Anwendung ausführen.
In diesem Szenario wird Ihnen folgende Fehlermeldung:
Interne DataTable-Index ist beschädigt: '5'.
Weitere Informationen finden Sie im folgenden Artikel der Microsoft Knowledge Base:
824684  (http://support.microsoft.com/kb/824684/ ) Erläuterung von Standardbegriffen bei Microsoft Softwareupdates

Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft .NET Framework 2.0
Keywords: 
kbmt kbfix kbbug kbprb kbexpertiseinter kbexpertisebeginner kbqfe kbpubtypekc KB932491 KbMtde
Maschinell übersetzter ArtikelMaschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 932491  (http://support.microsoft.com/kb/932491/en-us/ )
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Freigeben
Weitere Supportoptionen
Microsoft Community-Supportforen
Kontaktieren Sie uns direkt
Zertifizierten Partner finden
Microsoft Store
Folgen Sie uns: