2009年5月17日日曜日

[.NET, SQL Server]TableAdapter経由でストアドプロシージャのRETURNコードを取得する

エラーの有無を表すリターンコードを返すストアドプロシージャを、「TableAdapter構成ウィザード」で追加したQueriesTableAdapterクラスを経由して呼び出し、リターンコードの値で処理が正常に終了したかどうか判定したい。
あの時の僕は、以下のようなコードでリターンコードを取得できる、そう信じていたんだ。

結果は、NULLだった。信じる者は救われない。

調べてみると、ストアドのParametersプロパティの「@RETURN_VALUE」というパラメータにセットされるとのこと。デザイナのプロパティウィンドウから辿ると、確かに作成されている。

そしてParametersが格納されている各ストアドのCommandオブジェクトは、QueriesTableAdapterクラスのCommandCollectionプロパティに格納されている。ということは、以下のようなコードでアクセスできる筈だ。あのときの僕はそう信じていたんだ。

結果、「procAdapter.」まで入力してIntelliSenseを確認するが、CommandCollectionが見あたらない。こいつ、protectedじゃねぇか!

他にPublicなインターフェイスも見あたらない。万事休すかと思いきや、以下の記事に解決策が。成る程、partialクラスか。
記事を参考に以下のようなソースを作成・使用した所、うまくいきました。
尚、細かい値チェック等は省略しています。
また、partialクラスを使用するので、.NET Framework 2.0以降でなければ使えません。

int引数版を外部から直接使用することはお薦めしません。CommandCollectionの格納順に依存してしまうし分かりにくいので。まぁEnum使えば分かりにくさは回避できますが。
ちなみにCommandCollectionの格納順は、自動生成される「○○DataSet.Designer.cs」で確認できます。
デザイナで表示されている順番ではありません!
これらの並び必ずしも一致しないのです。

以下に例を示します。
デザイナでは以下のようになっていますが

「○○DataSet.Designer.cs」の中身はこうです。

それぞれの並びは
  • データセットデザイナ:ストアド名順
  • ○○Designer.cs:ウィザードで追加した順
となるのです。

ちなみに、需要は無いでしょうが、CommandCollectionの格納順を変更することは可能です。
デザイナの表示順とCommandCollectionの格納順が異なることが気になって気になって夜も眠れない方々のために、方法を紹介します。

1..xsdファイルをテキストエディタで開き、「<DbSource>~</DbSource>」ブロックを好みの順番に変更する。

これの順番がCommandCollectionの格納順となります。

2.データセットデザイナで、クエリの「構成」を行う。

これを行うことで、Designer.csファイルが1.の並びで再作成されます。

0 件のコメント: