Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

突然、ひらかなの濁点で検索できなくなった 解決済み

タグの編集...

投稿者 hori   (社会人)   投稿日時 2021/4/22 23:13:43
Win10 VS2019 の VB でフォームアプリを書いていますが

        Dim Table As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
        Dim View As DataView = Table.DefaultView
        View.RowFilter = "検索文字列 LIKE '%" & TBx検索文字列.Text & "%'"

とした検索処理で、例えば、これまで「やまだ」で検索できていたものが
「やまた゛」=「やまた」+「゛」としなければ検索できなくなりました。

Windows の自動更新が勝手に行われてからのように思うのですが
対処方法をご存知の方居られましたら、ご教示ください。よろしくお願いいたします。


投稿者 魔界の仮面弁士   (社会人)   投稿日時 2021/4/23 01:01:06
> Windows の自動更新が勝手に行われてからのように思うのですが
自分は、半角カナの問題を聞いたことがあるという程度ですね…。

https://twitter.com/Benshi_Orator/status/1326689347127500800

https://social.msdn.microsoft.com/Forums/ja-JP/4e6223e2-34d0-4a5f-bb61-109bc28040b6/windows-10-1249612540124721251912531-2004-20h1-20h2-1997812391


> とした検索処理で、例えば、これまで「やまだ」で検索できていたものが

手元の環境ではこんな結果になりました。
Windows 10 20H2、.NET Framework 4.8 です。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim tbl As New DataTable() With {.CaseSensitive = True}
    tbl.Columns.Add("ID").AutoIncrement = True
    tbl.Columns.Add("名前").AllowDBNull = False
    tbl.PrimaryKey = New DataColumn() {tbl.Columns("ID")}
    For Each nm In New String() {"やまだたろう""やまた゛はなたろう"}
        Dim r = tbl.NewRow()
        r.SetField(Of String)("名前", nm)
        tbl.Rows.Add(r)
    Next
    tbl.AcceptChanges()
    If RadioButton1.Checked Then
        ' "やまだたろう" と "やまた゛はなたろう" 
        tbl.DefaultView.RowFilter = Nothing
    ElseIf RadioButton2.Checked Then
        ' "やまだたろう" のみ 
        tbl.DefaultView.RowFilter = "名前 LIKE '%やまだ%'"  ' U+3060「だ」 
    ElseIf RadioButton3.Checked Then
        '  "やまた゛はなたろう" のみ 
        tbl.DefaultView.RowFilter = "名前 LIKE '%やまだ%'"  ' U+305F U+3099「だ」 
    ElseIf RadioButton4.Checked Then
        '  "やまた゛はなたろう" のみ 
        tbl.DefaultView.RowFilter = "名前 LIKE '%やまた゛%'" ' U+305F U+309B「た゛」 
    ElseIf RadioButton5.Checked Then
        '  "やまた゛はなたろう" のみ 
        tbl.DefaultView.RowFilter = "名前 LIKE '%やまだ%'" ' U+305F U+FF9E「だ」 
    End If
    DataGridView1.DataSource = tbl
End Sub




ただし、対象の .NET Framwork を 4.8 から 3.5 に変更すると動作が変わり、
RadioButton1~5 のいずれのケースにおいても、
"やまだたろう" と "やまた゛はなたろう" の両方が表示されました。

投稿者 hori   (社会人)   投稿日時 2021/4/23 13:14:45
フォームにテキストボックスとデータグリッドビューを貼り付け、以下のコードを書きました。

=======================================================================

Imports System.Data.OleDb

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim Cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\DT\試作\TEST.accdb")
        Dim SQLCm As OleDbCommand = Cn.CreateCommand
        Dim Adapter As New OleDbDataAdapter(SQLCm)
        Dim Table As New DataTable

        SQLCm.CommandText = "SELECT * FROM TBL"

        Try
            Adapter.Fill(Table)
        Catch ex As Exception

        End Try

        Table.Columns.Add("検索文字列", GetType(String))

        For Each row As DataRow In Table.Rows

            row("検索文字列") = row("名前")
            row("検索文字列") &= " " & row("カナ")

        Next

        DataGridView1.DataSource = Table

        DataGridView1.ReadOnly = True

        Table.Dispose()
        Adapter.Dispose()
        SQLCm.Dispose()
        Cn.Dispose()

    End Sub

    Private Sub TextBox1_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles TextBox1.PreviewKeyDown

        If e.KeyCode = Keys.Tab Then

            Dim Table As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
            Dim View As DataView = Table.DefaultView
            View.RowFilter = "検索文字列 LIKE '%" & TextBox1.Text & "%'"

        End If

    End Sub

End Class

===============================================================================

データベース TEST の中身は

山田太郎 / ヤマダ タロウ 
山口忠夫 / ヤマグチ タダオ 
鈴木花子 / スズキ ハナコ

にしました。

[やま]で、山田太郎と山口忠夫がヒットしますが
[やまだ]では何もヒットせず
[やまた゛]で山田がヒットします。

今までは、[やまだ]で山田がヒットしていました。

僕の環境は、Windows 10 20H2、
.NET Framework 4.8 の May 2020 版のようです。

Access の何かが変わったのでしょうか?
このままでは、結構不便です。


投稿者 shu   (社会人)   投稿日時 2021/4/23 14:27:41
 row("検索文字列") &= " " & row("カナ")
これを

 row("検索文字列") &= StrConv(" " & row("カナ"), vbWide)

としてみてはどうでしょうか?

投稿者 shu   (社会人)   投稿日時 2021/4/23 14:41:33
Accessが問題なのではないです。

        Dim tbl As New DataTable()

        tbl.Columns.Add("Furi")
        tbl.Rows.Add("ヤマダ ゴロウ")
        tbl.Rows.Add(StrConv("ヤマダ ゴロウ", vbWide))

        Dim rows = tbl.Select("Furi Like 'やまだ%'")




上記コードを実行するとrowsに戻ってくるのは2番目の全角に変換した方だけと
なります。

これはWindowsUpdateによるWindows自体の不具合となります。


投稿者 hori   (社会人)   投稿日時 2021/4/23 16:15:26
魔界の仮面弁士さまにお示しいただいたサイトを見る限り、
新しいOSをリリースするまで、この問題が修正されることは無さそうなので
shuさまのお示しくださった解決方法がベストのように思われます。

『俺が悪いんかい?』と云う忸怩たるものもありますが
どのアップデートが問題なのか探し出す手間より
自分の書いたものに少し手を加える事の方がはるかに楽でしょうね。
まぁ、世の中ってこんなものなのでしょう。

そんなわけで、解決とさせていただきます。ありがとうございました。