1

在将具有 1850 新行的 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

内部异常:

4

3 回答 3

2

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

这可能会提出一个解决方案。

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

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

于 2009-08-26T10:46:03.547 回答
0

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

于 2009-08-26T11:41:53.653 回答
0

感谢您的建议!

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

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

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

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

于 2009-08-27T11:26:35.557 回答