为什么FbDataAdapter在批量更新大约一分钟后会抛出NullReferenceException?

时间:2009-08-26 10:07:29

标签: exception transactions firebird dataadapter

当将具有1850-ish新行的DataTable更新为FbDataAdapter时,我在执行期间得到NullReferenceException。

通常它会成功插入大约1200条记录,有时更多,有时甚至更少...

但是当使用调试器单步执行代码时,它有时会插入整个记录集,没问题。

我正在使用Firebird ADO.NET DataProvider v2.1。

有什么想法吗?谢谢!

堆栈跟踪:

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 个答案:

答案 0 :(得分:2)

我找到了这个帖子:http://osdir.com/ml/db.firebird.dotnetprovider/2006-04/msg00058.html

可能会提出解决方案。

如果这对您不起作用,我建议您抓住Firebird数据提供商的来源,并查看是否可以发现问题。如果没有,请尝试将一些错误处理(例如,将异常记录到文本文件中)添加到导致问题的Firebird代码,然后编译该代码并使用它而不是当前的Firebird.Data.dll(或其他任何名称)。

如果您可以隔离问题,那么您可以联系Firebird开发人员并让他们了解它......或者甚至更好,提交修复程序!通过这种方式,您可以获得工作代码,并且可以回馈开源社区。

答案 1 :(得分:0)

除了Ian的建议,我还会尝试新的.Net Provider 2.5 http://www.firebirdsql.org/index.php?op=files&id=netprovider

答案 2 :(得分:0)

感谢您的建议!

经过一番研究后我得出结论,NullReferenceException是实际异常的副作用。基本上更新花了太长时间,大约60秒后超时。

我更改了连接字符串以允许事务(Enlist = true;)并在代码周围添加了一个TransactionScope,其超时时间为TimeSpan.MaxValue:

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

这解决了这个问题......但是,我会查看Firebird客户端源代码,了解实际异常(超时)未正确级联到调用者的原因。