C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: スペース区切りの単語のand検索の方法


(過去ログ 72 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■41937 / inTopicNo.1)  スペース区切りの単語のand検索の方法
  
□投稿者/ サトシ (19回)-(2009/10/04(Sun) 20:11:10)

分類:[ASP.NET (VB)] 

以前AccessDataSourceのデータの絞込み方法の件でお世話になった
http://bbs.wankuma.com/search.cgi?no=0&word=GridView%82%CC%8Di%8D%9E%82%DD%95%5C%8E%A6&andor=and&logs=70.txt&PAGE=20
続きの質問です。

検索用のキーワードをGoogleの様にスペースで区切って入力すると、単語のand検索が
行える様にしたいのですが、以下に示したコードの通り、単語が2個に限った特定の場合
のand検索は出来る様になったのですが、汎用性のあるコードをどの様に書けば良いのか
わかりません。アドバイス頂けると助かります。

スペースで区切った検索用キーワードが1個だったり、3個の時でも対応出来る
コードです。たぶん定石なので参考ページがあると思うのですがグーグルで見付ける
事が出来ません。よろしくお願いします。

VWD2005 + Access2003

TextBox1に「佐 一」を入力しButton1をクリックすると「佐藤一郎」の1行のみ表示されます。

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            
    If (TextBox1.Text <> "") Then
        'スペースで区切られた単語のand検索を行う
        'TextBox1が空でないならば、条件検索を行う。
        Dim Words As String = TextBox1.Text.Replace(" ", " ") ' 全角スペースは半角スペースに
        '検索キーワードをSplitKeyWords配列に格納する
        Dim SplitKeyWords As String() = Words.Split(New Char() {" "})
        
        'パラメータをクリア 
        AccessDataSource1.SelectParameters.Clear()

        'パラメータをセット 
        '@は必要ないです。 
        AccessDataSource1.SelectParameters.Add("KeyWord1", "%" & SplitKeyWords(0) & "%")
        AccessDataSource1.SelectParameters.Add("KeyWord2", "%" & SplitKeyWords(1) & "%")
        
        '検索の実行
        AccessDataSource1.SelectCommand = "SELECT [ID], [namae] FROM [MeiboTable] WHERE ((namae LIKE @KeyWord1) AND (namae LIKE @KeyWord2))"
        
    Else
        'TextBoxが空ならば、全件表示 
        'パラメータをクリア 
        AccessDataSource1.SelectParameters.Clear()
        AccessDataSource1.SelectCommand = "SELECT [ID], [namae] FROM [MeiboTable]"
    End If
    
End Sub

引用返信 編集キー/
■41938 / inTopicNo.2)  Re[1]: スペース区切りの単語のand検索の方法
□投稿者/ Jitta (600回)-(2009/10/04(Sun) 20:23:15)
No41937 (サトシ さん) に返信
> 検索用のキーワードをGoogleの様にスペースで区切って入力すると、単語のand検索が
> 行える様にしたいのですが、以下に示したコードの通り、単語が2個に限った特定の場合
> のand検索は出来る様になったのですが、汎用性のあるコードをどの様に書けば良いのか
> わかりません。アドバイス頂けると助かります。

 時間はかかりますが、一つの単語で見つかったものから、他の単語で検索するという方法があると思います。

 Split したときに単語の数が Length プロパティでとれますから、その数だけパラメータを追加するという方法があると思います。

引用返信 編集キー/
■41943 / inTopicNo.3)  Re[1]: スペース区切りの単語のand検索の方法
□投稿者/ たくボン (241回)-(2009/10/05(Mon) 00:03:13)
No41937 (サトシ さん) に返信
> 以前AccessDataSourceのデータの絞込み方法の件でお世話になった
> http://bbs.wankuma.com/search.cgi?no=0&word=GridView%82%CC%8Di%8D%9E%82%DD%95%5C%8E%A6&andor=and&logs=70.txt&PAGE=20
> 続きの質問です。
>
> 検索用のキーワードをGoogleの様にスペースで区切って入力すると、単語のand検索が
> 行える様にしたいのですが、以下に示したコードの通り、単語が2個に限った特定の場合
> のand検索は出来る様になったのですが、汎用性のあるコードをどの様に書けば良いのか
> わかりません。アドバイス頂けると助かります。

> TextBox1に「佐 一」を入力しButton1をクリックすると「佐藤一郎」の1行のみ表示されます。
> AccessDataSource1.SelectParameters.Add("KeyWord1", "%" & SplitKeyWords(0)

んー、どうしてもパラメータを使わないとダメなの?
検索条件がない場合も動的にSQLを作成してるんだから、パラメータを使わないでやってみたらどうかな?

[HOGEテーブルのName列]
鈴木
木村
山田
斉藤

こんな感じなら、

SELECT * FROM Hoge
WHERE Name Like "*木*"
AND Name Like "*鈴*"

(検索結果)
鈴木

でいけましたよ。(ACCESS 2003上でテスト。.NETからはテストしてないけど)

引用返信 編集キー/
■41944 / inTopicNo.4)  Re[2]: スペース区切りの単語のand検索の方法
□投稿者/ サトシ (20回)-(2009/10/05(Mon) 08:12:29)
Jitaさん、お返事ありがとうございます。
>  時間はかかりますが、一つの単語で見つかったものから、他の単語で検索するという方法があると思います。
>
>  Split したときに単語の数が Length プロパティでとれますから、その数だけパラメータを追加するという方法があると思います。

1つ目の単語で絞り込んで、その絞り込んだ結果に対して、2番目の単語で絞り込む、
その絞り込んだ結果に対して、3番目の単語で絞り込む方法のアドバイスと理解しま
した。
しかし、
AccessDataSource1.SelectCommand = "SELECT [ID], [namae] FROM [MeiboTable] WHERE (namae LIKE @KeyWord)"
の1つ目の単語で絞り込んだ結果を、2番目の単語で絞り込みの対象にするコードの書き方が
わかりません。アドバイス頂けると助かります。


たくボンさん、お返事ありがとうございます。
> んー、どうしてもパラメータを使わないとダメなの?
> 検索条件がない場合も動的にSQLを作成してるんだから、パラメータを使わないでやってみたらどうかな?
いいえ、AccessDataSource1.SelectParameters.Add()
のパラメータにこだわる必要はないと考えてます。「SQLを直接書けば良いのでは?」
とのアドバイスと理解しました。SQLを直接書く方法について少し勉強してみます。
(現在は、GridViewのソートや、ページングや、編集の機能を使うので、直接SQLを
書くより、パラメータ方式の方が有利かな?の考えで、パラメータ方式で書いていま
す。(この考えが間違っていたら教えてください。直接SQLを書く方式でも、GridView
のソートや、ページングや、編集は使えるよ。のような)

よろしくお願いします。
引用返信 編集キー/
■41945 / inTopicNo.5)  Re[3]: スペース区切りの単語のand検索の方法
□投稿者/ gtk2k (95回)-(2009/10/05(Mon) 09:47:14)
2009/10/05(Mon) 09:51:46 編集(投稿者)
2009/10/05(Mon) 09:50:53 編集(投稿者)

SQLインジェクション対策のためにも、パラメーターを使用したコーディングを行ったほうがいいと思う。
(まあ、そんな危険性がなければ別にやる必要はないが)
Jittaさんがおっしゃっている2番目の「…Lengthで〜」というのをコードにすると

AccessDataSource1.SelectParameters.Clear()
AccessDataSource1.SelectCommand = "SELECT [ID], [namae] FROM [MeiboTable]"
Dim wa As String = " WHERE "
Dim SplitKeyWords As String() = Me.TextBox1.Text.Split("  ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) ' 全角と半角のスペース
For i As Integer = 0 To SplitKeyWords.Length - 1
    AccessDataSource1.SelectCommand &= wa & "namae LIKE @KeyWord" & i
    AccessDataSource1.SelectParameters.Add("KeyWord" & i, "%" & SplitKeyWords(i) & "%")
    wa = " AND "
Next

こんな感じになる。

引用返信 編集キー/
■41981 / inTopicNo.6)  Re[4]: スペース区切りの単語のand検索の方法
□投稿者/ サトシ (21回)-(2009/10/05(Mon) 23:37:34)
No41945 (gtk2k さん) に返信
gtk2kさん、お返事ありがとうございます。
gtk2kさんのご提示頂いたコードを拝見し、スゴイの一言です。
これだけのコードをすらすらと書けるには、相当に広い範囲の知識、経験を積まなければ
と感じました。どういう意味を表現しているコードかわからないところもあり勉強していき
ます。ありがとうございました。

以下のコードで、スペースで区切られた単語のAND検索が出来る様になりました。

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            
    If (TextBox1.Text <> "") Then
        'TextBoxが空でないならば、条件検索を行う。
        'スペースで区切られた単語のand検索を行う
        AccessDataSource1.SelectParameters.Clear() 'パラメータをクリア 
        AccessDataSource1.SelectCommand = "SELECT [ID], [namae] FROM [MeiboTable]"
        Dim wa As String = " WHERE "
        Dim SplitKeyWords As String() = Me.TextBox1.Text.Split("  ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) ' 全角と半角のスペース
        For i As Integer = 0 To SplitKeyWords.Length - 1
            AccessDataSource1.SelectCommand &= wa & "namae LIKE @KeyWord" & i
            AccessDataSource1.SelectParameters.Add("KeyWord" & i, "%" & SplitKeyWords(i) & "%")
            wa = " AND "
        Next
        
    Else
        'TextBoxが空ならば、全件表示 
        AccessDataSource1.SelectParameters.Clear() 'パラメータをクリア 
        AccessDataSource1.SelectCommand = "SELECT [ID], [namae] FROM [MeiboTable]"
    End If
    
End Sub

> SQLインジェクション対策のためにも、パラメーターを使用したコーディングを行ったほうがいいと思う。
> (まあ、そんな危険性がなければ別にやる必要はないが)
パラメーターを使用したSQLのコーディングの方が安全である事を覚えておきます。

解決済み
引用返信 編集キー/
■41984 / inTopicNo.7)  Re[5]: スペース区切りの単語のand検索の方法
□投稿者/ gtk2k (97回)-(2009/10/06(Tue) 00:16:58)
2009/10/06(Tue) 00:29:01 編集(投稿者)

あ、いや、あれだけでTextBoxが空の場合にも対応してるんだが。
解決済み
引用返信 編集キー/
■41985 / inTopicNo.8)  Re[6]: スペース区切りの単語のand検索の方法
□投稿者/ サトシ (22回)-(2009/10/06(Tue) 06:33:48)
No41984 (gtk2k さん) に返信
> あ、いや、あれだけでTextBoxが空の場合にも対応してるんだが。

gtk2kさん、提示頂いた高機能な、すばらしいコードを使いこなせてなく申し訳ございません。
以下のコードだけで、TextBoxが空の場合も全件表示される事を確認しました。
改めて、すばらしいコードの提供ありがとうございました。

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    'スペースで区切られた単語のand検索を行う
    'TextBoxが空の場合は全件を表示
    AccessDataSource1.SelectParameters.Clear() 'パラメータをクリア 
    AccessDataSource1.SelectCommand = "SELECT [ID], [namae] FROM [MeiboTable]"
    Dim wa As String = " WHERE "
    Dim SplitKeyWords As String() = Me.TextBox1.Text.Split("  ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) ' 全角と半角のスペース
    For i As Integer = 0 To SplitKeyWords.Length - 1
        AccessDataSource1.SelectCommand &= wa & "namae LIKE @KeyWord" & i
        AccessDataSource1.SelectParameters.Add("KeyWord" & i, "%" & SplitKeyWords(i) & "%")
        wa = " AND "
    Next
End Sub

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -