ИСПРАВЛЕНИЕ: Данные, связанные с компонентом, который использует объект System.Data могут быть повреждены в приложения, основанные на Microsoft.NET Framework 2.0

Переводы статьи Переводы статьи
Код статьи: 932491 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Проблема

При попытке использовать компонент в приложении, основанные на Microsoft.NET Framework 2.0, данные, связанные с компонентом может быть поврежден. Эта проблема возникает, когда компонент использует System.Data.DataSet объект. При возникновении данной проблемы могут возникнуть одно или несколько из следующих проблем:
  • При Метод AcceptChanges метод в Объект DataView класс называется, диспетчер записей может быть поврежден.
  • Вычисленные значения в столбце выражение может быть обновлен некорректно.
  • При DataTable.Select метод вызывается с помощью нескольких инструкций, неправильный результат может быть возвращено.
  • Внутренний индекс Объект DataTable объект может быть поврежден. Кроме того появляется сообщение об ошибке «13».
  • При выполнении операции слияния, диспетчер записей могут быть повреждены, если в целевой строке находится в состоянии редактирования.
  • Внутренний индекс Объект DataTable объект может быть поврежден. Кроме того появляется сообщение об ошибке «5».

Решение

Сведения об исправлении



Корпорация Майкрософт выпустила исправление. Однако данное исправление предназначено для устранения проблемы, описанной в этой статье. Данное исправление только в тех системах, в которых обнаружена эта специфическая неполадка. Это исправление может проходить дополнительное тестирование. Таким образом Если вы не представляет особой эта проблема, рекомендуется отложить ее решение до выхода ближайшего пакета обновления, содержащего это исправление.

Чтобы загрузить данное исправление из коллекции кода MSDN, посетите веб-узел корпорации Майкрософт:
http://Code.MSDN.Microsoft.com/KB932491

Примечание Коллекции кода MSDN отображаются языки, для которых доступно исправление. Если язык в списке не отображается, значит страница коллекции кода ресурсов недоступна для данного языка.

Примечание Если возникают другие проблемы или необходимо устранить неполадки, возможно создать отдельный запрос на обслуживание. Затраты на обычные службы поддержки будут применяться дополнительные вопросы и проблемы, не связанные с данным исправлением, оплачиваются. Для получения полного списка телефонов службы поддержки и обслуживания клиентов корпорации Майкрософт или создать отдельный запрос посетите следующий веб-узел корпорации Майкрософт:
http://support.Microsoft.com/contactus/?ws=Support

Необходимые условия

Не существует предварительных условий для установки исправления.

Необходимость перезагрузки

У вас нет необходимости перезагружать компьютер после установки этого исправления.

Сведения о замене исправлений

Это исправление не заменяет других исправлений.

Сведения о файлах

Английская версия исправления содержит атрибуты файла (или более поздними), приведенные в следующей таблице. Дата и время для файлов указаны в формате общего скоординированного времени (UTC). При просмотре сведений о файле, он преобразуется в локальное время. Чтобы узнать разницу между временем по Гринвичу и местным временем, следует использовать Часовой пояс на вкладке Дата и время элемент панели управления.
Для компьютеров с процессорами х86
Свернуть эту таблицуРазвернуть эту таблицу
Имя файлаВерсия файлаРазмер файлаДатаВремяПлатформа
Файла Mscordacwks.dll2.0.50727.802802,30403 Февраля 2007 г.11: 22X86
Mscorjit.dll2.0.50727.802326,65603 Февраля 2007 г.11: 22X86
Библиотека mscorlib.dll2.0.50727.8024,308,99203 Февраля 2007 г.11: 22X86
Mscorpe.dll2.0.50727.802102,91203 Февраля 2007 г.11: 22X86
Mscorwks.dll2.0.50727.8025,625,34403 Февраля 2007 г.11: 21X86
Normalization.dll2.0.50727.80215,36003 Февраля 2007 г.11: 22X86
Normidna.NLPНе применимо59,34203 Февраля 2007 г.11: 22Не применимо
Normnfc.NLPНе применимо45,79403 Февраля 2007 г.11: 22Не применимо
Normnfd.NLPНе применимо39,28403 Февраля 2007 г.11: 22Не применимо
Normnfkc.NLPНе применимо66,38403 Февраля 2007 г.11: 22Не применимо
Normnfkd.NLPНе применимо60,29403 Февраля 2007 г.11: 22Не применимо
Peverify.dll2.0.50727.802136,19203 Февраля 2007 г.11: 21X86
SOS.dll2.0.50727.802382,46403 Февраля 2007 г.11: 22X86
System.Data.dll2.0.50727.8022,902,01603 Февраля 2007 г.11: 22X86
System.Data.OracleClient.dll2.0.50727.802482,30403 Февраля 2007 г.11: 22X86
Vsavb7rt.dll8.0.50727.8021,330,68803 Февраля 2007 г.11: 21X86
Для x 64-разрядных компьютерах
Свернуть эту таблицуРазвернуть эту таблицу
Имя файлаВерсия файлаРазмер файлаДатаВремяПлатформа
Файла Mscordacwks.dll2.0.50727.8021,597,44003 Февраля 2007 г.03: 14X64
Файла Mscordacwks.dll2.0.50727.802802,30403 Февраля 2007 г.11: 22X86
Mscorjit.dll2.0.50727.8021,587,71203 Февраля 2007 г.03: 13X64
Mscorjit.dll2.0.50727.802326,65603 Февраля 2007 г.11: 22X86
Библиотека mscorlib.dll2.0.50727.8023,960,83203 Февраля 2007 г.06: 28X64
Библиотека mscorlib.dll2.0.50727.8024,308,99203 Февраля 2007 г.11: 22X86
Mscorpe.dll2.0.50727.802157,18403 Февраля 2007 г.03: 07X64
Mscorpe.dll2.0.50727.802102,91203 Февраля 2007 г.11: 22X86
Mscorpjt.dll2.0.50727.8022,004,99203 Февраля 2007 г.03: 13X64
Normalization.dll2.0.50727.80218,43203 Февраля 2007 г.03: 12X64
Normalization.dll2.0.50727.80215,36003 Февраля 2007 г.11: 22X86
Normidna.NLPНе применимо59,34203 Февраля 2007 г.03: 14Не применимо
Normidna.NLPНе применимо59,34203 Февраля 2007 г.11: 22Не применимо
Normnfc.NLPНе применимо45,79403 Февраля 2007 г.03: 14Не применимо
Normnfc.NLPНе применимо45,79403 Февраля 2007 г.11: 22Не применимо
Normnfd.NLPНе применимо39,28403 Февраля 2007 г.03: 14Не применимо
Normnfd.NLPНе применимо39,28403 Февраля 2007 г.11: 22Не применимо
Normnfkc.NLPНе применимо66,38403 Февраля 2007 г.03: 14Не применимо
Normnfkc.NLPНе применимо66,38403 Февраля 2007 г.11: 22Не применимо
Normnfkd.NLPНе применимо60,29403 Февраля 2007 г.03: 14Не применимо
Normnfkd.NLPНе применимо60,29403 Февраля 2007 г.11: 22Не применимо
Peverify.dll2.0.50727.802136,19203 Февраля 2007 г.11: 21X86
Peverify.NLP2.0.50727.802205,82403 Февраля 2007 г.03: 13Не применимо
SOS.dll2.0.50727.802480,76803 Февраля 2007 г.03: 22X64
SOS.dll2.0.50727.802382,46403 Февраля 2007 г.11: 22X86
System.Data.dll2.0.50727.8022,967,04003 Февраля 2007 г.06: 28X64
System.Data.dll2.0.50727.8022,902,01603 Февраля 2007 г.11: 22X86
System.Data.OracleClient.dll2.0.50727.802498,68803 Февраля 2007 г.06: 28X64
System.Data.OracleClient.dll2.0.50727.802482,30403 Февраля 2007 г.11: 22X86
Mscorwks.dll2.0.50727.80210,323,45603 Февраля 2007 г.03: 11X64
Mscorwks.dll2.0.50727.8025,625,34403 Февраля 2007 г.11: 21X86
Vsavb7rt.dll8.0.50727.8021,330,68803 Февраля 2007 г.11: 21X86
Для компьютеров с процессором Itanium
Свернуть эту таблицуРазвернуть эту таблицу
Имя файлаВерсия файлаРазмер файлаДатаВремяПлатформа
Файла Mscordacwks.dll2.0.50727.8022,719,23203 Февраля 2007 г.03: 15IA-64
Файла Mscordacwks.dll2.0.50727.802802,30403 Февраля 2007 г.11: 22X86
Mscorjit.dll2.0.50727.8022,705,92003 Февраля 2007 г.03: 13IA-64
Mscorjit.dll2.0.50727.802326,65603 Февраля 2007 г.11: 22X86
Библиотека mscorlib.dll2.0.50727.8023,960,83203 Февраля 2007 г.06: 42IA-64
Библиотека mscorlib.dll2.0.50727.8024,308,99203 Февраля 2007 г.11: 22X86
Mscorpe.dll2.0.50727.802313,85603 Февраля 2007 г.03: 06IA-64
Mscorpe.dll2.0.50727.802102,91203 Февраля 2007 г.11: 22X86
Mscorpjt.dll2.0.50727.8023,501,05603 Февраля 2007 г.03: 14IA-64
Normalization.dll2.0.50727.80215,36003 Февраля 2007 г.11: 22X86
Normalization.dll2.0.50727.80244,03203 Февраля 2007 г.03: 12IA-64
Fl_normidna.NLPНе применимо59,34203 Февраля 2007 г.11: 22Не применимо
Normidna.NLPНе применимо59,34203 Февраля 2007 г.03: 14Не применимо
Normnfc.NLPНе применимо45,79403 Февраля 2007 г.11: 22Не применимо
Normnfc.NLPНе применимо45,79403 Февраля 2007 г.03: 14Не применимо
Normnfd.NLPНе применимо39,28403 Февраля 2007 г.11: 22Не применимо
Normnfd.NLPНе применимо39,28403 Февраля 2007 г.03: 14Не применимо
Normnfkc.NLPНе применимо66,38403 Февраля 2007 г.11: 22Не применимо
Normnfkc.NLPНе применимо66,38403 Февраля 2007 г.03: 14Не применимо
Normnfkd.NLPНе применимо60,29403 Февраля 2007 г.11: 22Не применимо
Normnfkd.NLPНе применимо60,29403 Февраля 2007 г.03: 14Не применимо
Peverify.dll2.0.50727.802136,19203 Февраля 2007 г.11: 21X86
Peverify.dll2.0.50727.802383,48803 Февраля 2007 г.03: 13IA-64
SOS.dll2.0.50727.802382,46403 Февраля 2007 г.11: 22X86
SOS.dll2.0.50727.802862,72003 Февраля 2007 г.03: 23IA-64
System.Data.dll2.0.50727.8022,902,01603 Февраля 2007 г.11: 22X86
System.Data.dll2.0.50727.8023,109,88803 Февраля 2007 г.06: 42IA-64
System.Data.OracleClient.dll2.0.50727.802482,30403 Февраля 2007 г.11: 22X86
System.Data.OracleClient.dll2.0.50727.802501,76003 Февраля 2007 г.06: 42IA-64
Mscorwks.dll2.0.50727.8025,625,34403 Февраля 2007 г.11: 21X86
Mscorwks.dll2.0.50727.80221,309,95203 Февраля 2007 г.03: 11IA-64
Vsavb7rt.dll8.0.50727.8021,330,68803 Февраля 2007 г.11: 21X86

Статус

Корпорация Майкрософт подтверждает, что это проблема в продуктах Microsoft, перечисленных в разделе «Относится к».

Дополнительная информация

Проблема 1: При вызове метода AcceptChanges в классе DataView диспетчер записей может быть поврежден

Во время операции записи из обработчика событий может привести к повреждению записи диспетчера. При этом может возникнуть исключение System.NullreferenceException. Кроме того, когда приложение выполняет операции записи в ListChanged событие, обновления индекса может произойти в неверном порядке.

Например рассмотрим следующую ситуацию:
  1. В приложении используйте следующий код:
    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. Запустите приложение.
В этом случае появляется сообщение об ошибке, похожее на следующее сообщение об ошибке:
System.NullReferenceException: Объекта не задана ссылка на экземпляр объекта. в System.Data.DataView.IsOriginalVersion (Int32 индекс) в System.Data.DataRowView.get_Item (Int32 ndx) в Test.Main() в c:\Work\bugs\newbug1\Test.cs:line 42
Чтобы обойти эту проблему, не выполняйте никакие операции записи в ListChanged событие. Лучше всего использовать RowChanged события вместо ListChanged событие.

Проблема 2: Вычисленные значения в столбце выражение может быть обновлен некорректно

При попытке вычислить значения столбец выражения Набор данных Объект, а столбец выражения является частью связи, вычисленные значения столбца выражение не может правильно обновлены. Например рассмотрим следующую ситуацию:
  1. В приложении используйте следующий код:
    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. Запустите приложение.
В этом случае получены следующие результаты:
<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>
В этих выходных данных NumberOfReports элемент в первом элементе T2 содержит неверное значение 0 вместо 1.

Проблема 3: При вызове метода DataTable.Select при помощи нескольких инструкций неверный результат может быть возвращено

При использовании Выберите метод Объект DataTable объект вместе с предложением И получить данные для нескольких инструкций Выберите метод может вернуть неверный результат. Например следующий код возвращает неверный результат:
string filter = "(NOT ColTwo = 1) AND (ColOne = 2)";
DataTable.Select(filter);
Тем не менее следующий код возвращает правильный результат:
string filter = "NOT ColTwo = 1 AND ColOne = 2";
DataTable.Select(filter);
Кроме того возможна следующая ситуация:
  1. В приложении используйте следующий код:
    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. Запустите приложение.
В этом случае получены следующие результаты:
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
В этом выводе "(ColOne = 2)» неверно отображается в правой части предложения AND.

Проблема 4: Внутренний индекс объекта DataTable может быть поврежден, и появляется сообщение об ошибке «13»

При попытке использовать Метод AcceptChanges метод Набор данных Объект, который используется Объект DataTable объект и значение ForeignKey правила AcceptRule.Cascade, внутренний индекс значения, используемые Набор данных объект может быть поврежден. Эта проблема возникает, если выполняются следующие условия:
  • В Набор данных объект содержит одну или несколько таблиц, связи «один ко многим».
  • В Метод AcceptChanges метод Набор данных вызывается объектом.
  • В AcceptRejectRule значение Набор данных объект устанавливается в каскадном соединении. Если это значение Cascade, дочерняя таблица изменяется таким образом, чтобы он автоматически принимает данные либо отклоняет данные.
Например рассмотрим следующую ситуацию:
  1. В приложении используйте следующий код:
    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. Запустите приложение.
В этом случае появляется следующее сообщение об ошибке:
Поврежден внутренний индекс объекта DataTable: «13».

Проблема 5: При выполнении операции слияния, диспетчер записей могут быть повреждены Если целевой строки находится в состоянии редактирования

Если одна или несколько строк в Объект DataTable Объект, изменяются, а затем DataTable.Merge происходит операция или DataSet.Merge Операция происходит запись руководителя Набор данных объект Объект DataTable объект может быть поврежден.

Примечание Когда строки в Объект DataTable редактируемого объекта DataRowVersion Строка имеет значение предложенный.

Например рассмотрим следующую ситуацию:
  1. В приложении используйте следующий код:
    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. Запустите приложение.
В этом случае запись руководителя Набор данных объект Объект DataTable Объект поврежден.

Чтобы обойти эту проблему, убедитесь, что нет ни одной строки в месте назначения Набор данных Объект, имеющий DataRowVersion значение предлагаемой перед использованием DataTable.Merge метод или DataSet.Merge метод.

Проблема 6: Внутренний индекс объекта DataTable может быть поврежден, и появляется сообщение об ошибке «5»

Повреждение в следующих случаях Объект DataTable объект путем преобразования данных в Объект DataTable объект без обновления внутренних индексов Объект DataTable объект:
  1. В DataColumn.Expression не выражение изменяется значение выражения. В этом случае все данные DataColumn объект имеет значение DBNull.
  2. При DataTable.Clear вызывается метод, все данные Объект DataTable был удален и индексы обновляются. Тем не менее, других таблиц, ссылающихся на Объект DataTable объект не обновляется.
Например рассмотрим следующую ситуацию:
  1. В приложении используйте следующий код:
    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. Запустите приложение.
В этом случае появляется следующее сообщение об ошибке:
Поврежден внутренний индекс объекта DataTable: «5».
Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
824684Стандартные термины, используемые при описании обновлений программных продуктов Майкрософт
Примечание. Это ЭКСПРЕСС-ПУБЛИКАЦИЯ, подготовленная непосредственно службой технической поддержки Майкрософт . Сведения, содержащиеся в данном документе, предоставлены в качестве отклика на возникшие проблемы. Из-за срочности в материалах могут быть опечатки, и в любое время и без уведомления в них могут быть внесены изменения. Чтобы получить дополнительные сведения, см. Условия использования.

Свойства

Код статьи: 932491 - Последний отзыв: 18 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft .NET Framework 2.0
Ключевые слова: 
kbfix kbbug kbprb kbexpertiseinter kbexpertisebeginner kbqfe kbmt KB932491 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:932491

Отправить отзыв

 

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