为什么在 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 或更早版本。)
我在 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 或更早版本。)