none
like演算子を使った検索について RRS feed

  • 質問

  • 初めて質問させていただきます。

    VBを使ってSQLサーバーのデータからLIKE演算子を使って検索をしようとしています。

    その際キーワードを含むという条件で検索したいので、like "%キーワード%" としています。 データアダプタにSQLを追加してFillByYomiganaとして呼び出しています。

    しかしながら、キーワードが、何文字入力されるかによってパラメータの長さがその都度変わってしまいます。 パラメータの長さが違うままにしておくとキーワード部分に空白文字を含むことになり期待する結果が得られません。そこで、自動生成されるテーブルアダプタのコードにパラメータの長さを毎回設定するコードを追加しました。

    結果はうまく働いていますが、データソースを触るたびにテーブルアダプタのコードが更新され手動で追加した部分が消えてしまいます。 Like演算子を使って検索する適切な方法があれば教えていただきたくお願いいたします。

    どうもうまく説明できてないようですみませんが、宜しくお願いします。

    ちなみに現在のコードは下記となっています。

    呼び出し側

    Yomi = "%" & YomiToolStripTextBox.Text & "%"
            Try

                Me.MasterTableAdapter.FillByYomigana(Me.OFSVTDataSet.Master, Yomi)
            Catch ex As System.Exception
                System.Windows.Forms.MessageBox.Show(ex.Message)
            End Try

     

    テーブルアダプタ側

    Public Overloads Overridable Function FillByYomigana(ByVal dataTable As OFSVTDataSet.MasterDataTable, ByVal Yomi As String) As Integer
                Me.Adapter.SelectCommand = Me.CommandCollection(1)
                If (Yomi Is Nothing) Then
                    Throw New System.ArgumentNullException("Yomi")
                Else
                    Me.Adapter.SelectCommand.Parameters(0).Size = Len(Yomi)

            上の一行を追加しました。
                    Me.Adapter.SelectCommand.Parameters(0).Value = CType(Yomi, String)
                End If
                If (Me.ClearBeforeFill = true) Then
                    dataTable.Clear
                End If
                Dim returnValue As Integer = Me.Adapter.Fill(dataTable)
                Return returnValue
            End Function

     

    2006年12月12日 6:33

すべての返信

  • Parameter の Size は Column の最大長を指定するものなので、設定しなくてもよいでしょう。
    ただ、値のサイズを事前にチェックしておく必要はあると思いますが。
    2006年12月12日 9:06
  • 早速のご回答ありがとうございます。

    私も初めはSizeは設定する必要なしと思っていたのですが、なぜか設定しないと期待通りの結果に

    なりません。 思うにパラメータのSizeを指定しないと下記のような状態となり不要なスペースが

    入っている為正しく評価されないのではないかと思います。

    正しくはwhere Yomi like "%Yomi%" となるべきところ

    パラメータサイズが長い場合

    Select * from Master

    where Yomi like "%Yomi%ーーー" (ーーーは余分なスペース) となってしまうことはないですか?

     

    TableAdapterのSQL文を

    Select * from Master

    where Yomigana like @Yomi

    としてFillコマンドを呼び出す前に%を前後に追加していますがこちらが問題なのでしょうか?

    なにかお気づきの点があればご指摘いただければ幸いです。

     

     

    2006年12月13日 6:01
  • 初めまして。私も同様の現象に悩まされております。

    その後対応策は見つかりましたでしょうか。見つかったのであればご教授願いたいです。

    私の場合は応急処置として、sizeで指定した文字数になるよう%で埋めています。

    size=10であれば、"%Yomi%%%%%"といった感じです。

    どうもスマートではない気がしますが、とりあえず応急処置としては使えるようです。

    2007年3月24日 17:32
  • ktm03さんの例で言えば、Yomiganaがncharなどの固定長だからでしょう。TableAdapterがFillByYomiganaを作成する際に、Yomiganaがncharだとすれば、@Yomiもncharで作成してしまいます。したがって、ktm03さんが指摘されているように、"%Yomi%ーーー" (ーーーは余分なスペース)という状態になってしまいます。
    これを避けるためには、Yomiganaをnvarcharなどの可変長にすればOKです。
    または、Yomiganaをncharとした場合でも、要は自動生成されたFillByYomiganaにおけるパラメータを、ncharからnvarcharに変更してしまえば良いのですが、これは自動生成されたコードを直接手修正するしか無さそうです。しかし、これですと、ktm03さんも言われているように、TableAdapterをいじれば元に戻ってしまいますので、面白くないですね。
    2007年3月26日 3:17
    モデレータ
  •  ktm03 さんからの引用

    データソースを触るたびにテーブルアダプタのコードが更新され手動で追加した部分が消えてしまいます。 

     

    テーブルアダプタ側

    Public Overloads Overridable Function FillByYomigana(ByVal dataTable As OFSVTDataSet.MasterDataTable, ByVal Yomi As String) As Integer
                Me.Adapter.SelectCommand = Me.CommandCollection(1)
                If (Yomi Is Nothing) Then
                    Throw New System.ArgumentNullException("Yomi")
                Else
                    Me.Adapter.SelectCommand.Parameters(0).Size = Len(Yomi)

            上の一行を追加しました。
                    Me.Adapter.SelectCommand.Parameters(0).Value = CType(Yomi, String)
                End If
                If (Me.ClearBeforeFill = true) Then
                    dataTable.Clear
                End If
                Dim returnValue As Integer = Me.Adapter.Fill(dataTable)
                Return returnValue
            End Function 

     

    私なら、「データソースを触るたびに追加したコードが消えてしまう」ことの対応としてですが、

    自動生成されるテーブルアダプタのクラスのPartialクラスを作成して

    上記のFillByYomiganaメソッドをそのPartialクラス内に定義します。

     

    以下のサイトでも少し触れてます

    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=37174&forum=7

    2007年3月27日 10:14
  • たしかにPartialクラスを使えばいいんですが、CommandCollectionやParametersがインデックスしか使えないので、将来TableAdapterを変更した際に、何かの拍子でこのインデックスが変わってしまわないかという不安は残りますよね。インデックスじゃなくて名前が使えたらいいんですが。
    2007年3月27日 12:21
    モデレータ
  • インデックスが変わってしまう場合についてまで考えてませんでした(汗

    ありがとうございます。

    たしかに、そうなると名前が使えるのが一番いいですね。

    2007年3月28日 0:52