0

sqldatasourceなどのグリッドビューがあります。グリッドには、検索テキストボックスもあります。ユーザーがレコードをフィルタリングする必要がある場合は、パラメーターを使用してsqlプロシージャを使用してSqlDataSourceのSELECTステートメントを動的に調整し、テキストボックスから値を取得できます。ページングや並べ替えなどのすべての自動機能が気に入っているので、古い方法をバインドするだけでは不十分です。

手がかりはありますか?

ありがとう、

 <form id="form1" runat="server">
    <div>

        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
            SelectCommand="SelectCategorie" SelectCommandType="StoredProcedure">
            <SelectParameters>
                <asp:ControlParameter ControlID="TextBox1" Name="CategorieName" 
                    PropertyName="Text" Type="String" />
            </SelectParameters>
        </asp:SqlDataSource>
        <asp:SqlDataSource ID="SqlDataSource3" runat="server" 
            ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" 
            SelectCommand="SELECT [ProductName], [ProductID] FROM [Alphabetical list of products]">
        </asp:SqlDataSource>
        <br />
        <br />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="Button3" runat="server" Text="Button" />
        <br />
        <br />
        <asp:DropDownList ID="DropDownList1" runat="server" 
            DataSourceID="SqlDataSource3" DataTextField="ProductName" 
            DataValueField="ProductName">
        </asp:DropDownList>
        <br />
        <br />
                <asp:Button ID="Button2" runat="server" Text="Change the datasource" />
        <br />
        <br />
                <asp:GridView ID="GridView1" runat="server" 
                    DataKeyNames="ProductID" DataSourceID="SqlDataSource1">
                    <Columns>
                        <asp:BoundField DataField="ProductID" HeaderText="ProductID" 
                            InsertVisible="False" ReadOnly="True" SortExpression="ProductID" 
                            DataFormatString="[Yassine {0}]" />
                        <asp:BoundField DataField="ProductName" HeaderText="ProductName" 
                            SortExpression="ProductName" />
                        <asp:BoundField DataField="SupplierID" HeaderText="SupplierID" 
                            SortExpression="SupplierID" />
                        <asp:BoundField DataField="CategoryID" HeaderText="CategoryID" 
                            SortExpression="CategoryID" />
                        <asp:BoundField DataField="CategoryName" HeaderText="CategoryName" 
                            SortExpression="CategoryName" />
                        <asp:BoundField DataField="Description" HeaderText="Description" 
                            SortExpression="Description" />
                        <asp:BoundField DataField="QuantityPerUnit" HeaderText="QuantityPerUnit" 
                            SortExpression="QuantityPerUnit" />
                        <asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" 
                            SortExpression="UnitPrice" />
                        <asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock" 
                            SortExpression="UnitsInStock" />
                        <asp:BoundField DataField="UnitsOnOrder" HeaderText="UnitsOnOrder" 
                            SortExpression="UnitsOnOrder" />
                        <asp:BoundField DataField="ReorderLevel" HeaderText="ReorderLevel" 
                            SortExpression="ReorderLevel" />
                        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" 
                            SortExpression="Discontinued" />
                    </Columns>
                </asp:GridView>
        <br />
        <br />

    </div>
    </form>

と舞台裏のコード:

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        SqlDataSource1.SelectCommand = "SelectCategorieParDescription"
        SqlDataSource1.SelectParameters.Add("@ProductName", DropDownList1.DataValueField)
    End Sub
End Class

そしてこれは私が得た誤りです:

プロシージャまたは関数SelectCategorieParDescriptionに指定された引数が多すぎます

4

2 に答える 2

1

私たちはあなたがやりたいことについて同様のアプローチを使用します。難しい方法は次のとおりです(これに関する記事はここで見ることができます:

  1. 検索構文の文法を作成します
  2. その文法のパーサーを作成します
  3. 検索構文をSQL(WHERE部分)に変換するパーサーと一緒にインタープリターを作成します
  4. このwhereSql文字列を取得し、完全なクエリと連結してEXEC(@sqlQuery)を呼び出すことができるストアドプロシージャを作成します。

ただし、これにはしばらく時間がかかる場合があります。別のオプションとして、検索機能を単一の文字列に制限することもできます。例:

  1. 名前、socsecNumberの2つの列で検索できるクエリがあるとします。
  2. 文字列johnを読み取るときはいつでも、これを次のように変換します:'%john%'のような名前または(socsecNumberを文字列に変換)'%john%'のように
  3. %を常に使用するか、ユーザーの入力が次のような場合にのみ使用するかはあなた次第です:joh *
  4. whereクエリを受け取るストアドプロシージャは、次のようになります。

    ALTER PROCEDURE [dbo].[usp_SearchForObjectsForDashboard]
        @searchTerm as varchar(250)
    BEGIN
        ...
        SET @sql = 'SELECT ...
            ...
            WHERE someConditionOfYourOwn = whatever
             AND ' + @searchTerm
    
        EXEC(@sql) 
    END
    

それが役に立てば幸い

于 2012-05-08T22:45:29.407 に答える
0

できる限り詳しく説明します。質問にコーディングソリューションを提供することは、範囲を少し超えています。これにどのように取り組むかについての私の考えのいくつかを提供します。他の人もこれにいくつかの貴重なポイントを追加することを願っています。

検索はいくつかの方法で実装できます。それはすべてあなたの要件と検索の効率に依存します。あなたの質問から、あなたが達成しようとしているのは、検索といくつかのフィルタリングオプションを持つことだと思います

たとえば、従業員を検索したいとします(そして、名/姓/部門/マネージャーで検索したいとします)

簡単に始めるには、(GridViewとSqlDataSourceに加えて)

1)検索ボックスのテキストボックス。

2)オプションによる検索(4つのラジオボタンまたは、、、、をfirstname含むlastnameDropDownList )departmentmanager

3)ボタン

searchText4)2つのパラメータ( 、searchBy)を持つストアドプロシージャ

タイプに応じて、ストアドプロシージャで、次の方法でSearchBy選択した検索クエリを作成できます。searchText

擬似コード

if (searchBy == firstname)
{
    set @sql = select ...... where firstName = searchText
}
else if (searchBy == lastname)
{
    set @sql = select ...... where lastName = searchText
}
else if (searchBy == department)
{
    set @sql = select ...... where department = searchText
}
else if (searchBy == manager)
{
    set @sql = select ...... where manager = searchText
}

exec(@sql)

button_clickで、DropDownListまたはRadioButtonsearchTextのTextBoxからsqlDataSourceSelectParametersを変更します。 searchBy

繰り返しますが、これは最小限です。必要に応じてこれを拡張できます。例えば

1)likeselectクエリで句を使用して、完全一致ではなく類似一致を取得します(UIでは、完全一致と類似一致のどちらかを選択するオプションをユーザーに提供できます)

2)複数の列で検索するオプションをユーザーに提供できます

など(オプションは無限です。これも要件によって異なります)

于 2012-05-09T00:17:19.350 に答える