【问题标题】:correct syntax for sql wildcard expression in vb.netvb.net 中 sql 通配符表达式的正确语法
【发布时间】:2015-04-05 15:56:29
【问题描述】:

我想知道 vb.net 中 sql 通配符表达式的正确语法是什么

我想要的是当我的 dayVariable 匹配 Day 记录时选择我的记录,如果我的 dayVariable = "T" 那么我的 sql 表达式需要显示 Day 中所有包含 "T" 甚至 "TF" 字母的记录或“FT”,只要有一个“T”

我只尝试显示与“T”完全匹配的 Day 的记录

SELECT * FROM tblSomething WHERE Day LIKE '%" + dayVariable + "%'

SELECT * FROM tblSomething WHERE Day LIKE '%" & dayVariable & "%'

注意:我尝试像这样在 sql express 中构建查询:

 SELECT * FROM tblSomething WHERE Day LIKE '%T%'

我实现了在 Day 列中显示所有带有“T”字母的记录。

这是我真正的 Vb.net

    Private Function checkSecConflict(ByVal sTime As String, ByVal eTime As String, ByVal secID As String, ByVal day As String) As Boolean
    If Connect.State = ConnectionState.Closed Then
        Connect.Open()
    End If
    Dim cmd2 As New SqlCommand("Select * from tblSubjectOffer Where  eTime > " & sTime & " AND sTime < " & eTime & " AND Day LIKE '%' + day + '%' AND SectionID = '" & secID & "'", Connect)
    Dim dr As SqlDataReader = cmd2.ExecuteReader()
    dr.Read()
    If dr.HasRows Then

        Return True
    Else

        Return False

    End If
    dr.Close()
    cmd2.Dispose()
End Function

忽略我关于时间和 secID 的 where 语句,因为我发现我的关于 day 的通配符是真正的问题,我想是的,:)

提前感谢那些想帮助我解决问题的人,

【问题讨论】:

  • 除了缺少 vb 中的开始和结束引号外,我没有发现问题。你有什么错误吗?在 sql 中进行连接也可以让您对查询进行参数化。
  • 你的底层数据库是什么?
  • @T 我,我没有收到任何错误,但我的代码不符合我的要求。我对通配符的理解是否正确,只要符合 where 语句或特定字母或字符串,它就会显示所有记录
  • 我使用 sql express 作为我的数据库,@GordonLinoff
  • 能否展示您在发出此查询时使用的真实 vb.net 代码?

标签: sql vb.net


【解决方案1】:
" AND Day LIKE '%' + day + '%' AND SectionID = '"

这应该是:" AND Day LIKE '%" + day + "%' AND SectionID = '"

您没有将day 参数正确附加到您的字符串。

【讨论】:

  • Aaaa 就在我完成回答时,我看到了您的编辑。 =\
  • 对不起,当我将它粘贴到问题中时,我忘记更改我真正的 vb.net 语法,但如果你看到我的问题的第一部分,我已经尝试过你想让我做的事情。
【解决方案2】:

您的代码有一些问题需要修复。
首先,不要使用全局 Sql Connection。有一个connection pooling 机制允许快速创建和打开连接。

其次,使用参数化查询将值传递给数据库引擎,为数据库列指定正确的数据类型。允许自动解释您的字符串值将导致错误,并使您的代码易于使用Sql Injection

最后,每个一次性对象(如连接、命令和读取器)都应包含在Using Statement 中,该Using Statement 提供了关闭和处理这些对象的正确功能(在异常情况下也是如此)

Private Function checkSecConflict(ByVal sTime As String, ByVal eTime As String, ByVal secID As String, ByVal day As String) As Boolean

    Dim sqlText = "Select * from tblSubjectOffer " & _ 
                  "Where  eTime > @starttime AND sTime < @endtime AND " & _
                  "Day LIKE @day AND SectionID = @secid"
    Using con = new SqlConnection(....connection string here ....)
    Using cmd2 As New SqlCommand(sqlText, con)
        con.Open()
        cmd.Parameters.Add("@starttime", SqlDbType.DateTime).Value = Convert.ToDateTime(eTime)
        cmd.Parameters.Add("@endttime", SqlDbType.DateTime).Value = Convert.ToDateTime(sTime)
        cmd.Parameters.Add("@day", SqlDbType.NVarChar).Value = "%" & day & "%"
        cmd.Parameters.Add("@secid", SqlDbType.Int).Value = Convert.ToInt32(secID)
        Using dr = cmd2.ExecuteReader()
           ' the value True/False of HasRows could be used as return here
           return dr.HasRows   
        End Using
    End Using
    End Using
End Function

注意:此代码假定您的字段 eTimesTimesmalldatetime(或类似),字段 Daynvarchar 并且 SectionIDinteger

【讨论】:

  • 感谢您更正我的代码,我已经按照您的建议更改了我的代码,但这并不能解决我真正的问题,即我想知道如何让我的语法选择所有记录可能类似于我输入到“day”变量的内容,如果我输入“T”值,那么所有带有“T”的记录都会显示,
  • 上面的代码选择在名为“Day”的列中的所有记录,您在列的任何位置和任何情况下都有一个包含字母“T”的字符串。当然,还有其他条件都与 AND 相关,因此每个条件都应该得到尊重。如果您删除其他条件,您是否获得了正确的记录集?如果是,则问题出在其他条件
【解决方案3】:

我总是使用... Day LIKE '*" + day + "*' ...,它似乎工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多