当将具有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:
答案 0 :(得分:2)
我找到了这个帖子:http://osdir.com/ml/db.firebird.dotnetprovider/2006-04/msg00058.html
可能会提出解决方案。
如果这对您不起作用,我建议您抓住Firebird数据提供商的来源,并查看是否可以发现问题。如果没有,请尝试将一些错误处理(例如,将异常记录到文本文件中)添加到导致问题的Firebird代码,然后编译该代码并使用它而不是当前的Firebird.Data.dll(或其他任何名称)。
如果您可以隔离问题,那么您可以联系Firebird开发人员并让他们了解它......或者甚至更好,提交修复程序!通过这种方式,您可以获得工作代码,并且可以回馈开源社区。 p>
答案 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客户端源代码,了解实际异常(超时)未正确级联到调用者的原因。