2011-03-17 3 views
0

J'utilise Winforms pour mon application & SQL Server en tant que base de données.récupération immédiate des données de la base de données sql à partir de winforms textbox

Je veux que dès qu'un texte est tapé dans une zone de texte, les résultats immédiats sont récupérés/recherchés à partir des tables de base de données SQL SERVER pour ce texte fourni.

Pour cela, je donne la requête suivante:

public partial class Form1 : Form 
{ 
    SqlConnection conn = new SqlConnection(); 
    public Form1() 
    { 
     conn.ConnectionString = "Trusted_Connection=true"; 
     conn.Open(); 
     InitializeComponent(); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 

     DataTable dt = null; 

     SqlCommand cmd = new SqlCommand ("SELECT * FROM items WHERE item_name LIKE'" + textBox1.Text + "%'", conn); 
     SqlDataReader reader = cmd.ExecuteReader(); 

     dt = new DataTable(); 

     dt.Load(reader); 

     dataGridView1.DataSource = dt; 

    } 
} 

Mais, comme cela va chercher des données à chaque fois de la base de données, donc il faut plus de temps, mais je veux une façon plus rapide. J'utiliserai donc DATASETS à cette fin, car les ensembles de données sont utilisés pour l'environnement déconnecté.

OU

Je vais d'abord aller chercher l'ensemble table d'éléments de la base de données à un GridView, affichage & lorsque le formulaire est ouvert. Maintenant, quand le texte est entré dans la zone de texte, alors il ne chercherait pas les données de la base de données sql, mais chercherait dans le GridView, serait-ce plus rapide?

de quelle manière serait efficace?

La table d'articles a 3,4 millions d'enregistrements.

+0

@Remus Rusanu: dans l'événement de changement de zone de texte, je devrais l'écrire? – sqlchild

+0

@Remus Rusanu: qu'est-ce qui est rapide? S'il vous plaît mentionner le code correct et complet – sqlchild

+0

Ne faites pas ce que Remus suggère, il va effacer toute votre table. –

Répondre

1

Quelle est la taille de votre tableau d'articles?

Si ce n'est pas grand, il suffit de le stocker dans un ensemble de données. Utilisez la même zone de texte mais recherchez dans l'ensemble de données.

Si c'est gros, je suggère d'utiliser une minuterie. Sur chaque changement de texte, redémarrez la minuterie de peut-être 0,5 secondes. lorsque le temporisateur s'est écoulé, interrogez uniquement la base de données. Cela empêche plusieurs requêtes pendant que l'utilisateur tape.

Sinon, si vous pouviez lire toute la table et l'affecter à la AutoCompleteCustomSource:

textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
foreach(DataRow row in dt.Rows) 
    textBox1.AutoCompleteCustomSource.Add(row["item_name"] as string); 
+0

monsieur, j'ai 3,4millions d'enregistrements dans la table des éléments – sqlchild

1

Oui. Utiliser un ensemble de données et le rechercher serait beaucoup plus rapide. Puisque vous utilisez WinForms, l'empreinte mémoire n'est probablement pas un problème à moins que vous ne récupériez un grand nombre de lignes de la base de données.

En outre, vous ne devriez probablement pas rechercher sur chaque changement de texte, mais attendez un peu de temps disons 2 secondes pendant lesquelles il n'y a pas de changements dans la zone de texte, puis récupérez. Sinon, vous seriez chercher pour tout nouveau personnage entré dans la zone de texte (je pense).

1

Une meilleure approche utilisera DataSet/DataTable. Lisez toutes les données de la table sur le formulaire et stockez-le dans le formulaire.

Questions connexes