У меня есть следующий 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
оставлено пустым, должны возвращаться только данные, относящиеся к этому frn
. Если business
введено, а 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();
}
}
}
SearchMaster
и SearchDetails
оба работают, если я запускаю их через SQL Server Management Studio, и они работают, если я ввожу оба данных для business
и frn
, но если я ввожу только один, данные не возвращаются. Правильно ли выставлены параметры? Кроме того, если я инициализирую параметры null
в процедуре, нужно ли использовать ConvertEmptyStringToNull
?