使用system.data.oracleclient构建一个好的搜索查询

时间:2009-09-11 16:38:25

标签: asp.net vb.net oracleclient system.data.oracleclient ora-01036

我正在一个类中构建一个搜索函数,供我们的几个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

字符串连接是坏的。接下来你知道,Bobby Tables破坏了我的系统。 现在,正确的方法是通过在字符串中添加:searchterm并添加以下行来创建一个正确的oracle变量:

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

问题是因为我使用了类似的声明,我需要能够在搜索词的任意一侧使用%,而我似乎无法使用'%:searchterm%'来执行此操作,它只是给出了ORA-01036错误:非法变量名称/编号。

我可以参数化,但仍然可以将我灵活的声明作为其中的一部分吗?

2 个答案:

答案 0 :(得分:4)

不要在VB代码中进行连接,而是在SQL语句中进行连接。然后你要做的就应该工作。这里有一些SQL说明了我在说什么:

select ID_ELEMENT, ELEMENT_NAME 
from table_of_elements 
where upper(ELEMENT_NAME) like ('%' || upper(:searchterm) || '%')
顺便说一句,如果您将ELEMENT_NAME上的协作切换为不区分大小写,然后删除对upper()的调用,则最终可能会获得更高效的查询。

答案 1 :(得分:1)

由于你正在使用oracle,另一种选择是使用Oracle Text来执行搜索。

设置正确可能需要一些时间,但如果您要搜索大量文本,或者拥有某种结构化数据,它可以为您提供比简单的通配符更多的选项。

如果碰巧遇到这个问题,它还有一些很好的处理多种语言的功能。