首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OleDbDataAdapter不喜欢like条件

OleDbDataAdapter不喜欢like条件
EN

Stack Overflow用户
提问于 2021-01-05 01:31:50
回答 1查看 40关注 0票数 1

我有一些代码在一些DB表中查找匹配WHERE条件和ORDER BY排序顺序的第一个DataRow,如下所示:

代码语言:javascript
复制
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

假设这是一个类的一部分,因此函数OpenConnection和CloseConnection实现了它们的名字所看好的功能。这也适用于变量Connection和Transaction。Catch部分只是暂时存在于其中,用于测试是否存在异常。但并没有。

然后我有一个Access数据库,里面有一个名为'Players‘的表和一些人,特别是一个叫'Fred Bauer’的人,它填充了列的名称和名字,如Name:=Bauer,Forename:=Fred (就像例子)。现在我想搜索名字以B开头的第一个人,所以SQL看起来像这样:

代码语言:javascript
复制
SELECT * FROM Players WHERE [Name] LIKE 'B*' ORDER BY [Name]

代码什么也找不到。DT.Rows.Count将为0。嗯?!我知道那家伙在里面,SQL应该已经找到他了。为了测试代码的正确性,我在Access中直接将相同的SQL代码作为视图进行了尝试,它工作得很好。它返回一个带有Fred Bauer的视图作为一行。

然后我试着进行计数器测试,直接用我的代码和:

代码语言:javascript
复制
SELECT * FROM Players WHERE [Name] = 'Bauer' ORDER BY [Name]

这可以很好地工作。找到并返回正确的DataRow。什么?!!

看起来OleDbDataAdapter不喜欢like条件。也许有人可以帮助我,让它在类似的条件下也能工作?或者,如果你有任何建议以一种完全不同的方式来做,欢迎你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-05 02:29:55

您不应该使用OpenConnectionCloseConnection方法。连接和其他数据库对象应该是使用它们的方法的本地对象,以便可以将它们释放。这段代码中没有任何需要事务或DataAdapter的内容。

正如注释中提到的,在Access外部使用%作为通配符。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65567099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档