2009年5月24日日曜日

[SQL Server]動的SQLのカーソルを定義する

Transact-SQLにて、テーブル名や列名をパラメータ化して実行時にSQLを組み立てる(動的SQL)場合、以下のように文字列型変数とEXECUTE文を使用すればよいことは皆さんご存じのことと思います。

ところで、動的SQLをカーソル定義に使用したい場合、以下のような定義を試みると思いますが、残念ながらエラーとなります。

正解はこうです。

2009年5月22日金曜日

希少がゆえに天才

松本人志の結婚に対して

人生において、一番耳にしてきた声は松本人志の声だ。
親の声よりも、親友の声よりも、そして自分自身の声よりも。
そんなプチ信者の僕としては、この報せは非常に感慨深く、これからの氏はどうなるのかといったような関心(ミーハーな類ではない)が、仕事中も頭の片隅に常駐ソフト化しており、100パーセント集中できない状態が続いている(何で?)。
そして現在世間を脅かしている豚インフルエンザに対して、新婦に感染するな!代わりに僕に…と思っている自分がいる。

というようなことを会社で喋ったら、ホモ疑惑が浮上してしまいました。
そう思ってしまう気持ちは分かりますが、勘弁してください…

極めて素に近い自分をさらけ出す場であったラジオや雑誌連載をやめたのは、この決意があったからなのだろう。
ちなみに今週のダウンタウンDXにて「できちゃった婚」の話題が挙がったのだが、その時のドキッ!としてしまい「触れるな!察しろ!」と思ったのは僕だけではないだろう(だから何で?しかも収録だし)。

何はともあれ、喜ばしいことだ。特に、ご懐妊は。
後の人類の文化の為にも、あの遺伝子は残しておかないと。

しかしまぁ「天才」と称される人達は、得てして子供を中々作らない気がする。
イチローしかり、菅野よう子しかり。
きっと仕事が楽しすぎてしょうがないのでしょう。
それとも、あんまり天才が増えすぎないようにという、人類の自制作用なのだろうか?
戦争やパンデミックが無くならないのは、人口が増えすぎないためであるという理屈と同じく…

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.の並びで再作成されます。