Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Variable in Where-Klausel abfragen


havefun_2 - Mi 18.12.13 13:05
Titel: Variable in Where-Klausel abfragen
Hallo zusammen,
trotz ausgiebigem Suchen und Probieren,ist es mir nicht gelungen,eine SQL-Abfrage zu erstellen die eine Variable
auswertet.
So ungefähr habe ich es mir vorgestellt:

SQL-Anweisung
1:
WHERE        ("Spaltenname" ist "Variablenname")                    

im Abfragegenerator sieht es so aus:

SQL-Anweisung
1:
WHERE        (Kuerzel = '@sKuerz')                    

Seid bitte nachsichtig,ich bin kein erfahrener Programmierer

Danke,
Havefun

Moderiert von user profile iconTh69: SQL-Tags hinzugefügt


Ralf Jansen - Mi 18.12.13 13:11

Dafür brauchst du sogenannte Parameter im SQL.

Für ein Howto siehe zum Beispiel hier [http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_24_001.htm] das Thema "Parametrisierte Abfragen".


havefun_2 - Mi 18.12.13 14:31

Hallo Ralf,
Lesen heißt bei mir nicht unbedingt verstehen.

Es ist eine Access-Datenbank und für mich wäre eine Schritt für Schritt-Anleitung genau das Richtige.

Danke,
Havefun

Moderiert von user profile iconTh69: Full-Quote entfernt.


Ralf Jansen - Mi 18.12.13 14:36

Zitat:
Lesen heißt bei mir nicht unbedingt verstehen.


Verstehen und lernen bedeutet lesen, probieren, scheitern, und retry bis es geht. Du solltest es zumindest probieren. Lesen ist nur der kleinste Teil.

Zitat:
Es ist eine Access-Datenbank und für mich wäre eine Schritt für Schritt-Anleitung genau das Richtige.


Die auch noch gleich kompiliert. Na klar :roll:
Für den Königsweg mit Vorkauen bin ich der falsche Mann.


havefun_2 - Mi 18.12.13 14:57

Trotzdem danke für deine Mühe.
Havefun


Christoph1972 - Do 19.12.13 07:45

Guten Morgen!

Ich habe mir das hier [http://www.mycsharp.de/wbb2/thread.php?threadid=66704] angeeignet. Einfach durcharbeiten, lohnt sich, ganz sicher ;-)


havefun_2 - Fr 20.12.13 10:44

Hallo zusammen,
ich kriege das einfach nicht hin.
Dieser Datenbankkram macht mich völlig kirre.
Verstanden habe ich inzwischen,daß man in der Abfrage nicht direkt auf eine Variable zugreifen soll.
Der Weg führt also über Parameter.


C#-Quelltext
1:
this.einzelne_TelefonlisteTableAdapter.Abfr_TextBox2(this.telefon1DataSet.einzelne_Telefonliste);                    


Die Abfrage Abfr_TextBox2 sieht folgendermaßen aus:



SQL-Anweisung
1:
2:
3:
SELECT        ID, Teilnehmer, Tel_Nr, Kuerzel
FROM            [einzelne Telefonliste]
WHERE        (Teilnehmer LIKE "?")



Wenn mir jemand erklären könnte wie ich dem Parameter den Inhalt einer Variable (sKuerz) übergeben muß,
wäre Weihnachten gerettet.
Gruß,
Havefun

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: SQL-Tags hinzugefügt


Ralf Jansen - Fr 20.12.13 11:56

Ein Tableadapter generiert das eigentlich selber?

Du hast ja vermutlich im DataSet Designer den Tableadapter erzeugt und dann dort die Funktion 'Abfrage hinzufügen' (oder so ähnlich, ich benutzte selbst ein englisches VS da heißts 'Add Query') benutzt. Wenn du dort dein SQL mit Platzhalter für den Parameter eingibst sollte dir eine Methode erzeugt werden dem du nur noch die Variable übergeben mußt. Problem könnte hier sein wie man den Parameter angibt. ? könnte richtig sein wenn du einen Jet Treiber über ODBC benutzt (ich selbst benutzte kein ACCESS). Die Hochkommata sind aber bestimmt falsch. Parameter mußt du eigentlich nie Quoten. Es ist ja immer ein Variablenwert gemeint und kann nicht mit einem Spalten oder Tabellennamen verwechselt werden.

Die im Tableadapter erzeugten Methoden solltest bei dem angebotenen Präfix belassen und nicht umbenennen sondern nur ergänzen. Ich und viele andere würden sofort auf die Schlüsselbegriffe FillBY oder GetDataBy anspringen. Bei Abfr_TextBox2 mußt ich erst mal lang überlegen was das soll. Ein verständliches Namensschema wäre da die Parameter anzugeben also in deinem Fall GetDataByTeilnehmer bzw. FillByTeilnehmer.

Und dann solltest du die mit

C#-Quelltext
1:
einzelne_TelefonlisteTableAdapter.FillByTeilnehmer(this.telefon1DataSet.einzelne_Telefonliste, sKuerz)                    

aufrufen können. Für den Lerneffekt könntest du, wenn es dann funktioniert, mal in die generierte Methode reinschauen was der Designer den für Code erzeugt. Der liegt ja als stinknormaler C# Code in deinem Projekt rum.


Th69 - Fr 20.12.13 12:28

Hallo havefun_2,

daß du den Datenbank-Assistent von VS benutzt hast, um die SQL-Befehle zu erstellen, hättest du in deinem Beitrag erwähnen sollen. Ralf und Christoph sind wohl eher von manuellem Code ausgegangen.

Zu deinem Problem:
Lies dir mal die beiden Seiten Gewusst wie: Erstellen von Datenadaptern mit einem Assistenten [http://msdn.microsoft.com/de-de/library/zc6tc8ew%28v=vs.90%29.aspx] sowie der Link auf Gewusst wie: Konfigurieren von Parametern für Datenadapter [http://msdn.microsoft.com/de-de/library/30bys7z3%28v=vs.90%29.aspx] durch.


Ralf Jansen - Fr 20.12.13 12:53

@TH69: Ich glaube jetzt verwirren wir den Threadstarter nur. Ein Tableadapter benutzt zwar intern eine DataAdapter aber selbst ist er keiner. Und um zu wissen wie ein Tableadapter zu erzeugen und zu verwenden ist braucht man eigentlich nicht wissen wie ein DataAdapter funktioniert oder wie man den über einen Designer konfiguriert.


havefun_2 - Fr 20.12.13 14:18

Hallo zusammen.
erst mal vielen Dank für eure Hilfe.
Es tut mir leid wenn ich zu wenige/falsche Informationen weitergegeben habe.
Das mit dem Präfix habe ich verstanden und werde es zukünftig nur noch ergänzen.
Der momentane Stand ist der:

Anzeige im Konfigurations-Assistent für TableAdapter-Abfragen

SQL-Anweisung
1:
2:
3:
SELECT        Teilnehmer, Tel_Nr, ID, Kuerzel
FROM            [einzelne Telefonliste]
WHERE        (Teilnehmer LIKE ?)


C#-Quelltext
1:
2:
3:
4:
5:
private void button1_Click(object sender, EventArgs e)
{
    suchnam = textBox1.Text;
    this.einzelne_TelefonlisteTableAdapter.Abfr_TextBox(this.telefon1DataSet.einzelne_Telefonliste,suchnam);
}

Wenn ich einen Such-String in die textBox1 eingebe,wird er in die Variable übernommen.
In dem DataGridView wird aber kein Ergebnis angezeigt.

Anzeige im Konfigurations-Assistent für TableAdapter-Abfragen

SQL-Anweisung
1:
2:
3:
SELECT        ID, Teilnehmer, Tel_Nr, Kuerzel
FROM            [einzelne Telefonliste]
WHERE        (Teilnehmer IS NOT NULL)



C#-Quelltext
1:
2:
3:
4:
5:
private void button2_Click(object sender, EventArgs e)
{
    this.einzelne_TelefonlisteTableAdapter.Ges_List(this.telefon1DataSet.einzelne_Telefonliste);
    textBox1.Text = "";
}

Wird button2 betätigt erscheint die komplette Liste.

Bis dann,
Havefun

Moderiert von user profile iconTh69: SQL-Tags hinzugefügt
Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Ralf Jansen - Fr 20.12.13 14:29

Fehlen dir vielleicht in deinem suchnam Parameter die Wildcards. Wenn du per LIKE ohne Wildcards suchst dann wäre das nicht anders als wenn du auf Gleichheit prüfst. Dann würdest du aber im SQL auch gleich = verwenden und nicht LIKE.

Also zum Beispiel


C#-Quelltext
1:
this.einzelne_TelefonlisteTableAdapter.Abfr_TextBox(this.telefon1DataSet.einzelne_Telefonliste,'%' + suchnam + '%');                    


Edit. Deinen Code bitte in Tags schreiben. Gibt auch einen Knopf im Editor dafür (Die Combobox mit dem + Knopf daneben). Die Mods haben jetzt schon mehrmals hinter dir her korrigiert. Irgendwann haben die sonst keine Lust mehr ;)


havefun_2 - Fr 20.12.13 23:05

Hallo Ralf,
vielen Dank für deine Hilfe.
Die Abfrage funktioniert.
Unter "Bereiche" habe ich auch die Combobox gefunden und werde sie zukünftig benutzen.
Gruß,
Havefun

Moderiert von user profile iconTh69: Full-Quote entfernt