DOBON.NET DOBON.NETプログラミング掲示板過去ログ

OdbcCommandをつかったあいまい検索

環境/言語:[VS2005]
分類:[ASP.NET]

はじめまして。初心者です。

OdbcCommandを使っています
Str.Append("WHERE ")
If Flg = True Then
    Str.Append("FIELDID  LIKE '*?*' ")
else
    Str.Append("FIELDID  = ? ")
End If                    

Adapter.SelectCommand = New OdbcCommand(Str.ToString, Con)
Adapter.SelectCommand.Parameters.Add("", Odbc.OdbcType.VarChar).Value = FieldID
            
?は上手くいくのですがLIKE '*?*'の場合あいまい検索ができません。
だいぶ調べましたがLIKEの記述はあっても*の場合のあいまい検索の指定が
ありませんでした。

プログラム実行時エラーがでないのですが、データが取得できません。
テーブルにはちゃんとデータも格納されています。
どなたか御教授ください。
よろしくお願いします。
■No25652に返信(たかさんの記事)
> はじめまして。初心者です。
>
> OdbcCommandを使っています
> Str.Append("WHERE ")
> If Flg = True Then
> Str.Append("FIELDID LIKE '*?*' ")
> else
> Str.Append("FIELDID = ? ")
> End If
>
> Adapter.SelectCommand = New OdbcCommand(Str.ToString, Con)
> Adapter.SelectCommand.Parameters.Add("", Odbc.OdbcType.VarChar).Value = FieldID
>
> ?は上手くいくのですがLIKE '*?*'の場合あいまい検索ができません。
> だいぶ調べましたがLIKEの記述はあっても*の場合のあいまい検索の指定が
> ありませんでした。
>
> プログラム実行時エラーがでないのですが、データが取得できません。
> テーブルにはちゃんとデータも格納されています。
> どなたか御教授ください。
> よろしくお願いします。
>
>
追記DBはMySQLを使用しています。
> 追記DBはMySQLを使用しています。

MySQL をODBC 接続ですか?
ADO.NET と完全互換性のある MySQL Connector/NET を使った方がいいと思います。
http://dev.mysql.com/doc/refman/5.1/ja/connector-net.html

# もっとも事情があるのかも知れませんが・・・

あと LIKE ですが、

> Str.Append("FIELDID LIKE '*?*' ")

アスタリスクじゃなく% を使います。

Str.Append("FIELDID LIKE '%?%' ")

http://dev.mysql.com/doc/refman/5.1/ja/string-comparison-functions.html
■No25654に返信(ひらぽんさんの記事)
>>追記DBはMySQLを使用しています。
>
> MySQL をODBC 接続ですか?
> ADO.NET と完全互換性のある MySQL Connector/NET を使った方がいいと思います。
> http://dev.mysql.com/doc/refman/5.1/ja/connector-net.html
>
> # もっとも事情があるのかも知れませんが・・・
>
> あと LIKE ですが、
>
>>Str.Append("FIELDID LIKE '*?*' ")
>
> アスタリスクじゃなく% を使います。
>
> Str.Append("FIELDID LIKE '%?%' ")
>
> http://dev.mysql.com/doc/refman/5.1/ja/string-comparison-functions.html
>
ひらぽん様ありがとうございます。
自分でもMySqlの構文をみて確認してみました。
%だったんですね。
ですが、%に置き換えても結果は変わりませんでした。
?のとこに直接値を埋め込めば結果はでました。
なにか別の書き方があるんでしょうか???
プロパティとかも調べましたが、
これといって設定するようなものはなかったように
思いました。
■No25660に返信(たかさんの記事)
> ?のとこに直接値を埋め込めば結果はでました。
> なにか別の書き方があるんでしょうか???

Navicat を使ったテストクエリでは

列 LIKE '%?%'

でヒットすることを確認できました。

ただし MySQL Connector/NET では「?」をクエリ変数の接頭語として使えますので
Odbc.Net でも同様に「?」をクエリパラメータの接頭語として扱っているのかも知れません。

例えば「?name」というパラメータと「@name」というパラメータは同じ働きになります。

例1
Dim query1 As String = "SELECT * FROM customer WHERE name = ?name"
Dim command1 As New MySqlCommand(query1)
command1.Parameters.Add(New SqlParameter("name", "ひらぽん"))

例2
Dim query2 As String = "SELECT * FROM customer WHERE name = @name"
Dim command2 As New MySqlCommand(query2)
command2.Parameters.Add(New SqlParameter("name", "ひらぽん"))

どちらも検索結果は同じになります。

上記は MySQL Connector/NET ですが、Odbc.Net でも同じ動きをするのかも知れません。
暫定的な回避策ですが、

Dim query2 As String =
"SELECT * FROM customer WHERE name LIKE CONCAT('%', @word ,'%')"
Dim command2 As New OdbcCommand(query2)
command2.Parameters.Add(New SqlParameter("word", "?"))

で試してみてはいかがでしょうか?
パラメータマーカーに ? を使用して
パラメータの値にワイルドカードを付加するというやり方も出来そうです。

"SELECT * FROM `test` WHERE `name` LIKE ?"
selectCommand.Parameters.Add("@name", OdbcType.Text).Value = "%a%"
■No25664に返信(もりおさんの記事)
> パラメータマーカーに ? を使用して
> パラメータの値にワイルドカードを付加するというやり方も出来そうです。
>
> "SELECT * FROM `test` WHERE `name` LIKE ?"
> selectCommand.Parameters.Add("@name", OdbcType.Text).Value = "%a%"

ひらぽん様、もりお様
ありがとうございます。
最終的に以下の
"SELECT * FROM customer WHERE name LIKE CONCAT('%', ? ,'%')"
で目的の値を得る事ができました。
プログラムを崩さずにCONCATの指定だけでOKでしたので
ひらぽん様の提案を採用させて頂きました。

ひらぽん様、もりお様本当に助かりました。
ありがとうございました。
■No25666に返信(たかさんの記事)
> ■No25664に返信(もりおさんの記事)
>>パラメータマーカーに ? を使用して
>>パラメータの値にワイルドカードを付加するというやり方も出来そうです。
>>
>>"SELECT * FROM `test` WHERE `name` LIKE ?"
>>selectCommand.Parameters.Add("@name", OdbcType.Text).Value = "%a%"
>
> ひらぽん様、もりお様
> ありがとうございます。
> 最終的に以下の
> "SELECT * FROM customer WHERE name LIKE CONCAT('%', ? ,'%')"
> で目的の値を得る事ができました。
> プログラムを崩さずにCONCATの指定だけでOKでしたので
> ひらぽん様の提案を採用させて頂きました。
>
> ひらぽん様、もりお様本当に助かりました。
> ありがとうございました。
>
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板