.NET2.0になってからTableAdapterというのもが増えた。これはこれで非常に便利なものである。しかし、問題がある。動的にSQL文を発行したい場合だ。特に検索系において、動的にwhere句を変えたい場合、どうやれば良いのだろうか?
これについては2つあると思う。一つは、partial classでパブリックなCommandCollectionを定義して、それをプログラムから利用する方法。もう一つは、Fillをオーバーライドする方法だ。しかし、いずれにしても弱点がある。CommandCollection[0]という風に、インデックスでアクセスする方法でしか、SqlCommandが得られないということである。これはあまりにも気持ち悪い。しかも、インデックスの順番なんか保障されていない。
なので、上の二つの方法を採用することはあきらめた。
では、どのようにしてアクセスしようか?
結果的には、全てストアドプロシージャで対応することにした。SQL文やwhere句の動的な作成も、全てストアドプロシージャで行うことにした。
元々、ストアドプロシージャを使っておけばいろいろと気にしなくても良い。プログラムでSQL文を組み立てる場合、例えば'90年のように、「'」を含む文字列を入力されたらどうなるだろう? それだけで、SQL文は動かなくなってしまう。この点、ストアドプロシージャのパラメータで渡しておけば安心だ。
というわけで、CommandCollection[0]とはおさらばだ。
#それにしてもなぜTableAdapterはCommandCollectionを使いやすく公開していないのだろうか?ついでにDataAdapterもである。Fillはvirtualなのに、DataAdapterはprivateで定義してある。FillをオーバーライドしたらDataAdaperにアクセスできれば便利なんで、DataAdapterはprotectedで定義して欲しかった。もっとも、partial classでDataAdapterをpublicで公開してあげればFill内で使えるんだけど、手間なんですよね。
#何年か前にわんくま中さんが、何でもストアドって言ってたけど、徐々に身にしみてくるなぁ。