■90084 / inTopicNo.3) |
Re[2]: C#でデータベースより〜を含む文字抽出 |
□投稿者/ 魔界の仮面弁士 (2040回)-(2019/02/07(Thu) 09:53:28)
|
2019/02/07(Thu) 11:06:08 編集(投稿者)
■No90081 (tetris さん) に返信 > C#でAccessのデータベースを抽出しようとしています。
ひとまず "Provider=Microsoft.ACE.OLEDB.12.0" と仮定します。
>> userboxの値は「みかん」 >> 抽出されるものは、文字列Aに「みかん」が含まれているレコード
もしも userbox.Text = ""; だった場合には、 何も抽出されないことが期待されているのでしょうか。 それとも全件抽出されることが望まれるのでしょうか。
■No90082 (kaina さん) に返信 > command.CommandText = "Select ID, 文字列A, 文字列B, 文字列C From データベースA WHERE 文字列A LIKE @文字列A"; > command.Parameters.AddWithValue("@文字列A", "%" + userbox.Text + "%");
kaina さんの回答に補足して。
上記のコードだと、 userbox.Text = "%"; だった場合に、「%」が含まれているレコードではなく、 全レコードがヒットしてしまうという問題があります。
それゆえ LIKE を使う場合には、特殊文字を角かっこで囲って エスケープ処理する必要があります。 https://support.office.com/ja-jp/article/af00c501-7972-40ee-8889-e18abaad12d1#bmansi92
command.CommandText = @"Select ID, 文字列A, 文字列B, 文字列C From データベースA WHERE 文字列A LIKE @文字列A "; var escapedValue = userbox.Text.Replace("[]", "\0").Replace("[", "[[]").Replace("\0", "[[]]").Replace("_", "[_]").Replace("%", "[%]"); command.Parameters.AddWithValue("@文字列A", "%" + escapedValue + "%");
しかも要件によっては、これでもまだ十分ではない可能性があります。
「みかん」を含む文字列をあいまい検索したい場合、LIKE 演算子だと 「100%みかんジュース」だけではなく「ミカンの缶詰」にもヒットするためです。
あいまい検索という意味では、ひらがな・カタカナ、全角・半角、大文字・小文字などが 同一視された方が都合が良いのでしょうけれども、時には、それらを厳密に区別する バイナリ比較が必要になることもあるでしょう。
そのような場合には、『LIKE 演算子』の代わりに 『InStr 関数』を用いることができます。 https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/instr-function
command.CommandText = @"Select ID, 文字列A, 文字列B, 文字列C From データベースA WHERE InStr(1, 文字列A, @文字列A, 0) > 0 "; command.Parameters.AddWithValue("@文字列A", userbox.Text);
InStr では、テキスト比較とバイナリ比較のどちらにも対応できますし、 LIKE 演算子のような、煩雑なエスケープ処理を含める必要もありません。
|
|