我在 a 中有以下 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
如果我通过 SQL Server Management Studio 运行它,SearchDetails
两者都可以工作,如果我为business
and输入两个数据,它就可以工作frn
,但如果我只输入一个,则不会返回任何数据。参数设置是否正确?另外,如果我在null
程序中初始化参数,是否还需要使用ConvertEmptyStringToNull
?