0

次のコードを使用して、DataTable から別の DataTable オブジェクトに n 個の行を返しています。最初にデータテーブルのレコードがデータベースから取得されたときは正常に動作していますが、手動でデータテーブルにレコードを追加するとクラッシュし、メッセージにno rowsが表示されます。currentTable.DefaultView.ToTable().Rows.Cast<DataRow>()デバッグしたところ、 null 値が返されることがわかりました。DataTable オブジェクトから n レコードを選択する次のコードを作成しました

currentTable = currentTable.DefaultView.ToTable().Rows.Cast<DataRow>().Take(numberOfRecord).CopyToDataTable();

手動で DataTable を作成し、レコードが DataReader から DataTable に来るときに正常に動作すると、クラッシュする理由がわかりません。

次のコードを使用して DataTable を手動で作成しています

DataTable tblCurrent = new DataTable();
//For Adding columns
for (int i = 0; i < fieldCol.Length; i++)
   tblCurrent.Columns.Add(string.Format("Column{0}", i + 1));

//for adding rows.
for (int i = (count + globalClass.sourceConnectionInfo.RowsToSkip); i < lineRows.Length; i++)
{
   DataRow newRow = tblCurrent.NewRow();
   for (int j = 0; j < fieldCol.Length; j++)
      newRow[j] = fieldCol[j];
   tblCurrent.Rows.Add(newRow);
}


//Then for selecting n records
if (currentTable.Rows.Count > 0)
   tblCurrent = tblCurrent.DefaultView.ToTable().Rows.Cast<DataRow>().Take(numberOfRecord).CopyToDataTable();
4

1 に答える 1

0

次のコードスニペットを確認してください。エラーなしで正常に動作しています。

 void Main()
    {
    DataTable dt = new DataTable();
        if (dt.Columns.Count == 0)
                {
                    dt.Columns.Clear();
                    dt.Columns.AddRange(
                        new DataColumn[] 
                        {
                            new DataColumn("TStamp", typeof(DateTime)),
                            new DataColumn("C1", typeof(double)),
                            new DataColumn("C2", typeof(double)),
                            new DataColumn("C3", typeof(double))
                            //new DataColumn("Unit", typeof(string))
                        }
                        );
                }

                  Random ovValue = new Random();
                for (int i = 0; i < 10; i++)
                {
                    DataRow dnew = dt.NewRow();
                    dnew["TStamp"] = DateTime.Now.AddMonths(i);
                    dnew["C1"] = ovValue.Next(1, 100);
                    dnew["C2"] = ovValue.Next(1, 100);
                    dnew["C3"] = ovValue.Next(1, 100);
                    dt.Rows.Add(dnew);
                }
                try
                {
                int numberOfRecord = 100;
                int count = dt.Rows.Count;  
                if(numberOfRecord <= count)
                {
                dt = dt.DefaultView.ToTable().Rows.Cast<DataRow>().Take(numberOfRecord).CopyToDataTable();
                }
                else
                {
                /// No Erroe cause if you select more tested at LinqPad
                dt = dt.DefaultView.ToTable().Rows.Cast<DataRow>().Take(100).CopyToDataTable();
                }
                }
                catch(Exception ex)
                {
                Console.WriteLine("Error");
                }

     foreach(DataRow r in dt.Rows)
     {
     Console.WriteLine(r["TStamp"].ToString());
     }

    }

次のコードブロックを確認してください。これにより、データテーブルに行が作成されない可能性があります。dt.Rows.Clear();選択の前にコードブロックを入れると、エラーが発生します。

//for adding rows.
for (int i = (count + globalClass.sourceConnectionInfo.RowsToSkip); i < lineRows.Length; i++)
{
   DataRow newRow = tblCurrent.NewRow();
   for (int j = 0; j < fieldCol.Length; j++)
      newRow[j] = fieldCol[j];
   tblCurrent.Rows.Add(newRow);
}
于 2012-04-16T10:39:15.393 に答える