Düzeltme: Microsoft .NET Framework 2.0 üzerine kurulu bir uygulamada System.Data nesnesini kullanan bir bileşenle ilişkili veri bozulabilir

Makale çevirileri Makale çevirileri
Makale numarası: 932491 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Belirtiler

Microsoft .NET Framework 2.0 üzerine kurulu bir uygulamada bir bileşeni'ni kullanmaya çalıştığınızda, bileşeni ile ilişkili olan veriler bozulabilir. Bu sorun, bileşenin System.Data.DataSet bir nesne kullandığında oluşur. Bu sorun oluştuğunda, aşağıdaki sorunlardan birini veya birkaçını karşılaşabilirsiniz:
  • Kayıt yöneticisi, DataView sınıfında AcceptChanges yöntemi ça?r?ld???nda bozulabilir.
  • Bir <a0>deyim</a0> sütununda hesaplanmış değerleri doğru güncelleştirilmeyebilir.
  • Birden çok ifadeleri kullanarak DataTable.Select yöntemi ça?r?ld???nda, hatalı bir sonuç döndürdü.
  • Bir DataTable nesnesinin iç dizini bozulabilir. Ayrıca, bir '13' hata iletisi alırsınız.
  • Bir mektup birleştirme işlemi gerçekleştiğinde, hedef satırdaki düzenleme durumda ise, kayıt yöneticisi bozulabilir.
  • Bir DataTable nesnesinin iç dizini bozulabilir. Ayrıca, bir '5' hata iletisi alırsınız.

Çözüm

Düzeltme bilgileri



Desteklenen bir düzeltme Microsoft'tan edinilebilir. Ancak bu düzeltmenin, yalnızca bu makalede anlatılan sorunu gidermesi amaçlanmıştır. Bu düzeltmeyi yalnızca bu sorunla karşılaşan sistemlere uygulayın. Bu düzeltme ek sınamaya tabi olabilir. Bu nedenle, bu sorun nedeniyle önemli ölçüde etkilenmediyseniz, bu düzeltmeyi içeren bir sonraki yazılım güncelleştirmesini beklemeniz önerilir.

Bu düzeltmeyi MSDN Kod Galerisi'nden yüklemek için, aşağıdaki Microsoft Web sitesini ziyaret edin:
http://code.msdn.microsoft.com/KB932491

Not MSDN kod galeride, düzeltmenin kullanılabilir olduğu diller görüntülenir. Kendi dilinizi görmüyorsanız, bunun neden, Kod Galerisi kaynak sayfasının bu dil için kullanılabilir olmamasıdır.

Not Ek sorunlar oluşursa veya tüm sorun giderme işlemi gerekmiyorsa, ayrı bir hizmet isteği oluşturmanız gerekebilir. Ek destek sorularına ve bu düzeltme için geçerli olmayan sorunlara normal destek ücretleri uygulanır. Microsoft Müşteri Hizmetleri ve Destek telefon numaralarının tam listesi veya ayrı bir hizmet isteği oluşturmak için, aşağıdaki Microsoft Web sitesini ziyaret edin:
http://support.microsoft.com/contactus/?ws=support

ÖNKOŞULLAR

Bu düzeltmeyi yüklemek için herhangi bir önkoşul bulunmamaktadır.

Yeniden başlatma gereksinimi

Bu düzeltmeyi yükledikten sonra bilgisayarınızı yeniden başlatmanız gerekmez.

Düzeltme Değiştirme Bilgileri

Bu düzeltme başka bir düzeltmenin yerini almaz.

DOSYA BİLGİLERİ

Bu düzeltmenin İngilizce sürümü, aşağıdaki tabloda listelenen dosya özniteliklerine (veya daha yeni dosya özniteliklerine) sahiptir. Bu dosyaların tarihleri ve saatleri Koordinatlı Evrensel Saat'e (UTC) göre listelenir. Dosya bilgilerini görüntülediğinizde yerel saate dönüştürülür. UTC ve yerel saat arasındaki farkı bulmak için <a0></a0>, Denetim Masası'ndaki tarih ve saat öğesinde saat dilimi sekmesini kullanın.
x86 tabanlı bilgisayarlar için
Bu tabloyu kapaBu tabloyu aç
Dosya AdıDosya SürümüDosya BoyutuTARİHSAATPlatform
Mscordacwks.dll2.0.50727.802802,30403 Ã ub 200711: 22X86
Mscorjit.dll2.0.50727.802326,65603 Ã ub 200711: 22X86
Mscorlib.dll2.0.50727.8024,308,99203 Ã ub 200711: 22X86
Mscorpe.dll2.0.50727.802102,91203 Ã ub 200711: 22X86
Mscorwks.dll2.0.50727.8025,625,34403 Ã ub 200711: 21X86
Normalization.dll2.0.50727.80215.36003 Ã ub 200711: 22X86
Normidna.nlpUygulanamaz59,34203 Ã ub 200711: 22Uygulanamaz
Normnfc.nlpUygulanamaz45,79403 Ã ub 200711: 22Uygulanamaz
Normnfd.nlpUygulanamaz39,28403 Ã ub 200711: 22Uygulanamaz
Normnfkc.nlpUygulanamaz66,38403 Ã ub 200711: 22Uygulanamaz
Normnfkd.nlpUygulanamaz60,29403 Ã ub 200711: 22Uygulanamaz
Peverify.dll2.0.50727.802136,19203 Ã ub 200711: 21X86
Sos.dll2.0.50727.802382,46403 Ã ub 200711: 22X86
System.data.dll2.0.50727.8022,902,01603 Ã ub 200711: 22X86
System.data.oracleclient.dll2.0.50727.802482,30403 Ã ub 200711: 22X86
Vsavb7rt.dll8.0.50727.8021,330,68803 Ã ub 200711: 21X86
x64 tabanlı bilgisayarlar için
Bu tabloyu kapaBu tabloyu aç
Dosya AdıDosya SürümüDosya BoyutuTARİHSAATPlatform
Mscordacwks.dll2.0.50727.8021,597,44003 Ã ub 200703: 14X64
Mscordacwks.dll2.0.50727.802802,30403 Ã ub 200711: 22X86
Mscorjit.dll2.0.50727.8021,587,71203 Ã ub 200703: 13X64
Mscorjit.dll2.0.50727.802326,65603 Ã ub 200711: 22X86
Mscorlib.dll2.0.50727.8023,960,83203 Ã ub 200706: 28X64
Mscorlib.dll2.0.50727.8024,308,99203 Ã ub 200711: 22X86
Mscorpe.dll2.0.50727.802157,18403 Ã ub 200703: 07X64
Mscorpe.dll2.0.50727.802102,91203 Ã ub 200711: 22X86
Mscorpjt.dll2.0.50727.8022,004,99203 Ã ub 200703: 13X64
Normalization.dll2.0.50727.80218,43203 Ã ub 200703: 12X64
Normalization.dll2.0.50727.80215.36003 Ã ub 200711: 22X86
Normidna.nlpUygulanamaz59,34203 Ã ub 200703: 14Uygulanamaz
Normidna.nlpUygulanamaz59,34203 Ã ub 200711: 22Uygulanamaz
Normnfc.nlpUygulanamaz45,79403 Ã ub 200703: 14Uygulanamaz
Normnfc.nlpUygulanamaz45,79403 Ã ub 200711: 22Uygulanamaz
Normnfd.nlpUygulanamaz39,28403 Ã ub 200703: 14Uygulanamaz
Normnfd.nlpUygulanamaz39,28403 Ã ub 200711: 22Uygulanamaz
Normnfkc.nlpUygulanamaz66,38403 Ã ub 200703: 14Uygulanamaz
Normnfkc.nlpUygulanamaz66,38403 Ã ub 200711: 22Uygulanamaz
Normnfkd.nlpUygulanamaz60,29403 Ã ub 200703: 14Uygulanamaz
Normnfkd.nlpUygulanamaz60,29403 Ã ub 200711: 22Uygulanamaz
Peverify.dll2.0.50727.802136,19203 Ã ub 200711: 21X86
Peverify.nlp2.0.50727.802205,82403 Ã ub 200703: 13Uygulanamaz
Sos.dll2.0.50727.802480,76803 Ã ub 200703: 22X64
Sos.dll2.0.50727.802382,46403 Ã ub 200711: 22X86
System.data.dll2.0.50727.8022,967,04003 Ã ub 200706: 28X64
System.data.dll2.0.50727.8022,902,01603 Ã ub 200711: 22X86
System.data.oracleclient.dll2.0.50727.802498,68803 Ã ub 200706: 28X64
System.data.oracleclient.dll2.0.50727.802482,30403 Ã ub 200711: 22X86
Mscorwks.dll2.0.50727.80210,323,45603 Ã ub 200703: 11X64
Mscorwks.dll2.0.50727.8025,625,34403 Ã ub 200711: 21X86
Vsavb7rt.dll8.0.50727.8021,330,68803 Ã ub 200711: 21X86
Itanium tabanlı bilgisayarlar için
Bu tabloyu kapaBu tabloyu aç
Dosya AdıDosya SürümüDosya BoyutuTARİHSAATPlatform
Mscordacwks.dll2.0.50727.8022,719,23203 Ã ub 200703: 15IA-64
Mscordacwks.dll2.0.50727.802802,30403 Ã ub 200711: 22X86
Mscorjit.dll2.0.50727.8022,705,92003 Ã ub 200703: 13IA-64
Mscorjit.dll2.0.50727.802326,65603 Ã ub 200711: 22X86
Mscorlib.dll2.0.50727.8023,960,83203 Ã ub 200706: 42IA-64
Mscorlib.dll2.0.50727.8024,308,99203 Ã ub 200711: 22X86
Mscorpe.dll2.0.50727.802313,85603 Ã ub 200703: 06IA-64
Mscorpe.dll2.0.50727.802102,91203 Ã ub 200711: 22X86
Mscorpjt.dll2.0.50727.8023,501,05603 Ã ub 200703: 14IA-64
Normalization.dll2.0.50727.80215.36003 Ã ub 200711: 22X86
Normalization.dll2.0.50727.80244,03203 Ã ub 200703: 12IA-64
Fl_normidna.nlpUygulanamaz59,34203 Ã ub 200711: 22Uygulanamaz
Normidna.nlpUygulanamaz59,34203 Ã ub 200703: 14Uygulanamaz
Normnfc.nlpUygulanamaz45,79403 Ã ub 200711: 22Uygulanamaz
Normnfc.nlpUygulanamaz45,79403 Ã ub 200703: 14Uygulanamaz
Normnfd.nlpUygulanamaz39,28403 Ã ub 200711: 22Uygulanamaz
Normnfd.nlpUygulanamaz39,28403 Ã ub 200703: 14Uygulanamaz
Normnfkc.nlpUygulanamaz66,38403 Ã ub 200711: 22Uygulanamaz
Normnfkc.nlpUygulanamaz66,38403 Ã ub 200703: 14Uygulanamaz
Normnfkd.nlpUygulanamaz60,29403 Ã ub 200711: 22Uygulanamaz
Normnfkd.nlpUygulanamaz60,29403 Ã ub 200703: 14Uygulanamaz
Peverify.dll2.0.50727.802136,19203 Ã ub 200711: 21X86
Peverify.dll2.0.50727.802383,48803 Ã ub 200703: 13IA-64
Sos.dll2.0.50727.802382,46403 Ã ub 200711: 22X86
Sos.dll2.0.50727.802862,72003 Ã ub 200703: 23IA-64
System.data.dll2.0.50727.8022,902,01603 Ã ub 200711: 22X86
System.data.dll2.0.50727.8023,109,88803 Ã ub 200706: 42IA-64
System.data.oracleclient.dll2.0.50727.802482,30403 Ã ub 200711: 22X86
System.data.oracleclient.dll2.0.50727.802501,76003 Ã ub 200706: 42IA-64
Mscorwks.dll2.0.50727.8025,625,34403 Ã ub 200711: 21X86
Mscorwks.dll2.0.50727.80221,309,95203 Ã ub 200703: 11IA-64
Vsavb7rt.dll8.0.50727.8021,330,68803 Ã ub 200711: 21X86

Durum

Microsoft, "Geçerli Olduğu Ürünler" bölümünde listelenen Microsoft ürünlerinde bu sorunun olduğunu onaylamıştır.

Daha fazla bilgi

Sorun 1: DataView sınıfında AcceptChanges yöntemi ça?r?l?r, kayıt yöneticisi bozulabilir

Kayıt Yöneticisi bozulması, bir olay işleyicisi bir yazma işlemi sırasında oluşabilir. Bu durumda, System.NullreferenceException bir özel durum oluşturuldu. Ayrıca, uygulama bir ListChanged olay yazma işlemi gerçekleştirdiğinde, dizin güncelleştirmelerini yanlış sırayla oluşabilir.

Örneğin, şu senaryoyu inceleyin:
  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. Uygulamayı çalıştırın.
Bu senaryoda, aşağıdakine benzer bir hata iletisi alırsınız:
System.NullReferenceException: nesne başvurusu bir nesnenin örneğine ayarlanmadı. System.Data.DataView.IsOriginalVersion (ınt32 dizin) System.Data.DataRowView.get_Item (ınt32 ndx) Test.Main() c:\Work\bugs\newbug1\Test.cs:line 42'de en altında
Bu soruna geçici bir çözüm bulmak için <a0></a0>, bir ListChanged olay yazma işlemleri gerçekleştirmeyin. Yerine ListChanged olay RowChanged olay kullanmak daha uygundur.

Sorun 2: Bir <a0>deyim</a0> sütununda hesaplanmış değerleri doğru güncelleştirilmeyebilir

Bir <a0>DataSet</a0> nesnesindeki bir ifade sütun değerlerini hesaplamak üzere deneyin ve ifade sütununun bir ilişkinin bir parçası olduğunda <a0>ifade</a0> sütunun hesaplanmış değerleri doğru güncelleştirilmeyebilir. Örneğin, şu senaryoyu inceleyin:
  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. Uygulamayı çalıştırın.
Bu senaryoda, aşağıdaki çıktıyı alırsınız: <a1>
<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>
Bu çıktıda yanlış değeri 0, 1 ilk T2 öğe NumberOfReports öğe içerir.

Sorun 3: DataTable.Select yöntemi adlı birden fazla ifadeleri kullanarak, hatalı bir sonuç döndürülebilir

Birden çok ekstrelerine ilişkin verileri almak için AND yan tümcesi ile birlikte bir DataTable nesnesinin <a2>Seç</a2> yöntemi kullandığınızda, Select yönteminin hatalı bir sonuç döndürebilir. Örneğin, aşağıdaki kod, hatalı bir sonuç döndürür:
string filter = "(NOT ColTwo = 1) AND (ColOne = 2)";
DataTable.Select(filter);
ancak, aşağıdaki kod doğru sonucu verir:
string filter = "NOT ColTwo = 1 AND ColOne = 2";
DataTable.Select(filter);
ayrıca aşağıdaki senaryoyu düşünün:
  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. Uygulamayı çalıştırın.
In this scenario, you receive the following output:
query="(NOT ColTwo = 1) AND (ColOne = 2)" count=2
        3, 2, 1
        4, 2, 2
query="(ColOne = 2) AND (NOT ColTwo = 1)" count=1
        4, 2, 2
query="NOT ColTwo = 1 AND ColOne = 2" count=1
        4, 2, 2
query="ColOne = 2 AND NOT ColTwo = 1" count=1
        4, 2, 2
query="NOT ColTwo = 1 AND (ColOne = 2)" count=2
        3, 2, 1
        4, 2, 2
query="(ColOne = 2) AND NOT ColTwo = 1" count=1
        4, 2, 2
query="(NOT ColTwo = 1) AND ColOne = 2" count=1
        4, 2, 2
query="ColOne = 2 AND (NOT ColTwo = 1)" count=1
        4, 2, 2
In this output, "(ColOne = 2)" is incorrectly displayed on the right side of an AND clause.

4. Sorun: Bir DataTable'nın iç dizini bozulabilir ve bir '13' hata iletisi alıyorsunuz

DataSet nesne tarafından kullanılan iç dizin değerleriyle, DataTable nesne tarafından kullanılan bir DataSet nesnesinin AcceptChanges yöntemi kullanmaya ve AcceptRule.Cascade için ForeignKey kural kümesi bozulabilir. Bu sorun, aşağıdaki koşullar geçerli olursa oluşur:
  • DataSet nesnesi, bir-çok ilişkisi olan bir veya daha fazla tablo içeriyor.
  • <a0>DataSet</a0> nesnesinin AcceptChanges yöntemi ça?r?l?r.
  • DataSet nesnesinin AcceptRejectRule değeri için bir ardarda ayarlanır. Bu değer için bir ardarda ayarladığınızda, bunu otomatik olarak veri kabul eder veya veri reddeder alt tablo değiştirilir, böylece.
Örneğin, şu senaryoyu inceleyin:
  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. Uygulamayı çalıştırın.
Bu senaryoda, aşağıdaki hata iletisini alırsınız:
DataTable iç dizin bozuluyor: '13'.

Sorun 5: bir birleştirme işlemi oluştuğunda, hedef satırdaki düzenleme durumunda ise kayıt yöneticisi bozulabilir

Bir DataTable nesnesindeki bir veya daha çok satır düzenlenmekte olan ve bir DataTable.Merge işlemi gerçekleşir veya DataSet.Merge bir işlem oluşur, DataTable nesne <a1>DataSet</a1> nesnesi için kayıt yöneticisi bozulabilir.

Not Bir DataTable nesnesindeki bir satır düzenlenirken, satırın DataRowVersion değeri önerilen olarak ayarlanır.

Örneğin, şu senaryoyu inceleyin:
  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. Uygulamayı çalıştırın.
Bu senaryoda, DataTable nesne <a1>DataSet</a1> nesnesi için kayıt yöneticisi bozuk.

Bu soruna geçici bir çözüm bulmak için <a0></a0>, hedef DataSet nesnesinde, DataTable.Merge yöntemini veya DataSet.Merge yöntemini kullanmadan önce önerilen DataRowVersion değeri ayarlanmış olan satır bulunduğundan emin olun.

Sorun 6: Bir DataTable nesnesinin iç dizini bozulabilir ve bir '5' hata iletisi alıyorsunuz

Aşağıdaki senaryolarda, DataTable nesnenin iç dizinleri güncelleştirmeden DataTable nesnesindeki verilerin değiştirerek, bir DataTable nesnesinde bozulmasına neden:
  1. Hiçbir ifade bir ifadeden DataColumn.Expression değeri değiştirildi. Bu senaryoda, DataColumn nesnesindeki tüm verilerin DBNull için ayarlanır.
  2. DataTable.Clear yöntemi ça?r?ld???nda DataTable nesnesindeki tüm verilerin kaldırıldı ve dizinler güncelleştirildi. Ancak, DataTable nesnesine başvuru yapan diğer tablolar güncelleştirilmedi.
Örneğin, şu senaryoyu inceleyin:
  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. Uygulamayı çalıştırın.
Bu senaryoda, aşağıdaki hata iletisini alırsınız:
DataTable iç dizin bozuluyor: '5'.
Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
824684Microsoft yazılım güncelleştirmelerini açıklamak için kullanılan standart terminolojinin açıklaması

Özellikler

Makale numarası: 932491 - Last Review: 3 Aralık 2007 Pazartesi - Gözden geçirme: 1.8
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft .NET Framework 2.0
Anahtar Kelimeler: 
kbmt kbfix kbbug kbprb kbexpertiseinter kbexpertisebeginner kbqfe kbpubtypekc KB932491 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:932491

Geri Bildirim Ver

 

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