1

1850のような新しい行を持つDataTableをFbDataAdapterに更新すると、実行中にNullReferenceExceptionが発生します。

通常、約1200レコード、場合によってはそれ以上、場合によってはそれ以下のレコードを挿入することに成功します...

ただし、デバッガーを使用してコードをステップ実行すると、レコードセット全体が挿入されることがあります。問題はありません。

Firebird ADO.NETDataProviderv2.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:

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の提案に加えて、新しい.NetProvider2.5も試してみます。
http://www.firebirdsql.org/index.php?op=files&id=netprovider

于 2009-08-26T11:41:53.653 に答える
0

提案をありがとう!

少し調べた結果、NullReferenceExceptionは実際の例外の副作用であると結論付けました。基本的に、更新には時間がかかりすぎ、約60秒後にタイムアウトになりました。

トランザクションを許可するように接続文字列を変更し(Enlist = true;)、TimeSpan.MaxValueのタイムアウトでコードの周りにTransactionScopeを追加しました。

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

これで問題は解決しました...ただし、実際の例外(タイムアウト)が呼び出し元に正しくカスケードされない理由から、Firebirdクライアントのソースを調べます。

于 2009-08-27T11:26:35.557 に答える