Abfrage in SQL mit Select geht nicht

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
tictac
Beiträge: 23
Registriert: Di 3. Apr 2012, 11:30

Abfrage in SQL mit Select geht nicht

Beitrag von tictac »

hallo,
ich bin völlig neu hier und habe auch nur Schulunterricht-erfahrungen mit Lazarus.
Ich habe nun in einer Anwendung mit MySQL Datenbank ein Problem. Ich kann zwar problemlos in eine datenbank etwas einfügen, aber ich kann irgendwie nichts auslesen.

Code: Alles auswählen

SQLQuery1.SQL.Clear;
               abfrage:=SQLQuery1.SQL.Add('SELECT count( proband )  FROM `probanden` WHERE proband = " '+ proband + ' "');
               SQLQuery1.Active:=true;
               SQLQuery1.Active:=false;   ;

wenn ich mir das Ergebnis davon aber ausgeben lasse, dann steht da immer 0, obwohl ich für proband namen von vorhandenen und nicht vorhandenen tabellen eingesetzt habe, es müssten also auch andere ergebnisse dabei herauskommen.

ich hoffe, es kann mir jemand helfen
vielen dank schonmal

tictac

Benutzeravatar
theo
Beiträge: 10885
Registriert: Mo 11. Sep 2006, 19:01

Re: Abfrage in SQL mit Select geht nicht

Beitrag von theo »

tictac hat geschrieben:obwohl ich für proband namen von vorhandenen und nicht vorhandenen tabellen eingesetzt habe,
Wie meinst du das?

tictac
Beiträge: 23
Registriert: Di 3. Apr 2012, 11:30

Re: Abfrage in SQL mit Select geht nicht

Beitrag von tictac »

hallo,
naja proband ist das, was der nutzer eingibt (der soll einen namen für eine neue tabelle eingeben). naja und ich will jetzt überprüfen, ob dieser name in der tabelle Probanden schon vorhanden ist (in dieser tabelle speichere ich die namen aller anderen tabellen). dazu hab ich halt namen eingegeben, die es schon gibt und solche, die es noch nicht gibt. aber als ergebnis kam immer nur 0 raus, was eben nicht sein kann, wenn es den eintrag schon gibt.

ist vllt von mir ungeschickt, aber die tabelle `probanden` hat nur eine spalte proband, darin soll ausgelesen werden, wie oft es schon einen eintrag "proband" gibt, wobei dieses proband der vom nutzer eingegebene name ist.

HOffen
Beiträge: 16
Registriert: Do 15. Mär 2012, 09:19
OS, Lazarus, FPC: Win7 (L 0.9.30.4RC3 FPC 2.6.0)
CPU-Target: 32Bit

Re: Abfrage in SQL mit Select geht nicht

Beitrag von HOffen »

Ich schätze das Problem liegt in der Syntax deiner Abfrage. Ich erinnere mich mit Schrecken an meine ersten Kontakte mit SQL als MySQL in Zusammenhang mit PHP. Da bekam ich auch keine Ergebnisse für meine Abfragen und letztendlich lag's an den Anführungszeichen, die falsch waren.

Ein normales " ' " (Apostroph) kannst du übrigens in Strings verwenden, indem du es verdoppelst. Alternativ kannst du auch "#39" als Entsprechung verwenden.

Probier damit mal ein bisschen rum. Vielleicht klappt's ja.
"There are 10 kinds of human. Those who understand the binary system and those who don't."

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Abfrage in SQL mit Select geht nicht

Beitrag von MmVisual »

Und die Leerzeichen nach / vor dem Apostroph müssen auch weg.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10885
Registriert: Mo 11. Sep 2006, 19:01

Re: Abfrage in SQL mit Select geht nicht

Beitrag von theo »

tictac hat geschrieben:hallo,
naja proband ist das, was der nutzer eingibt (der soll einen namen für eine neue tabelle eingeben). naja und ich will jetzt überprüfen, ob dieser name in der tabelle Probanden schon vorhanden ist (in dieser tabelle speichere ich die namen aller anderen tabellen). dazu hab ich halt namen eingegeben, die es schon gibt und solche, die es noch nicht gibt. aber als ergebnis kam immer nur 0 raus, was eben nicht sein kann, wenn es den eintrag schon gibt.

ist vllt von mir ungeschickt, aber die tabelle `probanden` hat nur eine spalte proband, darin soll ausgelesen werden, wie oft es schon einen eintrag "proband" gibt, wobei dieses proband der vom nutzer eingegebene name ist.
Naja, hat erstmal nichts mit deinem Problem zu tun, aber eine neue Tabelle pro User zu erstellen klingt nicht gerade gut.
Du hast ja wohl kaum verschiedenen Felddefinitionen für jeden User. Warum nicht eine Tabelle mit einem UserID Feld nehmeh?

tictac
Beiträge: 23
Registriert: Di 3. Apr 2012, 11:30

Re: Abfrage in SQL mit Select geht nicht

Beitrag von tictac »

danke erstmal, aber ich komme trotzdem nicht weiter:

also ich bin von der abfrage aus phpmyadmin ausgegangen:

Code: Alles auswählen

SELECT count( proband ) 
FROM `probanden` 
WHERE proband = 'proband'
der funktioniert dort auch...
wenn ich jetzt in dem code

Code: Alles auswählen

abfrage:=SQLQuery1.SQL.Add('SELECT count(proband) FROM probanden WHERE proband = "'+ proband + '" ')
1. die anführungszeichen bei der variable weglasse, dann kommt als fehler
MySQL50Connection1: Error executing query: Unknown column 'xyz' in 'where clause'
2. die `` bei probanden weglasse
oder 3. aus dem anführungszeichen zwei ' ' mache, dann kommt bei beiden
MySQL50Connection1: Error executing query: DUplicate entry 'xyz' for key 'PRIMARY'.
Aber genau das will ich ja damit ausschließen (danach soll in der if anweisung eine tabelle mit diesem namen erstellt werden, naja und wenn es nicht merkt, dass da was ist -es gibt ja immer 0 aus- dann muss ja dieser fehler kommen)

was könnte ich noch ausprobieren?

ich freu mich über hilfe!

tictac

tictac
Beiträge: 23
Registriert: Di 3. Apr 2012, 11:30

Re: Abfrage in SQL mit Select geht nicht

Beitrag von tictac »

theo hat geschrieben: Naja, hat erstmal nichts mit deinem Problem zu tun, aber eine neue Tabelle pro User zu erstellen klingt nicht gerade gut.
Du hast ja wohl kaum verschiedenen Felddefinitionen für jeden User. Warum nicht eine Tabelle mit einem UserID Feld nehmeh?
naja, das programm soll mal stammbäume erstellen können und da soll für jeden stammbaum eine eigene tabelle erstellt werden. (die den namen proband hat) und dann gibt es noch die tabelle probanden, wo dann die namen der tabellen abgespeichert sind.

tictac
Beiträge: 23
Registriert: Di 3. Apr 2012, 11:30

Re: Abfrage in SQL mit Select geht nicht

Beitrag von tictac »

MmVisual hat geschrieben:Und die Leerzeichen nach / vor dem Apostroph müssen auch weg.
das geht auch nicht...

was mich am meisten wundert ist, dass irgendwie gar keine SELECT befehle (auch welche ohne variablen) funktionieren. das, was ich probiert habe, gibt alles 0 aus.
INSERT dagegen funktioniert bestens..
:(

irgendwie bin ich ratlos

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Abfrage in SQL mit Select geht nicht

Beitrag von knight »

Du solltest mit Parametern arbeiten. Das erspart dir Probleme mit den Anführungszeichen (und verringert außerdem noch die Möglichkeiten für SQL Injections). Ein Beispiel (ist zwar für Firebird, sollte aber auch mit MySQL funktionieren) findest du hier: http://wiki.lazarus.freepascal.org/SQLdb_Tutorial1/de" onclick="window.open(this.href);return false;

knight

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Abfrage in SQL mit Select geht nicht

Beitrag von hde »

ich versteh deine Logik nicht.
Wenn du wissen willst, ob ein bestimmter Eintrag in deiner Tabelle ist, warum fragst du den nicht einfach ab, warum über count(*)?
Und .. was soll in "abfrage" denn kommen wenn dein SQL gar noch nicht aktiv ist?
Schreib mal ein paar Zeilen mehr (vom Code)
hde

tictac
Beiträge: 23
Registriert: Di 3. Apr 2012, 11:30

Re: Abfrage in SQL mit Select geht nicht

Beitrag von tictac »

knight hat geschrieben:Du solltest mit Parametern arbeiten. Das erspart dir Probleme mit den Anführungszeichen (und verringert außerdem noch die Möglichkeiten für SQL Injections). Ein Beispiel (ist zwar für Firebird, sollte aber auch mit MySQL funktionieren) findest du hier: http://wiki.lazarus.freepascal.org/SQLdb_Tutorial1/de" onclick="window.open(this.href);return false;
danke für den link!
ich hab das jetzt mal nur in einem neuen projekt ausprobiert, da funktioniert bisher auch alles, was ich will...
ich versuche das jetzt mal bei meinem projekt einzubauen, ich melde mich, wenn ich weitergekommen bin.
hde hat geschrieben:ich versteh deine Logik nicht.
Wenn du wissen willst, ob ein bestimmter Eintrag in deiner Tabelle ist, warum fragst du den nicht einfach ab, warum über count(*)?
hde
naja, ich weiß ja, was, wenn überhaupt, drin steht (nämlich genau das, was vom nutzer eingegeben wird), ich will ja nur wissen, dass das da drin steht... oder wie soll ich das sonst machen? Ich meine, ich habe gedacht, ich bekomme dann einfach eine Zahl raus (0 oder 1) und wenn 0 rauskommt, dann kann ich die neue tabelle erstellen, wenn nicht kommt eine fehlermeldung. oder denke ich falsch?
hde hat geschrieben:ich versteh deine Logik nicht.
Und .. was soll in "abfrage" denn kommen wenn dein SQL gar noch nicht aktiv ist?
hde
wie meinst du das? muss ich bei der reihenfolge der befehle was ändern?

danke dass ihr euch zeit nehmt mir zu helfen!
tictac

Benutzeravatar
theo
Beiträge: 10885
Registriert: Mo 11. Sep 2006, 19:01

Re: Abfrage in SQL mit Select geht nicht

Beitrag von theo »

hde meint, du machst einfach ein normales
SELECT * FROM `probanden` WHERE proband = .....
und dann checkst du über SQLQuery1.RecordCount; ob was da ist.

tictac
Beiträge: 23
Registriert: Di 3. Apr 2012, 11:30

Re: Abfrage in SQL mit Select geht nicht

Beitrag von tictac »

theo hat geschrieben:hde meint, du machst einfach ein normales
SELECT * FROM `probanden` WHERE proband = .....
und dann checkst du über SQLQuery1.RecordCount; ob was da ist.
achso, naja, das hatte ich auch probiert, das ging genauso nicht, da kam auch immer dasselbe (soweit ich mich erinnere 1) raus...

tictac
Beiträge: 23
Registriert: Di 3. Apr 2012, 11:30

Re: Abfrage in SQL mit Select geht nicht

Beitrag von tictac »

hallo!
vielen dank euch allen, jetzt funktioniert's!!!!

@knight: der link war gold wert! jetzt funktioniert das doch mit recordcount:

Code: Alles auswählen

SQLQuery1.close;
        SQLQuery1.SQL.clear;
         SQLQuery1.SQL.Text:='select proband from probanden where proband=:stname';
         SQLQuery1.Params.ParamByName('stname').AsString:=proband;
         SQLQuery1.recordcount;
         MySQL50Connection1.connected:=true;
         SQLTransaction1.active:=true;
         SQLQuery1.open;       
         if  SQLQuery1.recordcount <> 0 then //...
nur eine frage hätte ich noch: was ist eigendlich der rückgabewert von einer selectabfrage vom typ her (string?) ?

noch mal vielen dank für eure mühe!

viele grüße
tictac

Antworten