SqlDataSource SelectCommand usando LIKE não funciona

Tenho o seguinte T-SQL em umSelectCommand:

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 efrn estão vinculados aos parâmetros de controle e devem retornar dados, mesmo que um ou ambos sejam deixados em branco, mas se eu inserir dados apenas parafrn por exemplo, ele não retorna nada. Acho que meu T-SQL não está fazendo a coisa certa e também não tenho certeza se estou lidando com olike corretament

se ambas as caixas de texto forem deixadas em branco, ele deverá retornar todos os dados. E sefrn é inserido, masbusiness é deixado em branco, ele deve retornar apenas dados relacionados a essefrn. E sebusiness se inserido, masfrn é deixado em branco, ele deve retornar todas as correspondênciaslike business. Se os dois forem inseridos, ele retornará dados correspondentes apenas aofrn e abusiness.

Também não tenho certeza se está fazendo oand is not null é realmente necessári

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

O acima lança uma "Referência de Objeto não definida para uma instância" quando atinge esta linha:

sqlDsMaster.SelectParameters[frn].DefaultValue = frn;

frn ebusiness são propriedades.

Aqui está oSearchMaster procedimento armazenado

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)

Aqui está oSearchDetails procedimento armazenado

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)

Aqui está oSqlDataSource para oSearchMaster procedure:

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

Aqui está oSqlDataSource para oSearchDetails procedure:

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

Aqui está o botão que liga oSqlDsMaster:

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

Aqui está ogvMaster_RowCreated que cria as linhas para os detalhes:

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

SearchMaster eSearchDetails ambos funcionam se eu o executar através do SQL Server Management Studio e funcionará se eu inserir os dois dados parabusiness efrn, mas se eu inserir apenas um, nenhum dado será retornado. Os parâmetros estão configurados corretamente? Além disso, se estou inicializando os parâmetros paranull no procedimento, ainda é necessário usarConvertEmptyStringToNull?

questionAnswers(3)

yourAnswerToTheQuestion