2

私はグーグルからそれらのような検索をしたい。

Web サービスを使用して、データベースのすべてのデータをテキスト ボックスに表示できるようになりました。それは私のコードです:

Webフォーム.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を照会するにはどうすればよいですか? 私の問題を理解していただければ幸いです。私の英語はあまり上手ではありません...

助けてくれてありがとう!

4

1 に答える 1

1

プロジェクト 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 インジェクションによって 1 日が台無しになる可能性があります。

テキスト ボックスに「It's a test」と入力すると、使用したアポストロフィが次の SQL になるため、無効な SQL ステートメントになります。

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

これは明らかに実行されず、あなたの Web サイトを使用するすべての人にとって優れたユーザー エクスペリエンスではありません。もっと深刻なことに、あなたのページのテキスト ボックスに入力する'; DROP TABLE TabProjects --と、CSLinker 接続文字列に割り当てられたアクセス許可に応じて、tabProjects テーブルがなくなっていることがわかります。これは実行される SQL です。

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

Web メソッドには次のようなものを使用する必要があります。

    [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();
    }
于 2012-05-29T15:54:30.373 に答える