使用LIKE的SqlDataSource SelectCommand不起作用

时间:2009-03-26 21:45:26

标签: c# asp.net tsql sqldatasource

我在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)

businessfrn与控制参数绑定,即使其中一个或两个都留空,也应该返回数据,但是如果我只为frn输入数据,那么没有任何回报。我认为我的T-SQL没有做正确的事情,我也不确定我是否正确处理like

如果两个文本框都保留为空,则应返回所有数据。如果输入frn,但business为空,则只应返回与该frn相关的数据。如果输入business,但frn为空,则应返回所有匹配like business。如果同时输入两者,则应返回仅与frnbusiness匹配的数据。

另外,我不确定是否真的需要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;

frnbusiness是属性。


以下是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运行它,

SearchMasterSearchDetails都可以正常工作,如果我同时为businessfrn输入数据,它就会起作用,但如果我输入只有一个,没有返回数据。参数设置正确吗?另外,如果我在过程中将参数初始化为null,是否仍然需要使用ConvertEmptyStringToNull

3 个答案:

答案 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)。如果frnnull或匹配,您想要选择任意一行。相同的模式适用于business属性。

的NullReferenceException

sqlDsMaster.SelectParameters[frn].DefaultValue = frn;

此操作失败,因为您使用frn属性的值(可能是null)而不是字符串"frn"作为SelectParameters的索引。您在使用business而非"business"的下一行时遇到相同的错误。

ConvertEmptyStringToNull

我会反过来提出问题:如果您使用的是ConvertEmptyStringToNull,为什么要让调用者负担相同的功能呢?除非空字符串是frnbusiness的有效值,否则我会设置ConvertEmptyStringToNull,而不关心调用者。

我希望能回答你所有的问题。