NullReferenceException
is being thrown on a line on which all involved objects are valid. StackTrace
shows the line # is 432.
The code is
Here, Flags
and tempFlags
both are datatables. Data types of columns of both datatables are primitive (decimal, datetime, short). The application is a multithreaded application and the code snippet belongs to the thread function. Flags
is decalred at instance level i.e. shared to all threads while tempFlags
is declared inside the thread function.
Here at this particular instance of time the Flags
contains 1946 records and tempFlags
contains 1. So, why is this NullReferenceException ??
Edit # 1
ex.InnerException
null
ex.StackTrace
at System.Data.DataTable.RecordStateChanged(Int32 record1, DataViewRowState oldState1, DataViewRowState newState1, Int32 record2, DataViewRowState oldState2, DataViewRowState newState2)
at System.Data.DataTable.InsertRow(DataRow row, Int64 proposedID)
at System.Data.DataTable.MergeRow(DataRow row, DataRow targetRow, Boolean preserveChanges, Index idxSearch)
at System.Data.Merger.MergeTable(DataTable src, DataTable dst)
at System.Data.Merger.MergeTableData(DataTable src)
at System.Data.Merger.MergeTable(DataTable src)
at System.Data.DataTable.Merge(DataTable table, Boolean preserveChanges, MissingSchemaAction missingSchemaAction)
at System.Data.DataTable.Merge(DataTable table)
at [...].cs:line 432"
ex.Data
{System.Collections.ListDictionaryInternal}
[System.Collections.ListDictionaryInternal]: {System.Collections.ListDictionaryInternal}
IsFixedSize: false
IsReadOnly: false
Keys: {System.Collections.ListDictionaryInternal.NodeKeyValueCollection}
Values: {System.Collections.ListDictionaryInternal.NodeKeyValueCollection}
ex.Message
"Object reference not set to an instance of an object."
ex.Source
"System.Data"
Edit # 2
It looks the Merge statement is not thread safe as after putting line 432 inside a lock, the exception is gone, SO FAR.
Whenever you get NullReferenceException
from within the framework and you're multithreading, it's almost certainly a thread-safety issue where you are not applying locks where you should be.
Since it appears to be happening when inserting a new row, System.Data.DataTable.InsertRow(DataRow row, Int64 proposedID)
I would guess there is a constraint saying a field cannot be null. And you are trying to insert a null from the source table.
Or, there is a calculated column and one of the input columns is null.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With