10

私は、Telligent というコミュニティ プラットフォームで統合を行っています。BlogML というサードパーティのアドオンを使用して、ブログ投稿を XML ファイル (BlogML 形式) からローカルの Telligent サイトにインポートしています。Telligent プラットフォームの SDK には多くのクラスが含まれているため、ブログ投稿などのコンテンツをプログラムで追加できます。例えば

myWeblogService.AddPost(myNewPostObject);

私が使用している BlogML アプリは、基本的に XML を解析してブログ投稿オブジェクトを作成し、上記のサンプル行のようなコードを使用してサイトに追加します。約 40 回のポスト インポートの後、SQL エラーが発生します。

Exception Details: System.Data.SqlClient.SqlException:
String or binary data would be truncated.
The statement has been terminated.

このエラーは、最大サイズ制限のある db フィールドにあまりにも多くのデータを挿入しようとしていることを意味していると思います。残念ながら、これがどの分野の問題なのかはわかりません。インポート中に SQL Server プロファイラーを実行しましたが、エラーが発生しているストアド プロシージャを確認できません。プロファイラーまたは別のツールを使用して、エラーの原因となっているストアド プロシージャとフィールドを正確に確認する別の方法はありますか? 具体的にどこを見るべきかについて、より多くの情報を入手するための他のヒントはありますか?

ああ、サードパーティ製ツールの素晴らしさ...

4

2 に答える 2

19

例外は、文字/バイナリ ベースのフィールドにあまりにも多くのデータを詰め込もうとしていることが原因であるという点で正しいです。トレースを実行すると、正しいイベントをキャプチャしている場合、どのプロシージャ/ステートメントが例外をスローしているかを確実に確認できるはずです。キャプチャしたいものには次のものがあります。

  1. SQL:バッチ開始
  2. SQL:バッチ完了
  3. SQL:StmtStarting
  4. SQL:StmtCompleted
  5. RPC:開始
  6. RPC:完了
  7. SP:起動中
  8. SP:完成
  9. SP:StmtStarting
  10. SP:StmtCompleted
  11. 例外

問題のあるコードを含むストアド プロシージャであることが確実にわかっている場合は、# の 1 ~ 4 をキャプチャする必要はありません。関連付けられているすべての列もトレースでキャプチャしてください (Profiler ツールを使用してトレースを実行している場合は、これがデフォルトである必要があります)。Exception クラスには、トレースに実際のエラーが含まれます。これにより、例外をスローした同じ SPID 内の直前のステートメントを確認できます。例外が発生すると、関連付けられている完了イベントがトレースで発生しなくなるため、完了イベントに加えて開始イベントを含める必要があります。

トレースを特定のデータベース、アプリケーション、ホスト名などにフィルターできる場合、ビジー状態のサーバーを使用している場合はデバッグが容易になりますが、アイドル状態のサーバーを使用している場合は、フィルタリング。

Sql 2005 以降を使用していると仮定すると、トレースには「EventSequence」と呼ばれる列が含まれます。これは基本的に、イベントが発生するシーケンスによって順序付けられた増分値です。トレースを実行して出力をキャプチャしたら、発生した「例外」イベントを見つけます (プロファイラーを使用している場合、行は赤色になります)。その後、最新の SP:StmtStarting または例外の前に発生した同じ SPID の SQL:StmtStarting イベント。

これは、あなたと同様のイベントを再現してキャプチャしたプロファイルのスクリーンショットです。

代替テキスト

赤で例外行を確認できます。強調表示されている行は、同じ SPID の例外の前に発生した直前の SP:StmtStarting イベントです。このステートメントが含まれているストアド プロシージャを検索する場合は、ObjectName および/または ObjectId 列の値を探します。

于 2009-12-11T18:31:59.077 に答える