vb 2010 web表单sql数据源不使用所有参数

时间:2014-12-04 21:09:53

标签: asp.net vb.net visual-studio-2010

在VB.NET 2010 Web表单应用程序中。我希望用户能够选择不同的客户     基于是否选择了名字,姓氏或中间名。想法是让用户选择一个,两个和/或三个     参数并点击搜索键。

问题是结果只返回基于一个参数的数据。如果选择了多个参数的数据,则选择 标准被忽略。 当我在sql server management studio中运行sql时,我得到了我想要的结果。

那么你能告诉我我能做些什么来解决这个问题吗?

下面列出了出错的代码;

<%@ Page Title="" Language="VB" MasterPageFile="~/MasterPage.master" AutoEventWireup="false" CodeFile="Support.aspx.vb" Inherits="letters_Support" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MPHead" Runat="Server">   
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MPContent" Runat="Server">
<asp:Panel runat="server" ID="pnlSupport">    
<h3 style="text-align: center; border-style:none; ">Support Page</h3> 

  <table style="width: 100%;">          
      <tr>
        <td>
           Last Name: 
        </td>
        <td>
           <asp:TextBox ID="lname" runat="server"></asp:TextBox>
        </td>
        <td>
            First Name: 
        </td>
        <td>
           <asp:TextBox ID="fname" runat="server"></asp:TextBox>
        </td>
        <td>
             Middle Name: 
        </td>
        <td>
           <asp:TextBox ID="mname" runat="server"></asp:TextBox>
        </td>
         <td>
            Search by Name:
        </td>
        <td>
           <asp:Button ID="btnSearch" runat="server" Text="Search" />
        </td>            
    </tr>
</table>
<br /> 
  <asp:GridView ID="GridViewSupport" runat="server" AutoGenerateColumns="False"
    PageSize="25"
    GridLines="Both"
    EnableSortinAndPagingCallbacks="true"
    HeaderStyle-CssClass="ui-widget-header"
    PagerStyle-CssClass="ui-widget ui-widget-content"
    Width="100%" 
    EmptyDataText="No records were selected." 
    DataSourceID="sqlTEST" AllowPaging="True" AllowSorting="True" >
    <Columns>
        <asp:BoundField DataField="lastName" HeaderText="Last Name" SortExpression="lastName" ItemStyle-HorizontalAlign="Center" ItemStyle-CssClass="ui-widget-content" ControlStyle-CssClass="text required ui-widget-content ui-corner-all"/>
        <asp:BoundField DataField="firstName" HeaderText="First Name" SortExpression="firstName" ItemStyle-HorizontalAlign="Center" ItemStyle-CssClass="ui-widget-content" ControlStyle-CssClass="text required ui-widget-content ui-corner-all"/>
        <asp:BoundField DataField="middleName" HeaderText="Middle Name" SortExpression="middleName" ItemStyle-HorizontalAlign="Center" ItemStyle-CssClass="ui-widget-content" ControlStyle-CssClass="text required ui-widget-content ui-corner-all"/>
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="sqlTEST" runat="server" 
ConnectionString="<%$ ConnectionStrings:sqlTEST %>" SelectCommand="SELECT [lastName] 
        ,[firstName]  
        ,[middleName] 
        ,[suffix]  
        ,a.[userid]
        from [TEST].[dbo].[Identity] 
          where ([lastName] like  '%' + @lname  + '%' and
               [firstName] like'%' + @fname + '%' and
       [middleName]  like'%' + @mname + '%') 
       or ([lastName] like  '%' + @lname  + '%' and
               [firstName] like'%' + @fname + '%'  and
               @mname is null)                  
       or ([lastName] like  '%' + @lname  + '%' and
               [middleName] like'%' + @mname + '%'  and
               @fname is null) 
           or ([firstName] like  '%' + @fname  + '%' and
               [middleName] like'%' +  @mname + '%' and
               @lname is null) 
           or ([lastName] like  '%' + @lname  + '%' and
               @fname is null and
               @mname is null) 
    or (@lname is null and
               [firstName] like'%' +  @fname + '%' and
               @mname is null) 
            or (@lname is null and
               @fname is null and
               [middleName] like'%' +  @mname + '%')    
           or (@fname is null and @lname is null and @mname is null)     
      order by  [lastName], [firstName], [middleName]" 
    CancelSelectOnNullParameter="false"  >
<SelectParameters>
    <asp:ControlParameter ControlID="lname" Name="lname" PropertyName="Text" ConvertEmptyStringToNull="true" />
    <asp:ControlParameter ControlID="fname" Name="fname" PropertyName="Text" ConvertEmptyStringToNull="true" />
    <asp:ControlParameter ControlID="mname" Name="mname" PropertyName="Text" ConvertEmptyStringToNull="true" />
</SelectParameters>
</asp:SqlDataSource>
</asp:Panel>
</asp:Content>

2 个答案:

答案 0 :(得分:0)

我想在你的查询中有@mname is null这样的东西意味着查询的那一部分只在一个空盒子时才会触发,在这种情况下我很难过,但它也可能是一个大脑放屁。它所说的位

@fname is null and @lname is null and @mname is null

对我来说有点奇怪。您可能打算将您的字段名称放在那里。

答案 1 :(得分:0)

我看到可能出现的问题:

您的asp:ControlParameter未声明Type,默认为TypeCode.Object。尝试将其设置为String

<asp:ControlParameter ControlID="lname" Name="lname" PropertyName="Text" ConvertEmptyStringToNull="true" Type="String" />
<asp:ControlParameter ControlID="fname" Name="fname" PropertyName="Text" ConvertEmptyStringToNull="true" Type="String" />
<asp:ControlParameter ControlID="mname" Name="mname" PropertyName="Text" ConvertEmptyStringToNull="true" Type="String" />

您的查询逻辑比它需要的更复杂。尝试:

SELECT      [lastName]
            , [firstName]
            , [middleName]
            , [suffix]
            , a.[userid]
FROM        [TEST].[dbo].[Identity]
WHERE       ([lastName] LIKE '%' + @lname + '%' OR @lname IS NULL)
            AND ([firstName] LIKE '%' + @fname + '%' OR @fname IS NULL)
            AND ([middleName] LIKE '%' + @mname + '%' OR @mname IS NULL)
ORDER BY    [lastName]
            , [firstName]
            , [middleName]