- ベストアンサー
VB2010でのDAOを使用してのデータベース接続において、クエリ結果とレコードセット結果が異なる
- VB2010でDAOを使用して、ACCDBに接続しています。クエリの結果とレコードセットの結果が異なり、困っています。
- レコードセットでもクエリと同じように濁点を拾わず抽出する方法を教えてください。
- テーブル名はMST_得意先で、MST_得意先フリガナフィールドには「ガイコク」と「カカシ」があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 Access内でないとできないようですね。 無理やりソースを書くしかないかと。 ひらがな、カタカナ1文字の時に有効で、 その他の文字列は、そのまま抽出できると思います。 Dim select_str As String = "" If Len(変数) = 1 Then '変数が1文字の時 'カナに変換 Dim Kana_cng As String = StrConv(変数, VbStrConv.Katakana) '半角カナに変換 Dim En_str As Short = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(StrConv(Kana_cng, vbNarrow)) '半角カナ変換できた時のバイト数 If En_str = 1 Then '1バイトの時は濁点がないので、濁音を含まない処理が必要 select_str = "select * from MST_得意先 where MST_得意先.得意先フリガナ Like '*" & Kana_cng & "*'" & Sql_Str(Kana_cng) Else '2バイト以上は完全一致できる select_str = "select * from MST_得意先 where MST_得意先.得意先フリガナ Like '*" & 変数 & "*'" End If Else '変数が2文字以上 select_str = "select * from MST_得意先 where MST_得意先.得意先フリガナ Like '*" & 変数 & "*'" End If ここから先は、DAOのselectコマンドにセットして下さい。 Private Function Sql_Str(ByVal str As String) As String Dim ten_str As String = "" Dim maru_str As String = "" Select Case str Case "カ" ten_str = "ガ" Case "キ" ten_str = "ギ" Case "ク" ten_str = "グ" Case "ケ" ten_str = "ゲ" Case "コ" ten_str = "ゴ" Case "サ" ten_str = "ザ" Case "シ" ten_str = "ジ" Case "ス" ten_str = "ズ" Case "セ" ten_str = "ゼ" Case "ソ" ten_str = "ゾ" Case "タ" ten_str = "ダ" Case "チ" ten_str = "ヂ" Case "ツ" ten_str = "ヅ" Case "テ" ten_str = "デ" Case "ト" ten_str = "ド" Case "ハ" ten_str = "バ" maru_str = "パ" Case "ヒ" ten_str = "ビ" maru_str = "ピ" Case "フ" ten_str = "ブ" maru_str = "プ" Case "ヘ" ten_str = "ベ" maru_str = "ペ" Case "ホ" ten_str = "ボ" maru_str = "ポ" End Select If ten_str = "" Then '濁音、半濁音がないものは何もしない Return "" Else If maru_str = "" Then '濁音あり、半濁音なし Return " and MST_得意先.得意先フリガナ Not Like '*" & ten_str & "*'" Else 'は行は、ば行とぱ行があるので含まない処理追加 Return " and MST_得意先.得意先フリガナ Not Like '*" & ten_str & "*' and MST_得意先.得意先フリガナ Not Like '*" & maru_str & "*'" End If End If End Function もっと簡単な方法があるかもですが。。。
その他の回答 (2)
- angel_Z
- ベストアンサー率66% (12/18)
こんにちは。 半濁点も追加します。 SELECT MST_得意先.* FROM MST_得意先 WHERE InStr(StrConv(MST_得意先.得意先フリガナ,4),'゛')=0 and InStr(StrConv(MST_得意先.得意先フリガナ,4),'゜')=0 文字列を全角にしているので大丈夫かと。
お礼
返事が遅くなり申し訳ありません。 さらに私の説明不足だったようで、検索部分は変数で持ち、Like演算子をしようして部分一致検索をしようと思っています。 よって濁点、半濁点がついた文字列も検索対象になる場合があります。(例:「*ガ*」という文字列を検索するときもあり、「*カ*」という文字列を検索する時もます。) 現在の私のSQL文ですと「*ガ*」を検索した時は正常に抽出されますが、「*カ*」を検索した時は、「*カ*」+「*ガ*」が抽出されてしまいます。 私の説明不足と勉強不足で申し訳ないのですが、ご教示していただいたSQL文ですと、濁点+半濁点を除いた形での抽出方法になると思われます。
補足
いろいろ試してみたところ、2文字以上はLike演算子で正常に動作するようです。 1文字で濁点・半濁点なしの文字の場合(静音)のみ、濁点や半濁点を抽出してしまうようです。 ご教示していただいた方法ですと、濁点・半濁点をのぞく全てのレコードを抽出してしまいます。 大変お手数ですが、指定した文字だけの部分一致を抽出する方法をご教示していただけるとありがたいです。
- angel_Z
- ベストアンサー率66% (12/18)
こんにちは。 これとか。 SELECT MST_得意先.* FROM MST_得意先 WHERE InStr(StrConv(MST_得意先.得意先フリガナ,4),'゛')=0
お礼
ご回答ありがとうございます。 急な出張が入りまして現在試せないのですが、戻り次第結果を報告させていただきます。
補足
本日会社に戻りまして、処理を実行しました。 結果、濁点は取り除かれて抽出されました。 ありがとうございます。 しかしながら私の説明不足でして、申し訳ないのですが、濁点と半濁点も含む文字等も(例:パタゴニア等)検索する予定です。そのような場合はかなり長いコードを書かないといけないような気がします。 そもそもなぜクエリとレコードセットに違いがあるのでしょうか・・・ 何かいい解決案があればよいのですが。。。
お礼
ご回答ありがとうございます。 希望通りのものができました。 いろいろご教示していただきありがとございました。 しかし、同じMS商品なのに、アクセスとVBで違いがでるとは。。