构建使用System.Data.OracleClient的一个很好的搜索查询(Constructin

2019-07-17 18:21发布

我在一个类中构造一个搜索功能,通过我们的一些ASP页面中使用。 这个想法很简单,取来自用户的搜索词,在数据库中查询的项目。 目前我这个做了错误的方式,这是容易受到SQL注入式攻击(和ELMAH是在那里,如果出现错误,保存天数):

Public Shared Function SearchByName(ByVal searchterm As String) As DataTable
    SearchByName = New DataTable

    Dim con As New OracleConnection(System.Configuration.ConfigurationManager.ConnectionStrings("OracleDB").ConnectionString)



    Try
        con.Open()
        Dim SqlStr As String = "select ID_ELEMENT, ELEMENT_NAME from table_of_elements where upper(ELEMENT_NAME) like upper('%" & searchterm & "%')"
        Dim cmd As New OracleCommand(SqlStr, con)
        SearchByName.Load(cmd.ExecuteReader)





    Catch ex As Exception
        Elmah.ErrorSignal.FromCurrentContext().Raise(ex)

    End Try
    con.Close()
    con.Dispose()




    Return SearchByName
End Function

字符串连接是坏的。 接下来你知道, 鲍比表沉船我的系统。 现在,为了做到这一点,正确的方法是,以作出正确的Oracle变量,通过把:搜索关键词串并添加以下行:

cmd.Parameters.Add(New OracleParameter("SEARCHTERM", searchterm))

问题是,因为我用的是一样的语句,我需要能够有%的搜索词的两侧,而我似乎无法做到这一点与“%:搜索关键词%”,它只是给出了一个错误ORA-01036:非法的变量名/编号。

我可以参数化,但仍然有我喜欢灵活的声明是它的一部分?

Answer 1:

相反,在你的VB代码做级联,做在SQL语句中的串联。 然后你要做的工作应该是什么。 下面是一些SQL说明什么,我说什么:

select ID_ELEMENT, ELEMENT_NAME 
from table_of_elements 
where upper(ELEMENT_NAME) like ('%' || upper(:searchterm) || '%')

顺便说一句,你也许会更高效的查询,如果你打开ELEMENT_NAME的collaction不区分大小写的结束,然后取下调用上()。



Answer 2:

由于您使用的是Oracle,另一种选择是使用Oracle Text的执行搜索。

它可以采取位设置正确,但如果你有大量的文字进行搜索,或有某种结构化数据,它可以为您提供许多比简单的外卡相比,更多的选择。

它还具有多语言处理,如果你碰巧有一个问题,以及一些不错的功能。



文章来源: Constructing a good search query using system.data.oracleclient