FIX、System.Data オブジェクトを使用して、コンポーネントに関連付けられているデータは Microsoft.NET Framework 2.0 でビルドされたアプリケーションで破損することが

文書翻訳 文書翻訳
文書番号: 932491 - 対象製品
すべて展開する | すべて折りたたむ

現象

Microsoft.NET Framework 2.0 でビルドされたアプリケーションでは、コンポーネントを使用すると、コンポーネントに関連付けられているデータが破損する可能性があります。コンポーネントはSystem.Data.DataSetオブジェクトを使用する場合は、この問題が発生します。この問題が発生すると、1 つまたは複数次の問題が発生する可能性があります。
  • DataView クラスの AcceptChanges メソッドが呼び出されたときに、レコード マネージャーが壊れた可能性があります。
  • 式列の計算値が正しく更新されません。
  • 複数のステートメントを使用して、 DataTable.Selectメソッドを呼び出すと、誤った結果が返されます。
  • DataTableオブジェクトの内部インデックスが破損している可能性があります。さらに、'13' エラー メッセージが表示されます。
  • マージ操作が発生する際、対象の行が編集状態にあると、レコード マネージャーが破損する可能性があります。
  • DataTableオブジェクトの内部インデックスが破損している可能性があります。さらに、'5' のエラー メッセージが表示されます。

解決方法

修正プログラムの情報



サポートされている修正プログラムをマイクロソフトから入手することができます。ただし、この修正プログラムはこの資料に記載されている問題のみを修正するものです。この修正プログラムはこの問題が発生しているシステムにのみ適用して下さい。この修正プログラムには、さらに追加テストが行われる可能性があります。したがって、この問題により深刻な影響を受けていない場合は、この修正プログラムを含む次のソフトウェア更新プログラムのリリースを待つことをお勧めします。

この修正プログラムを、MSDN コード ギャラリーからダウンロードするには、次のマイクロソフト Web サイトを参照してください。
http://code.msdn.microsoft.com/KB932491

MSDN コード ギャラリーは、修正プログラムを利用可能な言語を表示します。お使いの言語が表示されない場合は、Code Gallery リソース ページが、その言語に対応していません。

その他の問題が発生した場合、またはトラブルシューティングが必要な場合は、別のサービス リクエストを作成する必要があります。追加の質問およびこの特定の修正プログラムの対象とならない問題については、通常のサポート料金が適用されます。マイクロソフト カスタマー サービス & サポートの電話番号の一覧または別のサービス リクエストを作成するには、次のマイクロソフト Web サイトを参照してください。
http://support.microsoft.com/contactus/?ws=support

前提条件

この修正プログラムをインストールするための前提条件はありません。

再起動の必要性

この修正プログラムの適用後、コンピューターを再起動する必要はありません。

修正プログラムの置き換えに関する情報

この修正プログラムが、他のいかなる修正プログラムも置き換えることはありません。

ファイル情報

この修正プログラムの英語版のファイル属性 (またはそれ以降のファイル属性) を、次の表に一覧表示します。これらのファイルの日付と時刻は世界協定時刻 (UTC) で表示されます。ファイルの情報を表示するはローカル時刻に変換されます。UTC とローカル時刻との時差を確認するのを使用して、 タイム ゾーン タブには 日付と時刻 コントロール パネルの項目。
X86 ベースのコンピューターの場合
元に戻す全体を表示する
ファイル名ファイル バージョンファイル サイズ日付時間プラットフォーム
Mscordacwks.dll2.0.50727.802802,3042007 年 2 月 03 日11:22x86
Mscorjit.dll2.0.50727.802326,6562007 年 2 月 03 日11:22x86
Mscorlib.dll2.0.50727.8024,308,9922007 年 2 月 03 日11:22x86
Mscorpe.dll2.0.50727.802102,9122007 年 2 月 03 日11:22x86
Mscorwks.dll2.0.50727.8025,625,3442007 年 2 月 03 日11:21x86
Normalization.dll2.0.50727.80215,3602007 年 2 月 03 日11:22x86
Normidna.nlp該当なし59,3422007 年 2 月 03 日11:22該当なし
Normnfc.nlp該当なし45,7942007 年 2 月 03 日11:22該当なし
Normnfd.nlp該当なし39,2842007 年 2 月 03 日11:22該当なし
Normnfkc.nlp該当なし66,3842007 年 2 月 03 日11:22該当なし
Normnfkd.nlp該当なし60,2942007 年 2 月 03 日11:22該当なし
Peverify.dll2.0.50727.802136,1922007 年 2 月 03 日11:21x86
Sos.dll2.0.50727.802382,4642007 年 2 月 03 日11:22x86
System.data.dll2.0.50727.8022,902,0162007 年 2 月 03 日11:22x86
System.data.oracleclient.dll2.0.50727.802482,3042007 年 2 月 03 日11:22x86
Vsavb7rt.dll8.0.50727.8021,330,6882007 年 2 月 03 日11:21x86
X64 ベースのコンピューターの場合
元に戻す全体を表示する
ファイル名ファイル バージョンファイル サイズ日付時間プラットフォーム
Mscordacwks.dll2.0.50727.8021,597,4402007 年 2 月 03 日03:14x64
Mscordacwks.dll2.0.50727.802802,3042007 年 2 月 03 日11:22x86
Mscorjit.dll2.0.50727.8021,587,7122007 年 2 月 03 日03:13x64
Mscorjit.dll2.0.50727.802326,6562007 年 2 月 03 日11:22x86
Mscorlib.dll2.0.50727.8023,960,8322007 年 2 月 03 日06:28x64
Mscorlib.dll2.0.50727.8024,308,9922007 年 2 月 03 日11:22x86
Mscorpe.dll2.0.50727.802157,1842007 年 2 月 03 日03:07x64
Mscorpe.dll2.0.50727.802102,9122007 年 2 月 03 日11:22x86
Mscorpjt.dll2.0.50727.8022,004,9922007 年 2 月 03 日03:13x64
Normalization.dll2.0.50727.80218,4322007 年 2 月 03 日03:12x64
Normalization.dll2.0.50727.80215,3602007 年 2 月 03 日11:22x86
Normidna.nlp該当なし59,3422007 年 2 月 03 日03:14該当なし
Normidna.nlp該当なし59,3422007 年 2 月 03 日11:22該当なし
Normnfc.nlp該当なし45,7942007 年 2 月 03 日03:14該当なし
Normnfc.nlp該当なし45,7942007 年 2 月 03 日11:22該当なし
Normnfd.nlp該当なし39,2842007 年 2 月 03 日03:14該当なし
Normnfd.nlp該当なし39,2842007 年 2 月 03 日11:22該当なし
Normnfkc.nlp該当なし66,3842007 年 2 月 03 日03:14該当なし
Normnfkc.nlp該当なし66,3842007 年 2 月 03 日11:22該当なし
Normnfkd.nlp該当なし60,2942007 年 2 月 03 日03:14該当なし
Normnfkd.nlp該当なし60,2942007 年 2 月 03 日11:22該当なし
Peverify.dll2.0.50727.802136,1922007 年 2 月 03 日11:21x86
Peverify.nlp2.0.50727.802205,8242007 年 2 月 03 日03:13該当なし
Sos.dll2.0.50727.802480,7682007 年 2 月 03 日03:22x64
Sos.dll2.0.50727.802382,4642007 年 2 月 03 日11:22x86
System.data.dll2.0.50727.8022,967,0402007 年 2 月 03 日06:28x64
System.data.dll2.0.50727.8022,902,0162007 年 2 月 03 日11:22x86
System.data.oracleclient.dll2.0.50727.802498,6882007 年 2 月 03 日06:28x64
System.data.oracleclient.dll2.0.50727.802482,3042007 年 2 月 03 日11:22x86
Mscorwks.dll2.0.50727.80210,323,4562007 年 2 月 03 日03:11x64
Mscorwks.dll2.0.50727.8025,625,3442007 年 2 月 03 日11:21x86
Vsavb7rt.dll8.0.50727.8021,330,6882007 年 2 月 03 日11:21x86
Itanium ベースのコンピューターの場合
元に戻す全体を表示する
ファイル名ファイル バージョンファイル サイズ日付時間プラットフォーム
Mscordacwks.dll2.0.50727.8022,719,2322007 年 2 月 03 日03:15IA-64
Mscordacwks.dll2.0.50727.802802,3042007 年 2 月 03 日11:22x86
Mscorjit.dll2.0.50727.8022,705,9202007 年 2 月 03 日03:13IA-64
Mscorjit.dll2.0.50727.802326,6562007 年 2 月 03 日11:22x86
Mscorlib.dll2.0.50727.8023,960,8322007 年 2 月 03 日06:42IA-64
Mscorlib.dll2.0.50727.8024,308,9922007 年 2 月 03 日11:22x86
Mscorpe.dll2.0.50727.802313,8562007 年 2 月 03 日03:06IA-64
Mscorpe.dll2.0.50727.802102,9122007 年 2 月 03 日11:22x86
Mscorpjt.dll2.0.50727.8023,501,0562007 年 2 月 03 日03:14IA-64
Normalization.dll2.0.50727.80215,3602007 年 2 月 03 日11:22x86
Normalization.dll2.0.50727.80244,0322007 年 2 月 03 日03:12IA-64
Fl_normidna.nlp該当なし59,3422007 年 2 月 03 日11:22該当なし
Normidna.nlp該当なし59,3422007 年 2 月 03 日03:14該当なし
Normnfc.nlp該当なし45,7942007 年 2 月 03 日11:22該当なし
Normnfc.nlp該当なし45,7942007 年 2 月 03 日03:14該当なし
Normnfd.nlp該当なし39,2842007 年 2 月 03 日11:22該当なし
Normnfd.nlp該当なし39,2842007 年 2 月 03 日03:14該当なし
Normnfkc.nlp該当なし66,3842007 年 2 月 03 日11:22該当なし
Normnfkc.nlp該当なし66,3842007 年 2 月 03 日03:14該当なし
Normnfkd.nlp該当なし60,2942007 年 2 月 03 日11:22該当なし
Normnfkd.nlp該当なし60,2942007 年 2 月 03 日03:14該当なし
Peverify.dll2.0.50727.802136,1922007 年 2 月 03 日11:21x86
Peverify.dll2.0.50727.802383,4882007 年 2 月 03 日03:13IA-64
Sos.dll2.0.50727.802382,4642007 年 2 月 03 日11:22x86
Sos.dll2.0.50727.802862,7202007 年 2 月 03 日03:23IA-64
System.data.dll2.0.50727.8022,902,0162007 年 2 月 03 日11:22x86
System.data.dll2.0.50727.8023,109,8882007 年 2 月 03 日06:42IA-64
System.data.oracleclient.dll2.0.50727.802482,3042007 年 2 月 03 日11:22x86
System.data.oracleclient.dll2.0.50727.802501,7602007 年 2 月 03 日06:42IA-64
Mscorwks.dll2.0.50727.8025,625,3442007 年 2 月 03 日11:21x86
Mscorwks.dll2.0.50727.80221,309,9522007 年 2 月 03 日03:11IA-64
Vsavb7rt.dll8.0.50727.8021,330,6882007 年 2 月 03 日11:21x86

状況

マイクロソフトでは、この問題をこの資料の「対象製品」として記載されているマイクロソフト製品の問題として認識しています。

詳細

問題 1: は、DataView クラスでの AcceptChanges メソッドを呼び出すと、レコード マネージャー破損可能性があります。

レコード マネージャー破損イベント ハンドラーから書き込み操作中に発生します。この現象が発生する場合は、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: 式列の計算値が正しく更新されません。

DataSetオブジェクト内の式列の値を計算する式列がリレーションシップの一部であるときは、[式] 列の値を計算を正しく更新できません可能性があります。たとえば、次のシナリオを検討してください。
  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>
この出力では、T2 の最初の要素内のNumberOfReports要素に 0 1 の代わりに不適切な値が含まれます。

問題 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. アプリケーションでは、次のコードを使用します。
    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' エラー メッセージが表示されます。

DataTableオブジェクトによって、使用されるデータセットオブジェクトのAcceptChangesメソッドを使用しようとしてAcceptRule.Cascadeするには、不変の規則を設定すると、 DataSetオブジェクトによって使用される内部のインデックスの値が破損する可能性があります。次の条件に該当する場合この問題が発生します。
  • DataSetオブジェクトには、一対多のリレーションシップがある 1 つ以上のテーブルが含まれています。
  • DataSetオブジェクトのAcceptChangesメソッドが呼び出されます。
  • AcceptRejectRuleの値は、 DataSetオブジェクトを重ねて表示する設定されます。この値は 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. アプリケーションを実行します。
このシナリオでは、次のエラー メッセージが表示されます。
あるデータ テーブルの内部インデックスが破損している: '13'。

問題 5: マージ操作が発生すると、対象の行が編集状態である場合は、レコード マネージャー破損します。

DataTableオブジェクト内の 1 つ以上の行が変更されていますとDataTable.Mergeの操作が発生するまたはDataSet.Mergeの操作が発生した場合は、レコード マネージャーは、 DataSetオブジェクト、 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. アプリケーションを実行します。
このシナリオでは、 DataSetオブジェクト、 DataTableオブジェクトの [レコード マネージャーが壊れています。

この問題を回避するには、 DataTable.Mergeメソッド、またはMergeメソッドを使用する前に、仮予約を保持する方法 DataRowVersionの値セットを持つ対象のDataSetオブジェクト内の行がないことを確認します。

問題 6: は、DataTable オブジェクトの内部インデックスが破損することがありますと '5' のエラー メッセージが表示されます。

次のシナリオは、 DataTableオブジェクトにはDataTableオブジェクトの内部インデックスが更新されず、 DataTableオブジェクト内のデータを変更することによって破損します。
  1. DataColumn.Expression値から式で指定なしのように変更されます。このシナリオでは、 DataColumnオブジェクト内のすべてのデータが DBNull に設定します。
  2. DataTable.Clearメソッドが呼び出されると、 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. アプリケーションを実行します。
このシナリオでは、次のエラー メッセージが表示されます。
あるデータ テーブルの内部インデックスが破損している: '5'。
詳細については、以下の記事番号をクリックして、マイクロソフト サポート技術情報資料を参照してください。
824684マイクロソフト ソフトウェア更新プログラムの説明で使用される一般的な用語の説明

プロパティ

文書番号: 932491 - 最終更新日: 2013年4月7日 - リビジョン: 5.0
この資料は以下の製品について記述したものです。
  • Microsoft .NET Framework 2.0
キーワード:?
kbfix kbbug kbprb kbexpertiseinter kbexpertisebeginner kbqfe kbmt KB932491 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:932491
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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