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는 나의 시스템을 난파시킨다. 나는, 내가 같은 문장을 사용하고 있기 때문에

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

문제는 다음과 같습니다 문자열에 SEARCHTERM을하고 다음 행을 추가 : 자,이 작업을 수행하는 올바른 방법은 퍼팅에 의해, 적절한 오라클 변수를 만드는 것입니다 검색 단어의 양쪽에 %를 가질 수 있어야하며 '% : searchterm %'을 사용하여이를 수행 할 수 없습니다. 단지 ORA-01036 : 잘못된 변수 이름/번호의 오류 만 제공합니다.

필자는 매개 변수화를 할 수 있습니까?

답변

4

VB 코드에서 연결을 수행하는 대신 SQL 문에서 연결을 수행하십시오. 그럼 당신이하려는 것은 효과가 있습니다. 다음은 몇 가지 SQL 무슨 말인지 설명 : 당신은 문자를 구분의 경우 다음 상단에 전화를() 제거 ELEMENT_NAME에 collaction을 전환하는 경우 BTW

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

, 당신은보다 효율적인 쿼리를 끝낼 수 있습니다.

+0

나는이 사실을 빨리 테스트 할 것입니다. 이것이 효과가 있다면, 당신은 반짝 반짝 빛나는 100 명의 새로운 대표의 행복한 주인이 될 것입니다. – Maximillian

+0

멋지다! 기꺼이 도와주세요. –

1

oracle을 사용하고 있으므로 다른 옵션은 Oracle Text을 사용하여 검색을 수행하는 것입니다.

제대로 설정하는 데 다소 시간이 걸릴 수 있지만 검색 할 텍스트가 많거나 구조화 된 데이터가있는 경우 단순한 와일드 카드 비교보다 더 많은 옵션을 제공 할 수 있습니다.

또한 여러 언어를 다루기위한 좋은 기능이 있습니다. 문제가 발생할 수도 있습니다.

+0

내 문제는 링크가 의미하는 것보다 범위가 조금 좁습니다.하지만 몇 가지 매우 흥미로운 독서가 있습니다. 저는 그것에 대해 감사 드리고 싶습니다. – Maximillian