Autor Beitrag
interessierter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: So 16.12.12 14:48 
Hallo Zusammen

Hab da ein kleines Problem mit einer Datenbank abfrage. Habe eine Datenbank mit ID, Name, Vorname angelegt und diese mittels C# mit Daten befüllt. Die Einträge werden mittels eines dataGridView angezeigt. Nun will ich die Datenbank nach Name durchsuchen, so das es mir im dataGridView alle Zeilen anzeigt, welche in der Kolone Name dem Suchbegirff entsprechen.

Habe schon sehr lange anch einer Anleitung gesucht, finde aber nichts passendes, zudem kriege ich immer dieselbe Fehlermeldung:

Fehler beim Analysieren der Abfrage. [Token line number = 1, token line offset = 37, token in error = likeMüller] (Müller ist mein Suchbegriff)

Folgend mein Lösungsansatz. Kann mir bitte jemand sagen was ich falsch gemacht habe?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
private void button5_Click(object sender, EventArgs e)//Datenbank nach Name durchsuchen und anzeigen
        {
            string suchbegriff = textBox8.Text;
            try
            {
                SqlCeDataAdapter ada = new SqlCeDataAdapter("select * from Kundenbank where Name like" + suchbegriff, con);
                DataTable dt = new DataTable();
                ada.Fill(dt);
                dataGridView1.DataSource = dt;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


Grüsse
interessierter
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 16.12.12 15:44 
Hallo,

da fehlen die Anführungsstriche im SQL-Ausdruck für den Suchbegriff.
Anstatt jedoch diese händisch hinzuzufügen, solltest du SQL-Parameter benutzen.

Bei einem Vergleich mittels "like" solltest du jedoch noch passende Wildcards einsetzen (% und/oder _), s. SQL Wildcards.
Diese mußt du dann aber an den SQL-Parameter selber hinzufügen, z.B.
ausblenden C#-Quelltext
1:
2:
3:
4:
sqlCommand.Parameters.AddWithValue("@SearchPattern", suchbegriff + "%");

// bzw. direkt mit einem SqlDataAdapter (ich selber habe dies aber noch nicht ausprobiert ;-)
sqlDataAdapter.SelectCommand.Parameters.AddWithValue("@SearchPattern", suchbegriff + "%");


P.S. Für Suche (bzw. Filterung) im DataGridView kannst du auch eine DataView und dessen Filter-Eigenschaft benutzen:
ausblenden C#-Quelltext
1:
dataTable.DefaultView.Filter = "Name like '" + suchbegriff + "%';					

(hier muß man (leider) von Hand die Parameter als string zusammensetzen)
interessierter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: So 16.12.12 23:29 
Ich habe es jetzt eher zufällig geschafft die Suchabfrage im dataGridView anzuzeigen, verstehe aber die Theorie bezüglich den Anführungsstrichen noch nicht. Ich möchte gerne wissen was die Anführungsstriche im folgenden Code bewirken. Was machen diese Anführungsstriche genau und wieso braucht es diese?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
private void button5_Click(object sender, EventArgs e)//Datenbank nach Name durchsuchen und anzeigen
        {
            string suchbegriff = textBox8.Text;
            try
            {
                SqlCeDataAdapter ada = new SqlCeDataAdapter("select * from Kundenbank where Name like'" + suchbegriff + "'", con);
                DataTable dt = new DataTable();
                ada.Fill(dt);
                dataGridView1.DataSource = dt;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


Gruss
interessierter
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 17.12.12 10:50 
Hallo,

die einfachen Anführungsstriche in SQL bedeuten das gleiche wie die doppelten Anführungsstriche in C#, also String-Literale.
Ohne die Anführungsstriche versucht SQL dies als Spaltenname zu interpretieren (bzw. da du im ersten Code das Leerzeichen vergessen hast, wurde dort "likeMüller" als fehlerhafter Operator angesehen).

Verwende aber zwingend die SQL-Parameter - ansonsten teste jetzt mal, was passiert wenn du "Müller's" als Suchbegriff eingibst :think:

Für diesen Beitrag haben gedankt: interessierter
interessierter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 75



BeitragVerfasst: Mo 17.12.12 22:15 
Das mit den Parametern und Wild Cards werde ich jetzt gleich als nächstes in Angriff nehmen, will ja schliesslich das die Suchfunktion in einer realen Situation in der Wirtschaft etwas taugen würde.(zumindest in einer Mini-Form) :)

Danke für die Wegleitungen. Jetzt ist mir auch die Therorie bez. den Literalen klar geworden. So nun ab ans Werk.

Es grüsst
interesierter