我在SelectCommand
中有以下T-SQL:
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();
}
}
}
如果我通过SQL Server Management Studio运行它, SearchMaster
和SearchDetails
都可以正常工作,如果我同时为business
和frn
输入数据,它就会起作用,但如果我输入只有一个,没有返回数据。参数设置正确吗?另外,如果我在过程中将参数初始化为null
,是否仍然需要使用ConvertEmptyStringToNull
?
答案 0 :(得分:2)
我会做类似的事情:
where (@business is null
or @business = ''
or h.Business like '%' + @business + '%')
and (@frn is null
or @frn = ''
or hrl.frn = @frn)
如果在传递空搜索字符串之前将其设为空,则可以跳过@yyy =''部分。
答案 1 :(得分:0)
更改
“和h.Business is not null”
到
“或h.Business is null”
和
“和hrl.frn不为空”
到
“或hrl.frn为空”
当这些参数为空时,它将返回所有内容。
答案 2 :(得分:0)
and is not null
”存储过程正确:(@frn IS NULL OR hrl.frn = @frn)
。如果frn
为null
或匹配,您想要选择任意一行。相同的模式适用于business
属性。
sqlDsMaster.SelectParameters[frn].DefaultValue = frn;
此操作失败,因为您使用frn
属性的值(可能是null
)而不是字符串"frn"
作为SelectParameters
的索引。您在使用business
而非"business"
的下一行时遇到相同的错误。
我会反过来提出问题:如果您使用的是ConvertEmptyStringToNull
,为什么要让调用者负担相同的功能呢?除非空字符串是frn
或business
的有效值,否则我会设置ConvertEmptyStringToNull
,而不关心调用者。
我希望能回答你所有的问题。