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
?