0

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

4

3 回答 3

2

我会做类似的事情:

where (@business is null
          or @business = ''
          or h.Business like '%' + @business + '%')
      and (@frn is null
              or @frn = ''
              or hrl.frn = @frn)

如果在传递空搜索字符串之前将其设为空,则可以跳过 @yyy = '' 部分。

于 2009-03-26T21:58:05.503 回答
0

改变

“而且 h.Business 不为空”

“或 h.Business 为空”

“而且 hrl.frn 不为空”

“或 hrl.frn 为空”

当这些参数为空时,这将返回所有内容。

于 2009-03-26T21:57:36.503 回答
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

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

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

于 2009-05-12T10:57:24.560 回答