1

SearchMaster と SearchDetails の 2 つのプロシージャは、Sql Management Studio で実行すると機能し、SearchMaster は、ストアド プロシージャをデザイン ビューで設定するときにクエリをテストしているときにも正常に動作しますが、実行すると行が作成されません。 frn またはビジネスの情報のみを入力します。両方を入力すると、一致すればデータが取得されます。パラメータは正しく設定されていますか? また、プロシージャでパラメーターを null に初期化する場合、ConvertEmptyStringToNull を使用する必要がありますか?

SearchMaster StoredProcedure は次のとおりです。

CREAETE PROCEDURE SearchMaster
@business nvarchar(300) = NULL,
@frn nvarchar(10) = NULL
AS
SELECT h.Business,
       hrl.frn
FROM registration hrl
INNER JOIN holder h on h.call = hrl.call
WHERE (@business IS NULL OR h.Business like '%' + @business + '%') 
AND (@frn IS NULL OR hrl.frn = @frn)

SearchDetails StoredProcedure は次のとおりです。

CREATE PROCEDURE SearchDetails
@business nvarchar(300) = NULL,
@frn nvarchar(10) = NULL
AS
SELECT hrl.call 
FROM registration hrl 
INNER JOIN holder h ON h.call = hrl.call
WHERE (@business IS NULL OR h.Business LIKE '%' + @business + '%') 
  AND (@frn IS NULL OR hrl.frn = @frn)

SearchMaster プロシージャの SqlDataSource は次のとおりです。

<asp:SqlDataSource ID="sqlDsDetails" 
               runat="server" 
               ConnectionString="<%$ ConnectionStrings:cnxString %>
               SelectCommandType="StoredProcedure" 
               SelectCommand="SearchMaster">
<SelectParameters>
<asp:ControlParameter Name="business" ControlID="txtBusiness" 
                  Type="String" PropertyName="Text"  
                  ConvertEmptyStringToNull="true" />
<asp:ControlParameter Name="frn" ControlID="txtFRN" 
                  Type="String" PropertyName="Text"
                  ConvertEmptyStringToNull="true"/>
</SelectParameters>
</asp:SqlDataSource>

SearchDetails プロシージャの SqlDataSource は次のとおりです。

<asp:SqlDataSource ID="sqlDsDetails" 
               runat="server" 
               ConnectionString="<%$ ConnectionStrings:cnxString %>
               SelectCommandType="StoredProcedure" 
               SelectCommand="SearchDetails">
<SelectParameters>
<asp:Parameter Name="frn" Type="String" DefaultValue="" 
           ConvertEmptyStringToNull="true" />
<asp:Parameter Name="business" Type="String" DefaultValue="" 
           ConvertEmptyStringToNull="true" />
</SelectParameters>
</asp:SqlDataSource>

SqlDsMaster をバインドするボタン クリックは次のとおりです。

protected void btnSearch_Click(object sender, EventArgs e)
{
    sqlDsMaster.DataBind();
}

詳細の行を作成する gvMaster_RowCreated は次のとおりです。

protected void gvMaster_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        SqlDataSource ctrl = 
        e.Row.FindControl("sqlDsDetails") as SqlDataSource;

        if (ctrl != null && e.Row.DataItem != null)
        {
            ctrl.SelectParameters["frn"].DefaultValue = 
            ((DataRowView)e.Row.DataItem)["frn"].ToString();

            ctrl.SelectParameters["business"].DefaultValue = 
            ((DataRowView)e.Row.DataItem)["business"].ToString();
         }
     }
 }

SQL プロファイラーを実行しましたが、パラメーターを 1 つだけ入力すると、プロファイラーは実行中のプロシージャーを表示しませんでした。両方のパラメーターを入力すると、プロファイラーで実行中のプロシージャーが表示されました。

4

2 に答える 2

2

私の推測では、null の場合と見なされるものに対しては、まだ空の文字列を渡していると思います。次のようにして、これを除外できます。

CREATE PROCEDURE SearchDetails
@business nvarchar(300) = NULL,
@frn nvarchar(10) = NULL
AS

SELECT @business = NULLIF(@business, ''),
       @frn = NULLIF(@frn, '')

 SELECT hrl.call // etc

機能し始めた場合は、空の文字列が渡されていました。

于 2009-03-27T18:15:55.637 に答える
1

マーク・グラベルの考えは正しいと思います。

次のテストを試してください。

 SearchMaster @business = null        , @frn = null
 SearchMaster @business = 'something' , @frn = null
 SearchMaster @business = 'something' , @frn = 'something'
 SearchMaster @business = null        , @frn = 'something'
 SearchMaster @business = 'something' , @frn = 'something'
 SearchMaster @business = 'something' , @frn = ''
 SearchMaster @business = ''          , @frn = 'something'

DB に空白のビジネスと frn がない限り、最後の 2 つは何も返さないことに注意してください ;)

Marc の select ステートメントを AS 行の直後に配置すると、ステートメントは期待どおりに機能するはずです。

だから、このようなもの:

CREATE PROCEDURE SearchMaster
@business nvarchar(300) = NULL,
@frn nvarchar(10) = NULL
AS
SELECT @business = NULLIF(@business,'') , @frn = NULLIF(@frn,'')

SELECT h.Business,
       hrl.frn
FROM registration hrl
INNER JOIN holder h on h.call = hrl.call
WHERE (@business IS NULL OR h.Business like '%' + @business + '%') 
AND (@frn IS NULL OR hrl.frn = @frn)

また、DataSource で CancelSelectOnNullParameter="False" を設定してください。

于 2009-03-27T18:54:18.260 に答える