为什么在 mdb 中搜索 unicode 文本时抛出 OleDbException?如何搜索unicode文本?

Why does it throw OleDbException when searched unicode text in mdb? How to search unicode text?

我在 VB.Net 应用程序中使用 MDB (Access 2007) 和 OleDbConnection。当我搜索非 Unicode 文本时,它搜索得很好。但是,当我使用 Unicode 文本进行搜索时,它会抛出异常。我搜索了很多,在 Whosebug 中发现了几个关于 Unicode 搜索的例子,他们建议在 ' 字符之前使用 N,如下所示。

OleDbConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DbOnlyforBathu.mdb"

'sql = "SELECT * FROM TableNotes WHERE NotesDetail like '%" & "hello" & "%'" 'Works fine for Non-Unicode
'sql = "SELECT * FROM TableNotes WHERE NotesDetail like '%commonWord%'" 'Works fine, returns all results inclu. unicode
'sql = "SELECT * FROM TableNotes WHERE NotesDetail LIKE 'N%வா%'" 'no errors; no results
sql = "SELECT * FROM TableNotes WHERE NotesDetail like N'%" & "வா" & "%'"  'throws error for Unicode
sql = "SELECT * FROM TableNotes WHERE NotesDetail like '*வா*'" 'no errors; no results

da = New OleDb.OleDbDataAdapter(sql, OleDbConn)
da.Fill(ds, TableResult)

但是当我在 ' 字符前使用 N 时,它会抛出此错误。此错误是什么意思以及如何搜索 unicode 文本?

System.Data.OleDb.OleDbException: '查询表达式中存在语法错误(缺少运算符)'NotesDetail like N'%வா%''。'

请注意:“வா”是泰米尔语文本。

更新:我将 mdb 转换为 accdb 并使用了适当的连接字符串(“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Db.accdb;”),但仍然是同样的问题。但是,它适用于非 Unicode 文本。

N'string' 符号用于 T-SQL (MS SQL 服务器); Access SQL 不支持它。当前版本的 Access(自 Access 2000 起)支持 Unicode 字符串,因此 LIKE '%வா%' 应该可以与 OLEDB 连接一起使用。

Module Module1

    Sub Main()
        Dim con As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\Users\Public\test\unicode.mdb")
        con.Open()
        Dim cmd As New OleDb.OleDbCommand()
        cmd.Connection = con
        cmd.CommandText = "SELECT COUNT(*) AS n FROM vocabulary"
        Dim n As Integer
        n = cmd.ExecuteScalar()
        Console.WriteLine(n)  ' 12
        cmd.CommandText = "SELECT COUNT(*) AS n FROM vocabulary WHERE comments LIKE '%வா%'"
        n = cmd.ExecuteScalar()
        Console.WriteLine(n)  ' 1
    End Sub

End Module

如果它对您不起作用,那么您的 .mdb 文件可能有问题。 (也许它是从 Access 的 pre-Unicode 版本升级而来的,即 Access 97 或更早版本。)