複数フィールドからの検索

タグの編集
投稿者 vb素人  (社会人) 投稿日時 2016/11/17 13:11:18
.NET + Microsoft Accessにおける検索についてお尋ねします。

下記コードで、フィールド「キーワード」からの検索は可能ですが、
フィールド「アイテム」からも検索したい場合、どのように記述すれば良いのでしょうか?



        If e.KeyCode = Keys.Enter Then
            Me.UdonTableBindingSource.Filter =
           "キーワード LIKE '" & ToolStripTextBox1.Text & "'"

単純に次の記述で試してみましたが、エラーとなってしまいました。


        If e.KeyCode = Keys.Enter Then
            Me.UdonTableBindingSource.Filter =
           ("キーワード LIKE '" & ToolStripTextBox1.Text & "'") Or ("アイデア LIKE '" & ToolStripTextBox1.Text & "'") 
投稿者 shu  (社会人) 投稿日時 2016/11/17 15:40:14
> ("キーワード LIKE '" & ToolStripTextBox1.Text & "'") Or ("アイデア LIKE '" & ToolStripTextBox1.Text & "'")  

"(キーワード LIKE '" & ToolStripTextBox1.Text & "') Or (アイデア LIKE '" & ToolStripTextBox1.Text & "')"

ですね。

このような文字列連結を記述するときは結果の文字列をまず想定して
"(キーワード LIKE 'aaa') Or (アイデア LIKE 'bbb')"
とします。
この文字列の内可変となる部分を順に文字列の外に出すようにしていきます。
まずaaaに対し考えると
"(キーワード LIKE '" & aaa & "') Or (アイデア LIKE 'bbb')"
このようになります。aaaを変数に置き換えます。
"(キーワード LIKE '" & ToolStripTextBox1.Text & "') Or (アイデア LIKE 'bbb')"
同様にbbbについて
"(キーワード LIKE '" & ToolStripTextBox1.Text & "') Or (アイデア LIKE '" & bbb & "')"
となります。bbbを変数に置き換えます。
"(キーワード LIKE '" & ToolStripTextBox1.Text & "') Or (アイデア LIKE '" & ToolStripTextBox1.Text & "')"
となります。


またString.Formatを使った方が見た目がわかりやすくなります。

String.Format("(キーワード LIKE '{0}') Or (アイデア LIKE '{0}')", ToolStripTextBox1.Text)
という表記になり条件部分がわかりやすいかと思います。


投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/11/17 20:02:26
> = "キーワード LIKE '" & ToolStripTextBox1.Text & "'"
たとえば、テキストに「O'Reilly」という文字列が
入力された場合、このコードだと正しく処理されないはずです。

ですから、エスケープ処理を施して
 = "キーワード LIKE '" & ToolStripTextBox1.Text.Replace("'", "''") & "'"
などとしておいた方が良いと思います。


今回のケースは、VB2015 であればこう書けます。
'エスケープ処理しておく 
Dim escValue = ToolStripTextBox1.Text.Replace("'""''")

'埋め込み 
Me.UdonTableBindingSource.Filter = $"(キーワード LIKE '{escValue}') OR (アイデア LIKE '{escValue}')"


vb素人さんは VB2012 を利用していたと思うので、shu さんの String.Format 案が良さそうです。
投稿者 vb素人  (社会人) 投稿日時 2016/11/18 09:42:01
shu様、魔界の仮面弁士様

ありがとうございます。
対策を教えていただいただけでなく、丁寧な説明かつエスケープ処理まで…
とても勉強になります。

自分では少しできるようになっていたつもりですが、まだまだ勉強不足と痛感しました。