2017-01-20 6 views
0

Lotus Notesデータベースを検索するためにユーザーがテキストボックスに名前を入力できるasp.netアプリケーションを作成しました。名前が入力されると、「Robert」と言われると、コードビハインドがデータベースを検索し、すべての結果(「Robert」というすべてのエントリ)をグリッドビューに表示します。特定の文字列が入力されている場合を除いて、テキストボックスからAsp.net検索データベース

問題は、私のデータベースには170,000以上のエントリがあります。したがって、それらをすべて同時にロードすることは不可能です。ページの読み込みに時間がかかり、ブラウザがタイムアウトするだけです。

私はこの問題を簡単な方法で修正しました。私は既に2000をロードしたときにエントリの読み込みを停止するように私のアプリケーションをコーディングしました。この方法では、ページの表示がずっと速くなりました。

ただし、テキストボックスに「Robert」と入力して[OK]ボタンをクリックすると、エントリは表示されません。アプリケーションはデータベース内で2000を超えるエントリを反復処理しないためです。

私は修正について考えました。ユーザーがテキストボックスに「[2000]」と入力すると、ページが再び読み込まれますが、今回は「[]」(つまり2000)の間に指定されたインデックスの後にエントリが読み込まれます。このようにして、ページを表示する時間に影響を与えずに、2000キャップをはるかに超えたエントリにアクセスできるようになります。

しかし、問題があります。テキストボックスに "[2000]"と入力すると、アプリケーションはデータベース内の "[2000]"というエントリを検索します。研究に例外を追加する方法はありますか?特定の文字列を入力するときと同じように、データベース内のテキストを調べるのではなく、別のコードを処理しますか?

私は自宅でこれを書いているので、コードはありません。コードは私のオフィスにあります。本当にコードが必要な場合は、私が明日何ができるかを見ていきます。しかし、誰かが私に探しているコードを提供することができれば、本当に感謝しています。

おかげ

答えて

0

使用<ajaxToolkit:AutoCompleteExtender>とWebサービスページのinit自体にデータをロードします。以下

は一例であり:

<asp:TextBox ID="txt1" MaxLength="80" class="form-control" runat="server"></asp:TextBox> 

<ajaxToolkit:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="txt1" ServiceMethod="returntxt1Data" 
MinimumPrefixLength="1" CompletionInterval="0" EnableCaching="false" OnClientItemSelected="ItemSelected"> 
</ajaxToolkit:AutoCompleteExtender> 

ポストバックするためにJavaScriptを書く:の.csページで

<script type="text/javascript"> 
    function ItemSelected(sender, args) { 
     __doPostBack(sender.get_element().name, ""); 
    } 
</script> 

Page_Init

public static List<string> List1= new List<string>(); 

protected void Page_Init(object sender, EventArgs e) 
{ 
    List1= LoadData(); //one time load data from database. 
} 
に静的変数荷重その変数を作成します

その後、それに応じて自動補完を表示するWebサービスを作成します。

[System.Web.Services.WebMethod] 
     public static List<string> returntxt1Data(string prefixText) 
     { 
      List<string> newlist1 = new List<string>(); 

      foreach (string a in List1) 
      { 
       if (a.ToUpper().Contains(prefixText.ToUpper())) 
       { 
        newlist1.Add(a); 
       } 
      } 
      return newlist1; 
     } 
0

あなたのロジックはかなりあなたのコードにも問題を抱えています。キーワードを使用してデータベースを検索するには、これを行う必要があります。 ので、一般的なアルゴリズムは

  1. 短いキーワード検索のための「名前のLIKE%キーワード%」文
  2. 使用FULLTEXT-SEARCHを使用するキーワードがタイトルのように、文である前に、私はロータスの注意を使用していません記事など。
  3. mysqlのsqlserverまたは "LIMIT {pagesize}"には常に "TOP {pagesize}"を使用してください。これにより、返されるレコードの数が制限され、より多くのデータが一致するかどうかを調べるためにページネーションを追加します。 (ロータス注意にこれの同等があるはずです)
  4. テキストボックスがそれらを試してみてデータベース

への不要な呼び出しを避けるために、空でないことを確認してください...

関連する問題