Creating AJAX Enabled Multi Keyword Database Search Engine
page 4 of 7
by Habiburahman Khaled
Feedback
Average Rating: This article has not yet been rated.
Views (Total / Last 10 Days): 7693/ 253

Database

The database used for the article is Northwind and it is hoped that users are acquainted and furnished with it. Those who do not have Northwind can get one from here.

Listing 1: Create the following View in your Database

CREATE VIEW [dbo].[CustomersView]
AS
SELECT CustomerID, CompanyName, ContactName, 
 ContactTitle, City, Country, Address, 
 ISNULL(CompanyName, '') + ' ' + ISNULL(ContactName, '') + 
 ISNULL(ContactTitle, '') + ' ' + 
 ISNULL(City, '') + ' ' + ISNULL(Country, ''AS FullDescription
FROM dbo.Customers
GO

The code in listing 1 is self descriptive; CustomerView has been created based on the Customers Table. A virtual column named FullDescription is added to the view which combines multiple columns into one.

There are two methods for searching multiple columns in the database table:

1.    To create a virtual column in view or stored procedure and use the + operator in SQL Server, CONCAT or CONCAT_WS in MySQL, and/or ||,CONCAT in ORACLE to combine the data into one.

2.    To use AND or OR logical operator for each single column that we are searching in.

In this article both of the above methods are used.

Listing 2: Part of Customer.aspx page

<form id="form1" runat="server">
    <div id="HeaderDiv" class="Header">
        <h1>Search for Customers in Northwind Database</h1>
    </div>
    <div id="ContentDiv" class="Content">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <div id="SearchControls" class="SearchControls">
            <asp:TextBox ID="SearchTextBox" runat="server" />
            <asp:DropDownList ID="SearchCriteriaList" runat="server">
                <asp:ListItem Selected="True" Value="AND">All</asp:ListItem>
                <asp:ListItem Value="OR">Any One</asp:ListItem>
                <asp:ListItem Value="Exact">Exactly</asp:ListItem>
            </asp:DropDownList>
            <asp:Button ID="BtnSearch" runat="server" Text="Search" 
              OnClick="BtnSearch_Click" />
            </div>
            <div style="text-align:center"> 
            <asp:UpdateProgress ID="UpdateProgressControl" runat="server">
                <ProgressTemplate>
                    <img src="images/spinner.gif" alt="loading.." />
                </ProgressTemplate>
            </asp:UpdateProgress>
            </div>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <div>
                    <asp:Label ID="RecordCount" runat="server" 
                        EnableViewState="False" Font-Bold="True"
                        Font-Size="Medium" Visible="False"></asp:Label>
                </div>
                <asp:GridView ID="CustomersGridView" runat="server" 
                  AutoGenerateColumns="false">
                    <Columns>
             <asp:BoundField DataField="CompanyName" HeaderText="Company Name" />
                      …
                    </Columns>
                </asp:GridView>
            </ContentTemplate>
            <Triggers>
             <asp:AsyncPostBackTrigger ControlID="BtnSearch" EventName="Click" />
            </Triggers>
        </asp:UpdatePanel>
    </div>
    <div id="ErrorDiv" runat="server">
    </div>
    </form>

The code in listing 2 shows the aspx page which resides all the controls used for the search application. This is not the complete page, it just shows you the controls and AJAX coding.

A Complete application can be downloaded from the download section.

Listing 3: The doSearch method

private void doSearch(string InputKeyword, string SelectCriteria)
{
  //define objects
  string strSQL;
  SqlConnection conn;
  SqlCommand command;
  SqlDataReader reader;
  if (SelectCriteria == "Exact")
  {
    strSQL = "SELECT  CustomerID, CompanyName," +
      "ContactName, ContactTitle, City," +
      "Country, Address FROM CustomersView WHERE (FullDescription LIKE '%";
    strSQL = strSQL + InputKeyword + "%')";
  }
  else
  {
//Define an array list and then assign User Enterd 
//information separated by "+",","," "
    String[]SearchArrayList = InputKeyword.Split(new Char[]
    {
      '+', ' ', ','
    }
    , StringSplitOptions.RemoveEmptyEntries);
 
    strSQL = "SELECT  CustomerID, CompanyName, ContactName," +
      "ContactTitle, City, Country, Address FROM CustomersView WHERE";
    String strJoin = string.Join("%') " + SelectCriteria +
      " (FullDescription LIKE '%", SearchArrayList);
//if you want to add another column to the search criteria 
//in place of using Virual Column
/* String strJoin2 = string.Join("%') " + SelectCriteria + 
  " (Country LIKE '%", SearchArrayList);
strSQL = strSQL + " ((ProductName LIKE '%" + strJoin + "%')" + "OR" + 
  "(Country LIKE '%" + strJoin2 + "%'))";*/
    strSQL = strSQL + " (FullDescription LIKE '%" + strJoin + "%')";
  }
  //read the connection from web.config file
  string ConnStr =
    ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
  //Intialize connection
  conn = new SqlConnection(ConnStr);
  // intialize command object
  command = new SqlCommand(strSQL, conn);
  try
  {
    //open connection
    conn.Open();
    //Intialize reader
    reader = command.ExecuteReader();
    //assign reader to Gridview datasource
    CustomersGridView.DataSource = reader;
    //Bind the data to Gridview
    CustomersGridView.DataBind();
    //Display the number of record found
    RecordCount.Text = "Your search for: <span style=color:blue>" +
      InputKeyword.ToString() + "</span>" + " Found " +
      CustomersGridView.Rows.Count.ToString() + " Matches";
    // close reader
    reader.Close();
  }
  catch (SqlException exception)
  {
    ErrorDiv.InnerHtml = "Error!" + "<br/>" + exception.Message;
  }
  finally
  {
    //close connection
    conn.Close();
  }
}

The code in Listing 3 defines the doSearch method which is located in the code-behind file of the aspx page that takes two parameters, the first one specifies user entered information in the search box, and the second one specifies the search option it could be either AND(All), OR(Any), or Exact(Exactly).

Listing 4: If you would like to add more fields to the search criteria use the following code

String strJoin2 = string.Join("%') " + SelectCriteria + 
    " (Country LIKE '%", SearchArrayList); 
 strSQL = strSQL + " ((ProductName LIKE '%" + strJoin + "%')" + 
    "OR"+"(Country LIKE '%" + strJoin2 + "%'))";

Listing 5: Calling the doSearch method from a button click event

protected void BtnSearch_Click(object sender, EventArgs e)
{
  //make sure that user enter something for search
  if (SearchTextBox.Text.Length != 0)
  {
   /*Block current thread for 1 second in order to see the spinner in AJAX
   progress control */
    System.Threading.Thread.Sleep(1000);
    string strCriteria = SearchCriteriaList.SelectedItem.Value;
    doSearch(SearchTextBox.Text.Trim(), strCriteria);
    RecordCount.Visible = true;
  }
}

The code in Listing 5 is calling the doSearch method from a button click event which takes values of a textbox named SearchTextBox, and dropdown list named SearchCriteriaList.

The Sleep method of Thread object is called to block the current thread for one second so the user can see the spinner image in AJAX progress control.


View Entire Article

Article Feedback

Title:  
Name:  
Url: ( Optional )
Comment:  
Please add 5 and 3 and type the answer here:

User Comments

Title: Creating AJAX Enabled Multi Keyword Database Search Engine   
Name: Ramesh
Date: 5/9/2008 9:19:43 AM
Comment:
Nice article...but here is a need of AJAX....?
Title: Re:Connect to remote database   
Name: H.Khalid
Date: 5/3/2008 12:23:15 AM
Comment:
Yes it does, but you will need to use OleDb classes inside of System.Data.OleDb namespace for data retrieval, and use Query instead of View.
Check out this link for connecting with Ms Access.
http://www.aspfree.com/c/a/Microsoft-Access/Connecting-to-a-Microsoft-Access-database-with-ASPNET/

thanks
Title: Re:Connect to remote database   
Name: sathish
Date: 5/2/2008 11:43:42 PM
Comment:
does the coding working in ms-access is possible or not....
please tell....
Title: Re:Connect to remote database   
Name: H.Khalid
Date: 4/14/2008 7:25:26 AM
Comment:
Well,Executing remote Stored Procedure, and Query requires some tricks. Check out this link for complete solution:
http://blog.sqlauthority.com/2007/10/06/sql-server-executing-remote-stored-procedure-calling-stored-procedure-on-linked-server/
Title: Re:Connect to remote database   
Name: Mohammed Tajuddin
Date: 4/14/2008 6:27:30 AM
Comment:
Hi Habib,
Thanks for your response. I am actually trying to do it in my database ms sql 2005 in remote computer. Can i do the same in remote database? I use database management tools to access to my database. Data type are text, int, string and char. please give me your tips...
Title: Re:Connect to remote database   
Name: H.Khalid
Date: 4/12/2008 4:46:18 AM
Comment:
Hi Tajuddin,
What Database System do you use?, the query I have provided should work fine.
If you are using SQL server right click on the Northwind Database then "New Query" then paste the code I have provided and click on the "Execute" Button in the toolbar.

thanks
Title: Connect to remote database   
Name: Mohammed Tajuddin
Date: 4/9/2008 7:12:06 AM
Comment:
Hi Habibur, I like your article and was looking for this sort of things. I am really struggling to sort out my problem. How can i create the view in my database? if i run the query to create view getting error 'can not add text and char', how can i fix this problem? is there any other way to create view? your response much appreciated ...
Title: Many thanks,   
Name: Wayne
Date: 4/8/2008 11:57:17 AM
Comment:
Hi again Habiburahman,

Many thanks for the added code - and for helping me no-end.

Kind regards,

W
Title: Gridview is not populated   
Name: mia
Date: 3/30/2008 6:24:55 PM
Comment:
Ok...brian fart...i forgot to change the connection string
Title: Gridview is not populated   
Name: mia
Date: 3/30/2008 6:19:07 PM
Comment:
Nothing happens when I run the code. I get the spinner.gif, but te GridView is not pupulated.
Title: iis   
Name: mia
Date: 3/30/2008 5:49:59 PM
Comment:
do I need iis in orde rto run the app?
Title: Re:AllowPaging   
Name: Habiburahman Khaled
Date: 3/3/2008 4:55:19 AM
Comment:
Thank you Wayne, I am glad that you liked the article.
For paging you will need to use DataSet classes since DataReader doesnt not support paging and filtering.
I have updated the sample in which paging is enabled you can download the new sample from the link bellow:
http://authors.aspalliance.com/KHabiburahman/SearchEngine%20.NET%203.zip

thanks
Title: AllowPaging   
Name: Wayne
Date: 2/20/2008 8:58:42 AM
Comment:
Nice article - helped me get my head around a few things.

Any chance you could add some code to allow paging - tried the simple AllowPaging="True" but obviously this didn't work. Been looking for a way to do this but as a newbie am getting stuck!
Title: SearchTextBox.Text.Length != 0)   
Name: protected void BtnSearch
Date: 2/6/2008 7:19:44 AM
Comment:
Threading.Thread.Sleep(1000);
string strCriteria = SearchCriteriaList.SelectedItem.Value;
doSearch(SearchTextBox.Text
Title: is calling the   
Name: is calling
Date: 2/6/2008 7:18:26 AM
Comment:
calling the doSearch method from a button click event which takes values of a textbox named SearchTextBox
Title: Great but   
Name: Radenko Zec
Date: 1/22/2008 1:50:50 PM
Comment:
This method is useful for small apps i think but for large web portals you must use Sql Server 2005 fulltextsearch .
Maybe it would be interesting to build implementation
fulltextsearch using Linq.
There isnt any article on using linq for fulltextsearch,and you cant use linq for fulltextsearch I think.
Maybe would be great to build some helper classes to do that.






Ads Powered by Lake Quincy Media
Community Advice: ASP | SQL | XML | Regular Expressions | Windows


©Copyright 1998-2008 ASPAlliance.com  |  Page Processed at 7/19/2008 10:53:03 PM  AspAlliance Recent Articles RSS Feed
About ASPAlliance | Newsgroups | Advertise | Authors | Email Lists | Feedback | Link To Us | Privacy | Search