DetailPage-MSS-KB

기술 자료

기술 자료: 932491 - 마지막 검토: 2007년 12월 3일 월요일 - 수정: 1.8

 

현상

Microsoft .NET Framework 2.0이 빌드된 응용 프로그램의 구성 요소를 사용하려고 하면 구성 요소와 관련된 데이터가 손상될 수 있습니다. System.Data.DataSet 개체 구성 요소를 사용하는 경우 이 문제가 발생합니다. 이 문제가 발생하면 다음 문제 중 하나 이상이 발생할 수 있습니다.
  • DataView 클래스에서 AcceptChanges 메서드를 호출할 때 레코드 관리자가 손상될 수 있습니다.
  • 식 열에서 계산된 값은 올바르게 업데이트되지 않을 수 있습니다.
  • 여러 개의 문을 사용하여 DataTable.Select 메서드를 호출할 때 잘못된 결과를 반환할 수 있습니다.
  • DataTable 개체의 내부 인덱스 손상될 수 있습니다. 또한 '13' 오류 메시지가 나타납니다.
  • 병합 작업이 발생할 때 대상 행을 편집 상태에 있으면 레코드 관리자 손상될 수 있습니다.
  • DataTable 개체의 내부 인덱스 손상될 수 있습니다. 또한 '5' 오류 메시지가 나타납니다.

해결 방법

핫픽스 정보



Microsoft에서 제공하는 핫픽스를 사용할 수 있습니다. 그러나 이 핫픽스는 이 문서에서 설명된 문제만 해결할 수 있습니다. 이 문서에 설명된 특정 문제가 발생한 시스템에만 이 핫픽스를 적용하십시오. 추후에 이 핫픽스를 테스트할 수 있습니다. 따라서 이 문제로 심각하게 영향을 받은 경우를 제외하곤 이 핫픽스가 포함된 다음 소프트웨어 업데이트까지 기다리는 것이 좋습니다.

이 핫픽스를 MSDN 코드 갤러리 다운로드하려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://code.msdn.microsoft.com/KB932491 (http://code.msdn.microsoft.com/KB932491)

참고 MSDN 코드 갤러리 핫픽스를 사용할 수 있는 언어가 표시됩니다. 나열된 사용자 언어가 표시되지 않으면 해당 언어로 코드 갤러리 리소스 페이지를 사용할 수 없습니다 때문입니다.

참고 추가적인 문제가 발생할 경우 또는 모든 문제 해결에 필요한 경우 별도의 서비스 요청을 만들어야 할 수도 있습니다. 핫픽스에 적용되지 않는 추가 지원 질문과 문제에는 일반 지원 비용이 적용됩니다. Microsoft 고객 서비스 지원 전화 번호 전체 목록 또는 별도의 서비스 요청을 만들려면 다음 Microsoft 웹 사이트로 이동하십시오:
http://support.microsoft.com/contactus/?ws=support (http://support.microsoft.com/contactus/?ws=support)

전제 조건

이 핫픽스 설치를 위한 전제 있습니다.

재시작 요구 사항

이 핫픽스를 적용한 후에는 컴퓨터를 다시 시작할 필요가 없습니다.

핫픽스 대체 정보

이 핫픽스는 다른 핫픽스를 대체하지 않습니다.

파일 정보

이 핫픽스의 영어 버전은 다음 표에 나열된 파일 특성(또는 그 이후의 파일 특성)이 있습니다. 이러한 파일의 시간과 날짜는 UTC (협정 세계시) 로 나열됩니다. 파일 정보에서는 현지 시간으로 변환됩니다. UTC와 로컬 시간의 차이를 알려면 제어판의 날짜 및 시간 항목에서 표준 시간대 탭을 사용하십시오.
대해 x 86 기반 컴퓨터
표 축소표 확대
파일 이름파일 버전파일 크기날짜시간플랫폼
Mscordacwks.dll2.0.50727.802802,3042007-Feb-0311: 22x 86
Mscorjit.dll2.0.50727.802326,6562007-Feb-0311: 22x 86
Mscorlib.dll2.0.50727.8024,308,9922007-Feb-0311: 22x 86
Mscorpe.dll2.0.50727.802102,9122007-Feb-0311: 22x 86
Mscorwks.dll2.0.50727.8025,625,3442007-Feb-0311: 21x 86
Normalization.dll2.0.50727.80215,3602007-Feb-0311: 22x 86
Normidna.nlp적용할 수 없습니다.59,3422007-Feb-0311: 22적용할 수 없습니다.
Normnfc.nlp적용할 수 없습니다.45,7942007-Feb-0311: 22적용할 수 없습니다.
Normnfd.nlp적용할 수 없습니다.39,2842007-Feb-0311: 22적용할 수 없습니다.
Normnfkc.nlp적용할 수 없습니다.66,3842007-Feb-0311: 22적용할 수 없습니다.
Normnfkd.nlp적용할 수 없습니다.60,2942007-Feb-0311: 22적용할 수 없습니다.
Peverify.dll2.0.50727.802136,1922007-Feb-0311: 21x 86
Sos.dll2.0.50727.802382,4642007-Feb-0311: 22x 86
System.data.dll2.0.50727.8022,902,0162007-Feb-0311: 22x 86
System.data.oracleclient.dll2.0.50727.802482,3042007-Feb-0311: 22x 86
Vsavb7rt.dll8.0.50727.8021,330,6882007-Feb-0311: 21x 86
대해 x 64 기반 컴퓨터
표 축소표 확대
파일 이름파일 버전파일 크기날짜시간플랫폼
Mscordacwks.dll2.0.50727.8021,597,4402007-Feb-0303: 14x 64
Mscordacwks.dll2.0.50727.802802,3042007-Feb-0311: 22x 86
Mscorjit.dll2.0.50727.8021,587,7122007-Feb-0303: 13x 64
Mscorjit.dll2.0.50727.802326,6562007-Feb-0311: 22x 86
Mscorlib.dll2.0.50727.8023,960,8322007-Feb-0306: 28x 64
Mscorlib.dll2.0.50727.8024,308,9922007-Feb-0311: 22x 86
Mscorpe.dll2.0.50727.802157,1842007-Feb-0303: 07x 64
Mscorpe.dll2.0.50727.802102,9122007-Feb-0311: 22x 86
Mscorpjt.dll2.0.50727.8022,004,9922007-Feb-0303: 13x 64
Normalization.dll2.0.50727.80218,4322007-Feb-0303: 12x 64
Normalization.dll2.0.50727.80215,3602007-Feb-0311: 22x 86
Normidna.nlp적용할 수 없습니다.59,3422007-Feb-0303: 14적용할 수 없습니다.
Normidna.nlp적용할 수 없습니다.59,3422007-Feb-0311: 22적용할 수 없습니다.
Normnfc.nlp적용할 수 없습니다.45,7942007-Feb-0303: 14적용할 수 없습니다.
Normnfc.nlp적용할 수 없습니다.45,7942007-Feb-0311: 22적용할 수 없습니다.
Normnfd.nlp적용할 수 없습니다.39,2842007-Feb-0303: 14적용할 수 없습니다.
Normnfd.nlp적용할 수 없습니다.39,2842007-Feb-0311: 22적용할 수 없습니다.
Normnfkc.nlp적용할 수 없습니다.66,3842007-Feb-0303: 14적용할 수 없습니다.
Normnfkc.nlp적용할 수 없습니다.66,3842007-Feb-0311: 22적용할 수 없습니다.
Normnfkd.nlp적용할 수 없습니다.60,2942007-Feb-0303: 14적용할 수 없습니다.
Normnfkd.nlp적용할 수 없습니다.60,2942007-Feb-0311: 22적용할 수 없습니다.
Peverify.dll2.0.50727.802136,1922007-Feb-0311: 21x 86
Peverify.nlp2.0.50727.802205,8242007-Feb-0303: 13적용할 수 없습니다.
Sos.dll2.0.50727.802480,7682007-Feb-0303: 22x 64
Sos.dll2.0.50727.802382,4642007-Feb-0311: 22x 86
System.data.dll2.0.50727.8022,967,0402007-Feb-0306: 28x 64
System.data.dll2.0.50727.8022,902,0162007-Feb-0311: 22x 86
System.data.oracleclient.dll2.0.50727.802498,6882007-Feb-0306: 28x 64
System.data.oracleclient.dll2.0.50727.802482,3042007-Feb-0311: 22x 86
Mscorwks.dll2.0.50727.80210,323,4562007-Feb-0303: 11x 64
Mscorwks.dll2.0.50727.8025,625,3442007-Feb-0311: 21x 86
Vsavb7rt.dll8.0.50727.8021,330,6882007-Feb-0311: 21x 86
Itanium 기반 컴퓨터
표 축소표 확대
파일 이름파일 버전파일 크기날짜시간플랫폼
Mscordacwks.dll2.0.50727.8022,719,2322007-Feb-0303: 15IA-64
Mscordacwks.dll2.0.50727.802802,3042007-Feb-0311: 22x 86
Mscorjit.dll2.0.50727.8022,705,9202007-Feb-0303: 13IA-64
Mscorjit.dll2.0.50727.802326,6562007-Feb-0311: 22x 86
Mscorlib.dll2.0.50727.8023,960,8322007-Feb-0306: 42IA-64
Mscorlib.dll2.0.50727.8024,308,9922007-Feb-0311: 22x 86
Mscorpe.dll2.0.50727.802313,8562007-Feb-0303: 06IA-64
Mscorpe.dll2.0.50727.802102,9122007-Feb-0311: 22x 86
Mscorpjt.dll2.0.50727.8023,501,0562007-Feb-0303: 14IA-64
Normalization.dll2.0.50727.80215,3602007-Feb-0311: 22x 86
Normalization.dll2.0.50727.80244,0322007-Feb-0303: 12IA-64
Fl_normidna.nlp적용할 수 없습니다.59,3422007-Feb-0311: 22적용할 수 없습니다.
Normidna.nlp적용할 수 없습니다.59,3422007-Feb-0303: 14적용할 수 없습니다.
Normnfc.nlp적용할 수 없습니다.45,7942007-Feb-0311: 22적용할 수 없습니다.
Normnfc.nlp적용할 수 없습니다.45,7942007-Feb-0303: 14적용할 수 없습니다.
Normnfd.nlp적용할 수 없습니다.39,2842007-Feb-0311: 22적용할 수 없습니다.
Normnfd.nlp적용할 수 없습니다.39,2842007-Feb-0303: 14적용할 수 없습니다.
Normnfkc.nlp적용할 수 없습니다.66,3842007-Feb-0311: 22적용할 수 없습니다.
Normnfkc.nlp적용할 수 없습니다.66,3842007-Feb-0303: 14적용할 수 없습니다.
Normnfkd.nlp적용할 수 없습니다.60,2942007-Feb-0311: 22적용할 수 없습니다.
Normnfkd.nlp적용할 수 없습니다.60,2942007-Feb-0303: 14적용할 수 없습니다.
Peverify.dll2.0.50727.802136,1922007-Feb-0311: 21x 86
Peverify.dll2.0.50727.802383,4882007-Feb-0303: 13IA-64
Sos.dll2.0.50727.802382,4642007-Feb-0311: 22x 86
Sos.dll2.0.50727.802862,7202007-Feb-0303: 23IA-64
System.data.dll2.0.50727.8022,902,0162007-Feb-0311: 22x 86
System.data.dll2.0.50727.8023,109,8882007-Feb-0306: 42IA-64
System.data.oracleclient.dll2.0.50727.802482,3042007-Feb-0311: 22x 86
System.data.oracleclient.dll2.0.50727.802501,7602007-Feb-0306: 42IA-64
Mscorwks.dll2.0.50727.8025,625,3442007-Feb-0311: 21x 86
Mscorwks.dll2.0.50727.80221,309,9522007-Feb-0303: 11IA-64
Vsavb7rt.dll8.0.50727.8021,330,6882007-Feb-0311: 21x 86

현재 상태

Microsoft는 "본 문서의 정보는 다음의 제품에 적용됩니다." 절에 나열된 Microsoft 제품에서 이 문제를 확인했습니다.

추가 정보

문제 1: DataView 클래스에서 AcceptChanges 메서드를 호출할 때 레코드 관리자가 손상될 수 있다

이벤트 처리기에서 쓰기 작업을 수행하는 동안 레코드 관리자 손상이 발생할 수 있습니다. 이 때 System.NullreferenceException 예외가 발생할 수 있습니다. 또한 응용 프로그램이 ListChanged 이벤트에서 쓰기 작업을 수행하면 인덱스 업데이트가 잘못된 순서로 발생할 수 있습니다.

예를 들어, 다음 시나리오를 고려하십시오.
  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. 응용 프로그램을 실행합니다.
이 시나리오에서는 다음 오류 메시지와 유사한 오류 메시지가 나타납니다.
System.NullReferenceException: 개체 참조가 개체의 인스턴스로 설정되지 않습니다. System.Data.DataView.IsOriginalVersion 때 (Int32 인덱스) 42 c:\Work\bugs\newbug1\Test.cs:line Test.Main() 때 (Int32 ndx) System.Data.DataRowView.get_Item 때
이 문제를 해결하려면 ListChanged 이벤트에서 쓰기 작업을 수행하지 마십시오. RowChanged 이벤트 대신 ListChanged 이벤트를 사용하는 것이 가장 좋습니다.

문제 2: 식 열에서 계산된 값이 제대로 업데이트되지 않을 수 있습니다.

DataSet 개체 식 열에서 값을 계산하는 시도할 및 관계의 일부인 식 열이 있는 경우 식 열에 계산된 값은 올바르게 업데이트되지 않을 수 있습니다. 예를 들어, 다음 시나리오를 고려하십시오.
  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. 응용 프로그램을 실행합니다.
이 시나리오에서는 다음과 같은 출력이 나타납니다:
<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>
이 출력 잘못된 값 1 대신 0 첫째 T2 요소에 NumberOfReports 요소를 포함합니다.

문제 3: 여러 개의 문을 사용하여 DataTable.Select 메서드를 호출할 때 잘못된 결과를 반환할 수 있습니다.

AND 절 함께 사용하여 DataTable 개체의 Select 메서드를 사용하여 여러 개의 문을 데이터를 검색할 때 Select 메서드가 잘못된 결과를 반환할 수 있습니다. 예를 들어, 다음 코드는 잘못된 결과를 반환합니다:
string filter = "(NOT ColTwo = 1) AND (ColOne = 2)";
DataTable.Select(filter);
그러나 다음 코드는 올바른 결과를 반환합니다:
string filter = "NOT ColTwo = 1 AND ColOne = 2";
DataTable.Select(filter);
또한 다음과 같은 시나리오를 생각해 보십시오:
  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. 응용 프로그램을 실행합니다.
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: DataTable 있는 내부 인덱스, 손상되어 '13' 오류 메시지가 나타난다

DataSet 개체에서 사용하는 내부 인덱스 값은 DataTable 개체에서 사용하는 DataSet 개체의 AcceptChanges 메서드를 사용하려고 하는 AcceptRule.Cascade ForeignKey 규칙을 설정할 때 손상될 수 있습니다. 다음 조건에 해당하면 이 문제가 발생합니다.
  • DataSet 개체를 한 일대다 관계가 하나 이상의 테이블이 들어 있습니다.
  • DataSet 개체의 AcceptChanges 메서드가 호출됩니다.
  • DataSet 개체의 AcceptRejectRule 값은 모두로 설정됩니다. 모두 위해 이 값을 설정할 때 이를 자동으로 데이터를 수락하거나 데이터를 거부할 수 있도록 자식 테이블에 변경됩니다.
예를 들어, 다음 시나리오를 고려하십시오.
  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. 응용 프로그램을 실행합니다.
이러한 경우 다음과 같은 오류 메시지가 나타납니다:
DataTable 내부 인덱스가 손상되었습니다: '13'.

문제 5: 병합 작업이 발생할 경우 대상 행을 편집 상태에 있으면 레코드 관리자 손상될 수 있다

DataTable.Merge 작업을 다음 발생하거나 DataSet.Merge 작업이 발생할 및 DataTable 개체에서 하나 이상의 행을 편집, DataTable 개체의 DataSet 개체에 대해 레코드 관리자 손상될 수 있습니다.

참고DataTable 개체를 행을 편집할 때 행의 DataRowVersion 값은 위한 임시가 설정됩니다.

예를 들어, 다음 시나리오를 고려하십시오.
  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. 응용 프로그램을 실행합니다.
이 시나리오에서는 DataTable 개체의 DataSet 개체에 대해 레코드 관리자가 손상되었습니다.

이 문제를 해결하려면 대상 DataSet 개체의 DataTable.Merge 메서드를 DataSet.Merge 메서드를 사용하여 먼저 임시 DataRowVersion 값을 집합에 있는 행이 있는지 확인해야 합니다.

문제 6: DataTable 개체의 있는 내부 인덱스, 손상되어 '5' 오류 메시지가 나타난다

다음 시나리오는 DataTable 개체에서 DataTable 개체의 내부 인덱스를 업데이트하지 않고 DataTable 개체에서 데이터를 변경하여 손상이:
  1. DataColumn.Expression 값은 식에서 식이 없는 변경됩니다. 이 시나리오에서는 DataColumn 개체의 모든 데이터는 DBNull로 설정됩니다.
  2. DataTable.Clear 메서드를 호출할 때 DataTable 개체 모든 데이터가 제거되고 인덱스가 업데이트됩니다. 그러나 DataTable 개체를 참조하는 다른 테이블은 업데이트되지 않습니다.
예를 들어, 다음 시나리오를 고려하십시오.
  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. 응용 프로그램을 실행합니다.
이러한 경우 다음과 같은 오류 메시지가 나타납니다:
DataTable 내부 인덱스가 손상되었습니다: '5'.
추가 정보는 다음 문서 번호를 클릭하여 Microsoft 기술 자료에서 확인하십시오:
824684  (http://support.microsoft.com/kb/824684/ ) Microsoft 소프트웨어 업데이트를 설명하는 데 사용되는 표준 용어에 대한 설명

본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft .NET Framework 2.0
키워드: 
kbmt kbfix kbbug kbprb kbexpertiseinter kbexpertisebeginner kbqfe kbpubtypekc KB932491 KbMtko
기계 번역된 문서기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.
공유
추가 지원 옵션
Microsoft Community 지원 포럼
직접 문의하기
Microsoft Certified Partner 찾기
Microsoft Store
소기업이 아닙니까?
다음에서 팔로우하십시오.