Почему FbDataAdapter генерирует исключение NullReferenceException после пакетного обновления в течение примерно минуты? - PullRequest
1 голос
/ 26 августа 2009

При обновлении DataTable с новыми строками 1850 года в FbDataAdapter я получаю исключение NullReferenceException во время выполнения.

Обычно удается вставить около 1200 записей, иногда больше, иногда меньше ...

Однако при пошаговом выполнении кода с помощью отладчика иногда вставляется весь набор записей, без проблем.

Я использую Firebird ADO.NET DataProvider v2.1.

Есть идеи? Спасибо!

StackTrace:

System.NullReferenceException was unhandled by user code   Message="Object reference not set to an instance of an object."   Source="FirebirdSql.Data.FirebirdClient" StackTrace:
       at FirebirdSql.Data.FirebirdClient.FbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
       at System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
       at System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
       at DBTools.MergeDB.DataAccess.DatabaseHelper.UpdateDataTable(Int32 connectionIndex, DataTable dataTable) in C:\Workspaces\DatabaseTools\Releases\Latest\Sources\DBTools\DBTools.MergeDB\DataAccess\DatabaseHelper.cs:line 74

InnerException:

Ответы [ 3 ]

2 голосов
/ 26 августа 2009

Я нашел эту тему: http://osdir.com/ml/db.firebird.dotnetprovider/2006-04/msg00058.html

, который может предложить решение.

Если это не сработает для вас, я предлагаю взять источник поставщика данных Firebird и заглянуть туда, чтобы выяснить, можете ли вы обнаружить проблему. Если нет, попробуйте добавить обработку ошибок (например, запись исключений в текстовый файл) в код Firebird, вызывающий проблему, затем скомпилируйте этот код и используйте его вместо текущего файла Firebird.Data.dll (или как он там называется). *

Если вы можете изолировать проблему, то можете связаться с разработчиками Firebird и сообщить им об этом ... или, что еще лучше, отправить исправление! Таким образом, вы получаете рабочий код и возвращаете что-то сообществу открытого кода.

0 голосов
/ 27 августа 2009

Спасибо за предложения!

После небольшого исследования я пришел к выводу, что исключение NullReferenceException было побочным эффектом фактического исключения. В основном обновление заняло слишком много времени и истекло около 60 секунд.

Я изменил строку подключения, чтобы разрешить транзакции (Enlist = true;), и добавил TransactionScope вокруг кода с тайм-аутом TimeSpan.MaxValue:

using (var scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
{
 ...
}

Это решило проблему ... Однако я собираюсь заглянуть в исходный код клиента Firebird, чтобы выяснить причину, по которой фактическое исключение (тайм-аут) неправильно каскадировано для вызывающего.

0 голосов
/ 26 августа 2009

Помимо предложений Яна, я бы также попробовал новый .Net Provider 2.5.
http://www.firebirdsql.org/index.php?op=files&id=netprovider

...