0

に次の T-SQL がありますSelectCommand

SELECT h.Business,
hrl.frn
FROM registration hrl
INNER JOIN holder h on h.call = hrl.call
WHERE 
(h.Business like '%' + @business + '%' and h.Business is not null) 
and 
(hrl.frn = @frn and hrl.frn is not null)

businessおよびfrn制御パラメーターに関連付けられており、一方または両方が空白のままであってもデータを返す必要がありますがfrn、たとえばデータを入力しても何も返されません。私のT-SQLは正しいことをしていないと思います。また、like正しく処理しているかどうかもわかりません。

両方のテキスト ボックスが空のままの場合は、すべてのデータが返されます。frnが入力されてbusinessいるが空白のままの場合、それに関連するデータのみが返されますfrnbusiness入力されたfrnが空白のままの場合、すべての一致を返す必要がありますlike business。両方が入力された場合、frnと に一致するデータのみが返されますbusiness

and is not nullまた、実際に必要かどうかもわかりません。

protected void btnSearch_Click(object sender, EventArgs e)
{
    if (txtFRN.Text == "")
        frn = null;

    if (txtBusiness.Text == "")
        business = null;

    sqlDsMaster.SelectParameters[frn].DefaultValue = frn;
    sqlDsMaster.SelectParameters[business].DefaultValue = business;

    sqlDsMaster.DataBind();
}

上記は、次の行に到達すると、「インスタンスに設定されていないオブジェクト参照」をスローします。

sqlDsMaster.SelectParameters[frn].DefaultValue = frn;

frnおよびbusinessプロパティです。


SearchMasterストアド プロシージャは次のとおりです。

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ストアド プロシージャは次のとおりです。

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)

手順は次のとおりSqlDataSourceです。SearchMaster

<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>

手順は次のとおりSqlDataSourceです。SearchDetails

<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();
         }
     }
 }

SearchMasterSQL Server Management Studio で実行すると両方とも機能し、とのSearchDetails両方のデータを入力すると機能しますが、1 つだけを入力するとデータは返されません。パラメータは正しく設定されていますか?また、プロシージャでパラメータを初期化する場合、引き続き を使用する必要がありますか?businessfrnnullConvertEmptyStringToNull

4

3 に答える 3

2

私は次のようなことをします:

where (@business is null
          or @business = ''
          or h.Business like '%' + @business + '%')
      and (@frn is null
              or @frn = ''
              or hrl.frn = @frn)

空の検索文字列を渡す前に null にすると、 @yyy = '' の部分をスキップできます。

于 2009-03-26T21:58:05.503 に答える
0

and is not null

ストアドプロシージャには正しいものがあります(@frn IS NULL OR hrl.frn = @frn)frnisnullまたは一致する場合は、任意の行を選択します。同じパターンがbusinessプロパティに適用されます。

NullReferenceException

sqlDsMaster.SelectParameters[frn].DefaultValue = frn;

のインデックスとして文字列の代わりにfrnプロパティの値(である可能性があります)を使用しているため、これは失敗します。次の行で、の代わりに同じエラーが発生します。null"frn"SelectParametersbusiness"business"

ConvertEmptyStringToNull

逆に質問をします。を使用している場合ConvertEmptyStringToNull、なぜ同じ機能で発信者に負担をかけたいのでしょうか。空の文字列がまたはの有効な値でない限り、frn呼び出し元では設定したbusinessままConvertEmptyStringToNullにして、気にしません。

それがあなたのすべての質問に答えることを願っています。

于 2009-05-12T10:57:24.560 に答える
0

変化する

"および h.Business は null ではありません"

「または h.Business は null です」

"および hrl.frn は null ではありません"

「またはhrl.frnがnullです」

これらのパラメーターが null の場合、すべてが返されます。

于 2009-03-26T21:57:36.503 に答える