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

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

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

C#でデータベースより〜を含む文字抽出

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

■90081 / inTopicNo.1)  C#でデータベースより〜を含む文字抽出
  
□投稿者/ tetris (25回)-(2019/02/06(Wed) 17:09:48)

分類:[C#] 

C#でAccessのデータベースを抽出しようとしています。



command.CommandText = "Select ID, 文字列A, 文字列B, 文字列C From データベースA WHERE 文字列A =?";
command.Parameters.AddWithValue("@文字列A", userbox.Text);

ユーザーにuserboxの値を入力してもらい、例えば、「みかん」と入力されたら、文字列Aに「みかん」があるものを抽出するような仕組みになっています。

ですが、それを「みかん」を含む検索に変えたいです。どのように変更すれば可能でしょうか?


userboxの値は「みかん」
抽出されるものは、文字列Aに「みかん」が含まれているレコード

LIKE文?を使うのでしょうが、いまいち書き方がわかりません。ご教授お願い致します。
引用返信 編集キー/
■90082 / inTopicNo.2)  Re[1]: C#でデータベースより〜を含む文字抽出
□投稿者/ kaina (45回)-(2019/02/06(Wed) 17:46:28)
こんな感じ

command.CommandText = "Select ID, 文字列A, 文字列B, 文字列C From データベースA WHERE 文字列A LIKE @文字列A";
command.Parameters.AddWithValue("@文字列A", "%" + userbox.Text + "%");

引用返信 編集キー/
■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 演算子のような、煩雑なエスケープ処理を含める必要もありません。
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ