簡體   English   中英

使用 system.data.oracleclient 構建良好的搜索查詢

[英]Constructing a good search query using system.data.oracleclient

我正在一個類中構建一個搜索函數,供我們的幾個 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破壞了我的系統。 現在,正確的方法是創建一個合適的 oracle 變量,將 :searchterm 放入字符串中並添加以下行:

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

問題是因為我使用了一個類似的語句,我需要能夠在搜索詞的兩邊都有 %,而我似乎無法用 '%:searchterm%' 來做到這一點,它只是給出了一個錯誤ORA-01036: 非法變量名/編號。

我可以參數化但仍然讓我的靈活 like 語句成為它的一部分嗎?

不要在 VB 代碼中進行連接,而是在 SQL 語句中進行連接。 那么你正在嘗試做的應該有效。 這里有一些 SQL 說明了我在說什么:

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

順便說一句,如果將 ELEMENT_NAME 上的排序規則切換為不區分大小寫,然后刪除對 upper() 的調用,則最終可能會得到更有效的查詢。

由於您使用的是 oracle,另一種選擇是使用Oracle Text來執行搜索。

正確設置可能需要一些時間,但是如果您有大量文本要搜索,或者有某種結構化數據,它可以為您提供比簡單的通配符比較更多的選擇。

如果您碰巧也遇到這個問題,它也有一些很好的功能來處理多種語言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM