私はSSISパッケージに取り組んでいます。パッケージには、スクリプト(C#言語)タスクがあります。スクリプトタスクをデバッグする必要があります。ブレークポイントを設定します。スクリプトエディター(Visual Studio)のスクリプトとSSISパッケージエディターのタスクはどちらも、ブレークポイントを赤色で表示します-ブレークポイントが有効になっていることを意味します。ただし、パッケージをデバッグするとき、ブレークポイントはヒットしません。
ブレークポイントには条件が設定されていないため、パッケージが実行されるたびにブレークポイントに達すると予想されます。
Windows 2003 R2 64ビットSP2でVisual Studio 2008を使用しています。
さらなる調査と試行錯誤の後、SSISパッケージは、64ビットマシンでのデバッグ時にスクリプトタスクのブレークポイントを無視することがわかりました。修正するには-
Run64BitRunTime
からFalse
へ。この変更を行った後、ブレークポイントは魔法のようにヒットします。
ここで提供されたすべての答えを試してみましたが、成功しませんでした(VS2015を使用)。さらに検索した結果、私はこれを見つけました 実際には答えである質問 これは、新しいC#機能/構文がデバッガーを正しく起動しないことを示していました。
彼らの例(そして私のもの)では、文字列補間を使用するとブレークポイントにヒットしませんでした。
交換
$"{someVariable} - {someOtherVariable}"
と
string.Format("{0} - {1}", someVariable, someOtherVariable);
私のためにトリックをしました。
更新:皆さん、再びブレークポイントを設定する機能を失いました (MSへのリクエスト)
以前の修正は以下のとおりです。
今、デバッグの代わりにロギングとトレースを使用しています。
C#の新機能(C#4.0以降)は、SSISスクリプトタスクのデバッグを終了させることで非難されています。
ブレークポイント機能を返すには、次のことを行います。
最後に、スクリプトタスクに赤い円を表示する必要があります。
(VS 2017でテスト済み。)
注。デバッグは、「パッケージの実行」ではなく「タスクの実行」のみを使用しても機能します。
C#の新機能の削除
C#の新機能を削除するには、2つの方法をお勧めします。
最初、VstaプロジェクトのプロパティをC#4.0に制限します(移行されたパッケージはこれをサポートしない場合があります)。
Secondly、古い/移行されたパッケージのVstaプロジェクトには、上記の「C#言語レベル」プロパティが表示されない場合があります。
したがって、Visual Studio 2010の偽のプロジェクトにコードを配置し、そこでコンパイルできます。
正常に1回実行
C#を修正したら、スクリプトタスクを1回正常に実行する必要があります。
実際の実行を防ぐために、Main()
メソッドの先頭にreturn
ステートメントを配置することができます。
Sorry、これは常に機能するとは限りません。なぜかはわかりませんが、最初にC#を修正する必要があります。
少なくとも動作中のスクリプトタスクを取得し、昔ながらの方法でデバッグできます(ログはDts.Events...
、例外など)
TL; DR
C#の新機能により、スクリプトタスクが成功完了ステータスでサイレントに失敗するように強制された場合でも、深刻なケースがあったようです。
例として、スクリプトタスクに次を追加します。
string Bug { get; } // Only getter properties.
//...
var str = $"Now is {DateTime.Now}"; // String Interpolation in C#
//...
var dummy = val?.ToUpper(); // ?. and ?[] null-conditional Operators
この完全ではないリストの回避策:
string Bug { get; set; }
//...
var str = string.Format("Now is {0}", DateTime.Now);
// etc.
また、C#コードをVisual Studio 201で作成します。新しい.NET機能をコンパイルせず、4.0以上の.NET Frameworkバージョンを許可しません。ここまでは順調ですね。
もちろん、このSO質問からの他の答えは私を助けませんでした。
System.Diagnostics.Debugger classを使用して、プログラムでブレークポイントを追加します。
System.Diagnostics.Debugger.Launch();
System.Diagnostics.Debugger.Break();
デバッガが接続されているかどうかを確認できます。
if (System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Break();
次の手順に従ってください:
私の場合、これらのソリューションはどれも機能しませんでした。私はついに、リシャーパーが犯人であることを知りました。アンインストールすると、チャームのように機能し始めました。
最近、同じ問題に遭遇しました。私たちにとっての解決策は、スクリプトタスクプロジェクトが、x86に設定されたプラットフォームターゲットで実行するようにマークされていることを確認することでした。
私の場合、C#6のすべての機能を削除する必要がありました。文字列補間、null条件演算子(_?.
_、?()
、_?[]
_)、および式本体メンバー(_=>
_)(あなたの場合はもっとあるかもしれません)。それらすべてを確認できます here 。もちろん、C#7機能にも同じことが当てはまります。
他の回答からの32/64ビットの変更は役に立たなかったので、それらをロールバックし、デバッグは正常に機能し続けました。
Jeffの提案に加えて、プラットフォームターゲットを "x86"に変更します(スクリプトのプロパティの[ビルド]タブで。これにより、ついに64ビットシステムでデバッグできるようになりました。
私の経験では、それは重要ではありません:
しかし、非常に重要なものがあり、他の回答では言及されていません:パッケージ全体を実行する必要があります。タスクまたはコンテナを実行すると、ブレークポイントは無視されます。
64ビットマシンでVisual Studio 2013を使用しています。
スクリプトコンポーネントは1つしかなく、ブレークポイントにヒットしませんでした(ソース/ターゲットを必要とせずにCRMを実行していました)。単純なfetchXMLでSourceコンポーネントを追加しようとしました(必要ない場合でも)。それでうまくいきました! :-)
ブレークポイントは、私が何をしたとしてもヒットすることを拒否しました。例外のスローを使用して、問題をデバッグして修正することになりました。私が抱えていた問題を修正すると、ブレークポイントがヒットし始めました!
そのため、私のブレークポイントは、コードでランタイムの問題が発生しなかった場合にのみヒットします...これは奇妙です。