【问题标题】:Why does it throw OleDbException when searched unicode text in mdb? How to search unicode text?为什么在 mdb 中搜索 unicode 文本时会抛出 OleDbException?如何搜索 unicode 文本?
【发布时间】:2021-10-13 04:08:01
【问题描述】:

我在我的 VB.Net 应用程序中使用 MDB (Access 2007) 和 OleDbConnection。当我搜索非 Unicode 文本时,它搜索得很好。但是当我使用 Unicode 文本搜索时,它会引发异常。我搜索了很多,在 StackOverflow 中找到了一些关于 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 之前。
  • @June7 没有错误,将撇号放在 N 之前没有结果。
  • 您是对的,指导是在 SQLServer 查询中将 N 放在撇号之外,但您的查询位于 Access 表上。我用 Access 表做了一个测试。我将这些字符复制/粘贴到字段中。我构建了一个不使用 N 限定符或通配符的查询。查询有效。然后我用 % 通配符进行了测试,没有返回任何记录。我使用了 * 通配符,这很有效。
  • @June7,感谢您的努力。不幸的是,在这里,它既不返回任何结果,也不抛出任何错误。您是否尝试使用 MDB (2007),从任何 C#/Vb.net 代码中搜索?
  • 我没有 C# 或 VB.net。不知道为什么它不能从 VB 运行。我只知道它在 Access 2010 中使用 accdb 文件工作。

标签: sql vb.net ms-access oledb


【解决方案1】:

N'string' 表示法适用于 T-SQL (MS SQL Server); 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 的 Unicode 前版本升级而来,即 Access 97 或更早版本。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2015-05-16
    • 2020-08-02
    • 1970-01-01
    • 2012-07-14
    相关资源
    最近更新 更多