OleDbDataAdapter 不喜欢 LIKE 条件
OleDbDataAdapter doesn't like LIKE conditions
我有一些代码可以在某些数据库中找到第一个 DataRow Table 以匹配 WHERE 条件和 ORDER BY 排序顺序,如下所示:
Public Function GetRow(SQL As String) As DataRow
If Not OpenConnection() Then Return Nothing
Dim DT As New DataTable With {
.Locale = Globalization.CultureInfo.InvariantCulture
}
Dim Cmd As New OleDbCommand(SQL, Connection, Transaction)
Try
Using Adapter As New OleDbDataAdapter With {.SelectCommand = Cmd}
Adapter.Fill(DT)
End Using
Catch Ex As OleDbException
MsgBox(Ex.Message)
Finally
CloseConnection()
End Try
If DT.Rows.Count = 0 Then
Return Nothing
Else
Return DT.Rows(0)
End If
End Function
假设这是 class 的一部分,因此函数 OpenConnection 和 CloseConnection 的作用与它们的名称一样。这也适用于变量连接和事务。 Catch部分只是暂时放在里面,测试是否有异常。但是没有。
然后我有一个 Access 数据库,其中包含一个名为 'Players' 的 Table 和其中的一些人,尤其是一个名为 'Fred Bauer' 的人,它填充了 Name 和 Forename 列,例如 Name: =Bauer, Forename:=Fred(仅举个例子)。现在我想搜索名字以 B 开头的第一个人,所以 SQL 看起来像:
SELECT * FROM Players WHERE [Name] LIKE 'B*' ORDER BY [Name]
代码什么也没找到。 DT.Rows.Count 将为 0。嗯?!我知道那个人在里面,SQL 应该已经找到他了。为了测试代码的正确性,我直接在 Access 中尝试了相同的 SQL 代码作为视图,它工作正常。它 returns Fred Bauer 排成一排的视图。
然后我试着做了反测,直接用我的代码找到了那个人:
SELECT * FROM Players WHERE [Name] = 'Bauer' ORDER BY [Name]
这很好用。找到并返回正确的 DataRow。什么?!!
OleDbDataAdapter 似乎不喜欢 LIKE 条件。也许有人可以帮助我并让它在 LIKE 条件下也能工作?或者,如果您有任何以完全不同的方式进行的建议,欢迎提出。
您不应该使用 OpenConnection
和 CloseConnection
方法。连接和其他数据库对象对于使用它们的方法应该是本地的,以便可以释放它们。此代码中没有任何内容需要事务或 DataAdapter。
如评论中所述,在 Access 之外使用 % 作为通配符。
Public Function GetRow() As DataRow
Dim SQL = "SELECT * FROM Players WHERE [Name] LIKE 'B%' ORDER BY [Name]"
Dim DT As New DataTable With {.Locale = Globalization.CultureInfo.InvariantCulture}
Try
Using con As New OleDbConnection("Your connection string"),
Cmd As New OleDbCommand(SQL, con)
con.Open()
DT.Load(Cmd.ExecuteReader)
End Using 'Closes and disposes the connection and command
Catch Ex As OleDbException
MsgBox(Ex.Message)
End Try
If DT.Rows.Count = 0 Then
Return Nothing
Else
Return DT.Rows(0)
End If
End Function
我有一些代码可以在某些数据库中找到第一个 DataRow Table 以匹配 WHERE 条件和 ORDER BY 排序顺序,如下所示:
Public Function GetRow(SQL As String) As DataRow
If Not OpenConnection() Then Return Nothing
Dim DT As New DataTable With {
.Locale = Globalization.CultureInfo.InvariantCulture
}
Dim Cmd As New OleDbCommand(SQL, Connection, Transaction)
Try
Using Adapter As New OleDbDataAdapter With {.SelectCommand = Cmd}
Adapter.Fill(DT)
End Using
Catch Ex As OleDbException
MsgBox(Ex.Message)
Finally
CloseConnection()
End Try
If DT.Rows.Count = 0 Then
Return Nothing
Else
Return DT.Rows(0)
End If
End Function
假设这是 class 的一部分,因此函数 OpenConnection 和 CloseConnection 的作用与它们的名称一样。这也适用于变量连接和事务。 Catch部分只是暂时放在里面,测试是否有异常。但是没有。
然后我有一个 Access 数据库,其中包含一个名为 'Players' 的 Table 和其中的一些人,尤其是一个名为 'Fred Bauer' 的人,它填充了 Name 和 Forename 列,例如 Name: =Bauer, Forename:=Fred(仅举个例子)。现在我想搜索名字以 B 开头的第一个人,所以 SQL 看起来像:
SELECT * FROM Players WHERE [Name] LIKE 'B*' ORDER BY [Name]
代码什么也没找到。 DT.Rows.Count 将为 0。嗯?!我知道那个人在里面,SQL 应该已经找到他了。为了测试代码的正确性,我直接在 Access 中尝试了相同的 SQL 代码作为视图,它工作正常。它 returns Fred Bauer 排成一排的视图。
然后我试着做了反测,直接用我的代码找到了那个人:
SELECT * FROM Players WHERE [Name] = 'Bauer' ORDER BY [Name]
这很好用。找到并返回正确的 DataRow。什么?!!
OleDbDataAdapter 似乎不喜欢 LIKE 条件。也许有人可以帮助我并让它在 LIKE 条件下也能工作?或者,如果您有任何以完全不同的方式进行的建议,欢迎提出。
您不应该使用 OpenConnection
和 CloseConnection
方法。连接和其他数据库对象对于使用它们的方法应该是本地的,以便可以释放它们。此代码中没有任何内容需要事务或 DataAdapter。
如评论中所述,在 Access 之外使用 % 作为通配符。
Public Function GetRow() As DataRow
Dim SQL = "SELECT * FROM Players WHERE [Name] LIKE 'B%' ORDER BY [Name]"
Dim DT As New DataTable With {.Locale = Globalization.CultureInfo.InvariantCulture}
Try
Using con As New OleDbConnection("Your connection string"),
Cmd As New OleDbCommand(SQL, con)
con.Open()
DT.Load(Cmd.ExecuteReader)
End Using 'Closes and disposes the connection and command
Catch Ex As OleDbException
MsgBox(Ex.Message)
End Try
If DT.Rows.Count = 0 Then
Return Nothing
Else
Return DT.Rows(0)
End If
End Function