OleDbDataAdapter 不喜欢 LIKE 条件

问题描述

我有一些代码可以在某个数据库表中查找第一个 DaTarow 以匹配 WHERE 条件和 ORDER BY 排序顺序,如下所示:

dim=1

假设这是一个类的一部分,所以函数 OpenConnection 和 CloseConnection 做他们的名字所承诺的。这也适用于变量连接和事务。 Catch 部分只是暂时在里面测试是否有异常。但没有。

然后我有一个 Access 数据库,其中有一个名为“玩家”的表和其中的一些人,尤其是一个名为“Fred Bauer”的人,它填充了 Name 和 Forename 列,例如 Name:=Bauer,Forename:=Fred(只是例如)。现在我喜欢搜索名字以B开头的第一个家伙,所以sql看起来像:

>>> indices
tensor([0,2]) # namely 'first' and 'third'

>>> x = torch.arange(9).view(3,3)
tensor([[0,1,2],[3,4,5],[6,7,8]])

>>> x.index_select(0,indices) # select first and third rows
tensor([[0,8]])

>>> x.index_select(1,indices) # select first and third columns
tensor([[0,8]])

代码什么也没找到。 DT.Rows.Count 将是 0。嗯?!我知道那个人在那里,sql 应该找到他了。为了测试代码的正确性,我直接在 Access 中尝试了相同的 sql 代码作为视图,它工作正常。它返回一个包含 Fred Bauer 为一行的视图。

然后我尝试进行反测试并直接用我的代码找到那个人:

torch.index_select(x,dim,indices)

这很好用。找到并返回正确的 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