0

linq クエリで、「DataReport.exe で System.NullReferenceException が発生しました」というエラーが発生しました。以下、私のコード。この例外を処理する方法。ありがとう。

private void btnFilterBy_Click(object sender, EventArgs e)
{
    var records = 
        from record in data.AsEnumerable()
        where (record.Field<string>(data.Columns[0].ColumnName).Contains(txtBC.Text) && 
               record.Field<string>(data.Columns[1].ColumnName).Contains(txtRM.Text) &&
               record.Field<string>(data.Columns[2].ColumnName).Contains(txtClient.Text) &&
               record.Field<string>(data.Columns[4].ColumnName).Contains(txtProduct.Text) &&
               record.Field<string>(data.Columns[7].ColumnName).Contains(txtSegment.Text) &&
               record.Field<string>(data.Columns[6].ColumnName).Contains(txtMonth.Text))
        select record;
    dataQuery = records.CopyToDataTable();
    dtGridPivot.DataSource = dataQuery;
}
4

2 に答える 2

1

このエラーは、要求している 1 つ以上のフィールドが欠落していることを示しています。これはおそらく、dataオブジェクトが null であるか、Columns欠落しているオブジェクトのいずれかが原因です。

次のコード行のようなものを追加してみてください

if (data == null)
   throw new InvalidOperationException("Data is null");

if (data.Columns.Count < 8)
   throw new InvalidOperationException("Invalid number of columns.");

// Casting as DataColumn - but cast as whatever is approperiate
if (data.Columns.Cast<DataColumn>().Any(x => x == null || x.ColumnName == null))
    throw new InvalidOperationException("Data values are missing or null.");


var records = 
    from record in data.AsEnumerable()
    where (record.Field<string>(data.Columns[0].ColumnName).Contains(txtBC.Text) && 
           record.Field<string>(data.Columns[1].ColumnName).Contains(txtRM.Text) &&
           record.Field<string>(data.Columns[2].ColumnName).Contains(txtClient.Text) &&
           record.Field<string>(data.Columns[4].ColumnName).Contains(txtProduct.Text) &&
           record.Field<string>(data.Columns[7].ColumnName).Contains(txtSegment.Text) &&
           record.Field<string>(data.Columns[6].ColumnName).Contains(txtMonth.Text))
    select record;
dataQuery = records.CopyToDataTable();
dtGridPivot.DataSource = dataQuery;

これにより、列の値が読み込まれるか、存在するか、より意味のある例外がスローされることが保証されます。

于 2013-09-10T14:20:33.810 に答える
0

私は伝統的に null coellescing 演算子??を使用して、コレクション内の null をチェックし、where式を選択、グループ化、または順序付けする前にフィルタリングします。

于 2013-09-10T14:16:24.057 に答える