【发布时间】:2010-10-15 19:39:21
【问题描述】:
我在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 留空,它应该返回所有匹配likebusiness。如果两者都输入,它应该只返回匹配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)
这是SearchMaster 过程的SqlDataSource:
<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>
这是SearchDetails 过程的SqlDataSource:
<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?
【问题讨论】:
-
当以 '%' 开头的字符串时要小心,因为这意味着您将无法在过滤列上使用索引。
-
详细说明您的意思。在这种情况下,我别无选择,我必须使用 LIKE
标签: c# asp.net tsql sqldatasource