- PR -

TableAdapterメソッドのパラメータを省略したい。

投稿者投稿内容
シラブル
会議室デビュー日: 2007/03/07
投稿数: 7
投稿日時: 2007-03-07 13:45
VB2005環境です。
クエリビルダにて、以下のようなSQL文を作成しました。
SELECT * FROM TestTable
WHERE (Name LIKE :PARAM1 || '%') AND
(Add LIKE :PARAM2 || '%') AND
(TelNo LIKE :PARAM3 || '%') AND

これを、それぞれフォームにあるテキストボックスの値を渡して使っています。
Me.TestTableAdapter.Fill(Me.DataSet1.Test,TextBox1.Text.ToString,
TextBox2.Text.ToString,TextBox3.Text.ToString)

テキストボックスに値がない時は、パラメータを省略したいと考えています。
例えば、TextBox2,3が空白であれば、
Me.TestTableAdapter.Fill(Me.DataSet1.Test,TextBox1.Text.ToString)になり、
SQL文としては
SELECT * FROM TestTable
WHERE (Name LIKE :PARAM1 || '%')
になる、といった具合です。

ケースごとにパラメータの数が異なるメソッドを作れば良いかと考えましたが、
テキストボックスの数が増えてくると、膨大な量のメソッドを作らねばなりません。
状況に応じてFillのパラメータが省略できる、WHERE句が変われば良いのですが、
これを実現できる方法がありましたら教えていただけないでしょうか?
よろしくお願いします。

[ メッセージ編集済み 編集者: シラブル 編集日時 2007-03-07 13:46 ]
すけけん
会議室デビュー日: 2007/02/26
投稿数: 7
投稿日時: 2007-03-07 14:26
不特定多数の引数が必要な場合は、パラメータ配列というのが使えるのではないでしょうか。

詳細
http://msdn2.microsoft.com/ja-jp/library/538f81ec(VS.80).aspx


[ メッセージ編集済み 編集者: すけけん 編集日時 2007-03-07 14:34 ]
シラブル
会議室デビュー日: 2007/03/07
投稿数: 7
投稿日時: 2007-03-07 14:59
レスありがとうございます。
実際にFillにパラメータ配列を入れる方法がいまいちわからないので
図々しいお願いで恐縮ですが、出来ればサンプル的なコードを交えて
教えていただけないでしょうか?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2007-03-07 15:34
NAL-6295です。

最近、似たようなスレッドがありました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=37111&forum=7&4
すけけん
会議室デビュー日: 2007/02/26
投稿数: 7
投稿日時: 2007-03-07 17:57
クエリビルダを使用しないで自分で定義するので面倒かもしれませんが。。

自動で生成されたTestTableAdapterクラスがいると思います。
そのクラスの部分クラスを作成して、部分クラス内にFillメソッドを自分で定義する感じです。

コード:
Namespace DataSet1TableAdapters
  Partial Public Class TestTableAdapter

    Public Overridable Function FillByPrms( _
          ByVal dataTable As DataSet1.hogeDataTable, _
          ByVal ParamArray prms() As String) As Integer
      'コマンドを生成してMe.Adapter.SelectCommandに設定
      'Me.Adapter.SelectCommand.Parametersにパラメータ配列の値をそれぞれ設定
       …
       …
       …

      Dim returnValue As Integer = Me.Adapter.Fill(dataTable)
      Return returnValue

    END Function

  End Class
End Namespace



こんな感じです。
Namespaceとクラス名は適宜変更してください。

#自分の発想なので、ご参考程度に(^^;
シラブル
会議室デビュー日: 2007/03/07
投稿数: 7
投稿日時: 2007-03-07 18:04
>NAL-6295さん
レスありがとうございます。
ご提示いただいたスレッドの内容は、IS NULLか、
nvlを使う方法でした。
IS NULLを使った場合、条件を入れても値がNULLのものまで
引っ張ってしまいますし、
といってnvl関数を用いて
TEL_NO LIKE nvl( :TELNO || '%',TEL_NO)
とした場合、%と連結するため、テキストボックスを空白にした場合でも
NULLになりません。

これ以外の方法で何かないでしょうか…?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2007-03-07 21:46
引用:

シラブルさんの書き込み (2007-03-07 18:04) より:
>NAL-6295さん
レスありがとうございます。
ご提示いただいたスレッドの内容は、IS NULLか、
IS NULLを使った場合、条件を入れても値がNULLのものまで
引っ張ってしまいますし、


もうちょっと、良く読んだ方が良いです。

パラメータ IS NULL OR 項目 = パラメータ

とした場合、

パラメータがNULLかパラメータが項目の値と同じ場合

となります。

つまり、パラメータがNULLの時は、常にTrue
パラメータがNULLじゃない時は、パラメータと項目の値が同じ時だけTrue

となりますので、結果的に

パラメータがNullの時は、条件が無い時と同じで、
パラメータがNullじゃ無いときは

項目 = パラメータ

の条件が成立するようになります。
シラブル
会議室デビュー日: 2007/03/07
投稿数: 7
投稿日時: 2007-03-08 11:26
>すけけんさん
お手数をおかけして申し訳ありません。
なるほど、そういう方法もあるのですね。
大変参考になりました。

>NAL-6295さん
項目 IS NULL OR 項目 = パラメータ
と勘違いしていたためおかしかったようです。
ご指摘の通り、条件無しと同様の動作が実現できました。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)