Autor Beitrag
Arne Danikowski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Fr 29.08.08 17:09 
Hallo, ich versuche mich grade an Queryabfragen.
Kann mir einer sagen warum forgende Abfrage zu einer Fehlermeldung führt:

ausblenden Delphi-Quelltext
1:
2:
Lagerdata.ADOEingangQuery.SQL.Text:=('Select * From Eingang Where Eingangsnummer=' +dbedit45.text);
Lagerdata.ADOEingangQuery.Open;
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Fr 29.08.08 17:27 
Was für ein Fehler?
ausblenden Delphi-Quelltext
1:
Lagerdata.ADOEingangQuery.SQL.Text:='Select * From Eingang Where Eingangsnummer=' +dbedit45.text;					

_________________
Markus Kinzler.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 29.08.08 17:33 
kann man so, ohne kristallkugel nicht sagen...

da braucht man (a) mehr code und (b) die tabellendeklaration und (c) die fehlermeldung...
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 29.08.08 20:04 
Lustig, ein Quiz. Au Fein. :dunce: Hier die möglichen Antworten
A - Es gibt gar keine Datenbank
B - Delphi ist nicht installiert
C - dbedit45.text enthält nichtnumerische Zeichen
D - Die Welt ist eine Scheibe

So, den Telefonjoker hast du noch, 50:50 auch. Und?

_________________
Na denn, dann. Bis dann, denn.
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Fr 29.08.08 20:06 
Das Publikum hat er ja hiermit schon gefragt :mrgreen:

_________________
Markus Kinzler.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 29.08.08 20:18 
Lösungsmöglichkeiten:
A) Use Infinite Inprobability Drive
B) Use Prepared Statements
C) Use Proper Escaping
D) Use Brain 1.0

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mo 01.09.08 10:13 
Hatte nicht gedacht dass das Quizz so schwer ist.

- Ich habe eine Access Datenbank (jep die Datenbank ist vorhanden) mit einer Tabelle (eigentlich sogar mehrere) huchu
- Ich arbeite mit Delphi 2007 (ist sogar installiert)
- enthält keine nichtnummerischen Zeichen (geht nicht das Feld ist ein AutoFeld Nummersich per Zufall)
- definitiv keine Scheibe nur bei Terry Pratchett

ich habe aber immer wieder ähnliche Probleme hier noch ein Beispiel. Ich möchte eine Tabelle nach dem Inhalt in einem edit Text Feld durchsuchen.
Die Ergebnisse sollen in enem Grid angezeigt werden.


ausblenden Delphi-Quelltext
1:
2:
lagerdata.ADOArtikelQuery.SQL.Text:=('select * from artikel where Seriennummer=  '+seriensuchedit.text);
lagerdata.ADOArtikelQuery.open;


Die Tabelle in der Datenbank heißt = artikel
die zu filternde Spalte = Seriennummer

ich möchte nur Dtaensätze anzeigen, die mit dem Inhalt in seriensuchedit.text übereinstimmen.

und hier die Fehlermeldung : Fehlender Operator in Abfrageausdruck 'Seriennummer=" aufgetreten.
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Mo 01.09.08 10:32 
Klingt als sei "seriensuchedit.text" ein Leerstring, also ''
Damit sieht das SQL wie folgt aus: select * from artikel where Seriennummer= und da fehlt dann halt einfach was.

Ich würde aber Punkt B von user profile iconBenBE beherzigen und Prepared Statements verwenden.

Dann sieht das SQL z.B. so aus: select * from artikel where Seriennummer=:SerienNr.
Über lagerdata.ADOArtikelQuery.SQL.ParamByName('SerienNr').AsInteger := 4711 kannst du dem ganzen dann den Wert zuweisen.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 01.09.08 10:33 
Hui, dann wirds lustig.

Gib die Query mal in eine Textdatei aus

ausblenden Delphi-Quelltext
1:
2:
3:
4:
// Die Klammern braucht's nicht
lagerdata.ADOArtikelQuery.SQL.Text:='select * from artikel where Seriennummer=  '+seriensuchedit.text;
lagerdata.ADOArtikelQuery.SQL.SaveToFile('c:\Foobar.txt');
lagerdata.ADOArtikelQuery.open;

Öffne die Textdatei, per Copy & Paste in Access reinschnipseln und dann schauen.

Wenn das nicht hilft:
DB leeren, packen und hier reinstellen. Kriegen wir schon hin. Auch wenn es nix mit Multiple-Choice und der Millionenfrage wird.

Ach, und die Sache mit den 'prepared Statements' ist auf jeden Fall besser, als eine per Hand zusammengebastelte Query.

_________________
Na denn, dann. Bis dann, denn.
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mo 01.09.08 10:45 
Ich hab das nochmal ausprobiert in der Textdatei steht dann zum Beispiel:

select * from artikel where Seriennummer= 1

In Access und auch in Delphi bekomme ich folgende Fehlermeldung:

"Datentypen in Kreterienausdruck unverträglich"
Robert.Wachtel
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 895
Erhaltene Danke: 7

Windows 7 Ultimate x64
D5 Ent, D7 Arch, RAD Studio 2010 Pro, VS 2008
BeitragVerfasst: Mo 01.09.08 10:57 
Nun, ich würde sagen, es scheint so als wären die Datentypen im Kriterienausdruck unverträglich. :mrgreen: Wie lautet das DDL-Statement der Spalte "Seriennummer"?
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 01.09.08 10:58 
Gut, und nun noch die gepackte Access-DB (kann auch leer sein) als ZIP. Alternativ Access öffnen, in der Tabellenbeareitung das Feld 'Seriennummer' auswählen und das als Screenshot hier einhängen.

Das Feld 'Seriennummer' ist vermutlich nicht numerisch.

_________________
Na denn, dann. Bis dann, denn.
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mo 01.09.08 11:04 
Das mit den prepared Statements gestaltet sich schwierig, da mein ADOQuery kein Opjekt von ParamByName kennt.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 01.09.08 11:08 
user profile iconArne Danikowski hat folgendes geschrieben:
Das mit den prepared Statements gestaltet sich schwierig, da mein ADOQuery kein Opjekt von ParamByName kennt.

Stimmt, die Eigenschaft heißt auch:
ausblenden Delphi-Quelltext
1:
MyQuery.Parameters.ParamByName['SerienNr']					

_________________
Na denn, dann. Bis dann, denn.
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mo 01.09.08 11:40 
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 01.09.08 11:49 
Das Feld 'Seriennummer' ist ein Text und daher musst Du auch mit einem Text vergleichen. Nimm die parametrierten Queries, dann passieren solche Geschichten nicht. ADO wird die Query dann automatisch korrekt formatieren.

_________________
Na denn, dann. Bis dann, denn.
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mo 01.09.08 12:35 
Erst einmal vielen Dank für Deine Gedult mit mir.

Ich bastle grade so an den paramentierten SQL Abfragen rum da geschieht es plötzlich: Fehler !! :D

Komm mir schon blöd vor aber ich hab noch den

Publikumsjoker.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Var suche:String;
suche:seriensuchedit.text
..
..
 lagerdata.ADOEingangQuery.SQL.Text:=
      'SELECT Seriennummer FROM Eingang WHERE Seriennummer = :seriennr';



so weit so gut aber bei.

ausblenden Delphi-Quelltext
1:
lagerdata.ADOEingangQuery.Parameters.ParamByName('seriennr').AsString:=suche;					


gibt es in meinem Query kein Objekt für AsString erkennt der nicht.
Soweit ich das verstanden habe muss man doch dem ParamByName einen Datatype zuweisen oder nicht?

Wenn ich statt ASString Value einsetzte (das Kennt er zumindestens) dann bekomme ich kein Fehlermeldung:
Aber es funktioniert auch nicht ich bekomme keine Daten.


Zuletzt bearbeitet von Arne Danikowski am Mo 01.09.08 12:39, insgesamt 1-mal bearbeitet
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 01.09.08 12:38 
ausblenden Delphi-Quelltext
1:
lagerdata.ADOWareneingangQuery.Parameters.ParamByName('seriennr').DataType := ftString;					

_________________
Na denn, dann. Bis dann, denn.
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mo 01.09.08 12:40 
ftString = undefinierter Bezeichner
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 01.09.08 12:46 
F1 = Delphi Hilfe. Und dann die Unit einbinden, in der dieser Wert definiert wurde (DB.PAS, denke ich).

_________________
Na denn, dann. Bis dann, denn.