Reputation: 57
I 'm getting this error: An unhandled exception of type "System.NullReferenceException' occurred in DataReport.exe" in the linq query. Hereafter my code. Any idea how to handle this exception. Thanks.
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;
}
Upvotes: 0
Views: 914
Reputation: 19407
The error indicates one or more of the fields you are requesting are missing. This is probably due to either the data
object being null, or one of the Columns
missing.
Try adding something like the following lines of code
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;
This will ensure that the column values being loaded, exist or throws a more meaningful exceptions.
Upvotes: 1
Reputation: 14334
I traditionally use the null coellescing operator ??
to check for nulls in my collections and where
expressions to filter before selection, grouping or ordering
Upvotes: 0