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 条件下也能工作?或者,如果您有任何以完全不同的方式进行的建议,欢迎提出。

您不应该使用 OpenConnectionCloseConnection 方法。连接和其他数据库对象对于使用它们的方法应该是本地的,以便可以释放它们。此代码中没有任何内容需要事务或 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