2012-05-29 4 views
2

Google에서 검색을하고 싶습니다.자동 완성 및 Ajax로 검색

웹 서비스를 사용하여 텍스트 상자에 데이터베이스의 모든 데이터를 표시 할 수 있습니다. 내 코드 그게 전부 :

Webform.aspx

<%--**Start Search**--%> 
<asp:ScriptManager ID="ScriptManager1" runat="server"> 
    <Services><asp:ServiceReference Path="~/WebService.asmx" /></Services> 
</asp:ScriptManager> 
<%--Search-Textbox--%> 
<asp:TextBox runat="server" ID="txtSearchInput" Width="100%" /> 
<asp:Button ID="btnSearch" runat="server" Text="Suche" onclick="btnSearch_Click" /> 
<%--Autocomplete (Ajax)--%> 
<asp:AutoCompleteExtender ID="AutoComplete1" runat="server" TargetControlID="txtSearchInput" 
    ServiceMethod="GetNames" ServicePath="~/WebService.asmx" MinimumPrefixLength="1" 
    EnableCaching="true" CompletionInterval="1000" CompletionSetCount="20"> 
</asp:AutoCompleteExtender> 
<%--**End Search**--%> 

Webservice.asmx

[WebMethod] 
public string[] GetNames(string prefixText, int count) 
{ 
    List<string> items = new List<string>(count); 
    DataSet ds = new DataSet(); 

    string cs = ConfigurationManager.ConnectionStrings["CSLinker"].ConnectionString; 

    using (SqlConnection connection = new SqlConnection(cs)) 
    { 
     string sql = "SELECT Name FROM tabProjects WHERE Name LIKE '" + prefixText + "%' UNION all SELECT Name FROM tabLinks WHERE Name LIKE '" + prefixText + "%'"; 
     SqlDataAdapter adapter = new SqlDataAdapter(); 
     adapter.SelectCommand = new SqlCommand(sql, connection); 
     adapter.Fill(ds); 
    } 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     items.Add(dr["Name"].ToString()); 
    } 
    return items.ToArray(); 
} 

내 문제는 지금, 난 단지 데이터베이스에서 이름이 있는지 확인하십시오. 그러나 수색을 위해서 나는 ID가 필요합니다. 누가 텍스트 형식으로 표시하지 않고 ID를 쿼리 할 수 ​​있습니까? 내 문제를 이해하시기 바랍니다. 내 영어가 너무 좋지 않아 ...

도와 줘서 고마워!

답변

1

왜 프로젝트 ID를 객관적인 ID가 아닌 매개 변수로 전달해야합니까? 당신은 내가 사용자를 가정하고 Response.Redirect를를 사용하는 경우 선택 목록에서 프로젝트를 선택하고 코드 뒤에 이벤트 였을을 처리

public void onProjectSelected() 
    { 
     string cs = ConfigurationManager.ConnectionStrings["CSLinker"].ConnectionString; 
     string projectName = txtSearchInput.Text; 
     int projectID = 0; 
     using (SqlConnection connection = new SqlConnection(cs)) 
     { 
      using (SqlCommand command = new SqlCommand("SELECT ProjectID FROM TabProjects WHERE Name = @Name", connection)) 
      { 
       command.Parameters.Add(new SqlParameter("@Name", SqlDbType.VarChar, 50)).Value = projectName; 
       connection.Open(); 
       if (int.TryParse(command.ExecuteScalar().ToString(), out projectID)) 
       { 
        Response.Redirect(string.Format("?ProjectID={0}", projectID)); 
       } 
       connection.Close(); 
      } 
     } 
     //Handle project not found events here 
    } 

는 또한 그렇지 않으면 SQL Injection 사용 PARAMATERISED QUERIES이 하루 손상 될 수 있습니다!

텍스트 상자에 "테스트입니다"라고 입력하면 내가 사용한 아포스트로피가 다음 SQL이 될 것이므로 잘못된 SQL 문으로 끝납니다.

SELECT Name FROM tabProjects WHERE Name LIKE 'It's a test%' 

분명히 실행되지 않으며 웹 사이트를 사용하는 모든 사용자에게 훌륭한 사용자 환경이 아닙니다. 더 심각하게도 페이지의 텍스트 상자에 입력하려는 경우 , CSLinker 연결 문자열에 할당 된 사용 권한을 depapping하면 더 이상 tabProjects 테이블이없는 것을 확인할 수 있습니다.

SELECT Name FROM tabProjects WHERE Name LIKE ''; DROP TABLE tabProjects -- %' 

당신은 당신의 웹 방법이 같은 것을 사용한다 :

[WebMethod] 
    public string[] GetNames(string prefixText, int count) 
    { 
     List<string> items = new List<string>(); 
     string cs = ConfigurationManager.ConnectionStrings["CSLinker"].ConnectionString; 
     using (SqlConnection connection = new SqlConnection(cs)) 
     { 
      using (SqlCommand command = new SqlCommand("SET ROWCOUNT @Count SELECT Name FROM TabProjects WHERE Name LIKE @Name + '%'", connection)) 
      { 
       command.Parameters.Add(new SqlParameter("@Name", SqlDbType.VarChar, 50)).Value = prefixText; 
       command.Parameters.Add(new SqlParameter("@Count", SqlDbType.Int, 8)).Value = count; 
       connection.Open(); 
       using (SqlDataReader reader = command.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         items.Add(reader.GetString(0)); 
        } 
       } 
       connection.Close(); 
      } 
     } 
     return items.ToArray(); 
    } 
+0

이 매우 유용한 답변 주셔서 대단히 감사합니다! 정말로 나를 도왔습니다 – Luca

+0

@GarethD 프로젝트 이름이 고유하면 여기에 고유 한 프로젝트 이름이 있다고 가정합니다. 왜 OP가 ID 필드를 원하는지! – Damith

+0

@Damith 그렇습니다. 프로젝트 이름이 고유하지 않은 경우 좋은 점입니다. 사용자가 자동 ​​완성에 나타나는 2 개의 프로젝트 중 어떤 것을 선택할지 어떻게 알 수 있습니까? – GarethD