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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■55171  Re[3]: ボタンコントロールの形状変更
□投稿者/ 囚人 -(2010/11/18(Thu) 21:05:15)
記事No.55154 のレス /過去ログ92より / 関連記事表示
削除チェック/

■90081  C#でデータベースより〜を含む文字抽出
□投稿者/ tetris -(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文?を使うのでしょうが、いまいち書き方がわかりません。ご教授お願い致します。
親記事 /過去ログ155より / 関連記事表示
削除チェック/

■90082  Re[1]: C#でデータベースより〜を含む文字抽出
□投稿者/ kaina -(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 + "%");
記事No.90081 のレス /過去ログ155より / 関連記事表示
削除チェック/

■90084  Re[2]: C#でデータベースより〜を含む文字抽出
□投稿者/ 魔界の仮面弁士 -(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 演算子のような、煩雑なエスケープ処理を含める必要もありません。
記事No.90081 のレス /過去ログ155より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -