1

我正在構建一個類的搜索功能,供我們的幾個asp頁面使用。這個想法很簡單,從用戶那裏搜索一個搜索詞,然後在數據庫中查詢該項目。目前我在做這個錯誤的方式,這是容易受到SQL注入式攻擊(和ELMAH是在那裏保存一天,如果出現錯誤):使用system.data.oracleclient構建一個好的搜索查詢

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變量,通過把:搜索關鍵詞串並添加以下行:

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

的問題是,因爲我用的是一樣的語句,我需要能夠在搜索詞的任一側上具有%,並且我似乎無法使用'%:searchterm%'這樣做,它只是給出了ORA-01036:非法變量名稱/編號的錯誤。

我可以參數化,但仍然有我的靈活的類似的聲明是其中的一部分?

回答

4

而不是在您的VB代碼中進行串聯,請執行SQL語句中的連接。那麼你想做的事情應該工作。下面是一些SQL說明什麼我談論:

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

順便說一句,你可能會,如果你打開ELEMENT_NAME的collaction不區分大小寫的,然後刪除()的調用上結了更高效的查詢。

+0

我要快速測試這個。如果這樣做,你會成爲100閃亮新代表的快樂主人。 – Maximillian 2009-09-16 15:07:39

+0

酷!樂意效勞。 – 2009-09-16 22:23:16

1

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

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

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

+0

我的問題的範圍比您的鏈接的範圍稍窄一些,但它使一些非常有趣的閱讀,我想爲此感謝你。 – Maximillian 2009-09-16 15:12:49