Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi NexusDB Select eines Strings geht nicht (https://www.delphipraxis.net/133870-nexusdb-select-eines-strings-geht-nicht.html)

Roadrunner.1 11. Mai 2009 09:39

Datenbank: NexusDB • Version: 2 • Zugriff über: NexusDB Enterprise Manager

NexusDB Select eines Strings geht nicht
 
Hallo zusammen,

scheinbar bin ich einfach zu blöd, oder seh' den Wald vor Bäumen nicht.
OK es ist meine erste Datenbank die ich (versuche) zu programmieren, aber
so ganz unwissend bin ich trotzdem nicht.

Also, nachdem ich NexusDB (embendded) installiert und via SQL auch eine Tabelle
angelegt sowie einige Datensätze angelegt habe, versuche ich nun
via SELECT darauf zuzugreifen, und scheitere. Und das selbst mit dem
DBBrowser.

Ich habe eine einfache Tabelle mit 2 Spalten angelegt:
Delphi-Quellcode:
    SQL.Add('CREATE TABLE TREIHE (');
    SQL.Add('TREIHEID AUTOINC NOT NULL PRIMARY KEY, ');
    SQL.Add('REIHE VARCHAR(16) );');
Wenn ich nun folgenden SQL-Befehl via DBBrowser losschicke
funktioniert alles so wie gewünscht:

SELECT * FROM "TREIHE" Where TReiheID < 100;

Versuch ich aber:
SQL-Code:
SELECT * FROM "TREIHE" Where Reihe = 'Classic';
dann erhalte ich keine Datensätze zurück obwohl mehrere tausend
dem Suchkriterium entsprechen. Was mach ich falsch? :gruebel:

[edit=mkinzler]Diverse Tags eingefügt Mfg, mkinzler[/edit]

mkinzler 11. Mai 2009 09:47

Re: NexusDB Select eines Strings geht nicht
 
Steht da genau 'Classic' drin? Groß-/Kleinschreibung?

Elvis 11. Mai 2009 09:51

Re: NexusDB Select eines Strings geht nicht
 
Zitat:

Zitat von mkinzler
Steht da genau 'Classic' drin? Groß-/Kleinschreibung?

Oder sogar Leerzeichen vorne/hinten?
Wenn die Spalten als Char und nicht als VarChar angelegt werden, werden die Werten hinten mit Leerzeichen aufgefüllt.

Roadrunner.1 11. Mai 2009 10:26

Re: NexusDB Select eines Strings geht nicht
 
Ja, Groß/Kleinschreibung ist richtig, ich habe sogar den String per
Copy&Paste aus der Tabelle in die SQL-Abfrage kopiert.

Leerzeichen denke ich sollen nicht drin sein, wobei ich Leerzeichen
hinten auch damit ausgeschlossen habe indem ich in die Abfrage bis
zu 16 Leerzeichen hinzugefügt habe.

Das mit Char war sogar mein 1. Versuch. Aber auch dort funktionierte
es nicht, selbst wenn ich in den Select Leerzeichen hinten anfügte.

btw. Ich mach mit diesem Select nun schon ca. 4h rum, und hab' alles
ausprobiert was mir eingefallen ist, bevor ich hier postete.

Hier noch der Insert Befehl mit dem ich die Zeilen erstelle
vielleicht ist ja dort noch ein Fehler, mit diesem String zusammensetzen
in Delphi hab' ich es nicht so. Insbesondere wenn dort ' Zeichen mit drin
vorkommen.

Delphi-Quellcode:
    SQL.Clear;
    SQL.Add('INSERT INTO TREIHE ');
    SQL.Add('(REIHE)');
    SQL.Add('VALUES (''');
    SQL.Add(_s);
    SQL.Add(''');');
    ExecSQL;
wobei _s sich aus einem Array of String ergibt:

CS_Reihe : array[TModellreihe] of string = (
'',
'*****',
'Classic',
'Modern',
'Elegant',
'*****'
);

Und nur die 3 Einträge mit sinnvollem Inhalt in der DB gespeichert werden.

[edit=mkinzler] Mfg, mkinzler[/edit]

DeddyH 11. Mai 2009 10:36

Re: NexusDB Select eines Strings geht nicht
 
Steht das jetzt alles in einem Feld? Was kommt denn bei einem
SQL-Code:
SELECT Reihe FROM TReihe
heraus? 3 Datensätze oder nur einer?

Roadrunner.1 11. Mai 2009 10:57

Re: NexusDB Select eines Strings geht nicht
 
Nein nein, da kommen fast 50.000 Einträge raus. In _s ist immer nur
einer der Strings drin. Und dieser wird direkt daraus kopiert.

Code:
pseudocode: _s:=CS_Reihe[TModellreihe(1)];
Ich wollte damit nur zeigen das die Einträge in der DB konstante
Strings sind (aus Delphi Sicht), und (unter Delphi) da nichts davor
oder danach kommt (Leerzeichen, Tabulatoren, Zeilenendezeichen, usw.).
SQL-Code:
Begin von SELECT * FROM TREIHE:
TREIHEID REIHE
1 Elegant
2 Classic
3 Classic
4 Classic
5 Classic
6 Classic
7 Classic
...

Das zeigt der DBBrowser ja auch alles richtig an. Da aber niemand sonst
darüber berichtet das in NexusDB keine Selects funktionieren, denk ich
das ich den Fehler mach, nur seh' ich nicht wo.

[edit=mkinzler]Diverse Tags eingefügt Mfg, mkinzler[/edit]

DeddyH 11. Mai 2009 11:07

Re: NexusDB Select eines Strings geht nicht
 
Moment, ich dachte, TReihe ist eine Stammdatentabelle. Dann macht es aber keinen Sinn, dieselben Einträge mehrfach zu speichern.

mkinzler 11. Mai 2009 11:11

Re: NexusDB Select eines Strings geht nicht
 
Es geht doch nichts über (richtiges) Vertändnis der Noramlisierung :zwinker:

hoika 11. Mai 2009 11:38

Re: NexusDB Select eines Strings geht nicht
 
Hallo,

zeig doch mal deinen Delphi-Code rund um das Select.


Heiko

Roadrunner.1 11. Mai 2009 12:38

Re: NexusDB Select eines Strings geht nicht
 
1. Das soll meine Stamdatendatei werden, da soll später auch nur
für jede Zeile was anderes stehen, aktuell versuch ich erstmal
überhaupt einen Select auszuführen.

2. Normalisieren, ist das was ich machen will, denn die Ausgangsdaten
sind nichtmal in 1. Normalform. Aber gerade dafür brauch ich einen
Select um herauszufinden ob der entsprechende Eintrag schon exsistiert.

3. Delphicode rund um den SELECT ist insoweit irrelevant, da der von mir
verwendete SELECT Befehl schon im DBBrwoser von Nexus nicht funktioniert.
Genau das ist ja mein aktuelles Problem. Das dann in Delphi auch hinzubekommen,
das wäre dann der 2. Schritt.

Was ich also nicht schafe ist das, was ich ganz zu anfang schon schrieb,
im DBBrowser den Befehl
SQL-Code:
SELECT * FROM "TREIHE" Where Reihe = 'Classic'
auszuführen und dabei auch ein ergebnis zu erhalten.

Irgentwelche Ideen was man dabei beachten muss?

[edit=mkinzler]SQL-Tag eingefügt Mfg, mkinzler[/edit]

DeddyH 11. Mai 2009 12:41

Re: NexusDB Select eines Strings geht nicht
 
Bekommst Du denn so ein Ergebnis?
SQL-Code:
SELECT * FROM TREIHE Where Reihe LIKE '%Classic%'

hoika 11. Mai 2009 13:34

Re: NexusDB Select eines Strings geht nicht
 
Hallo,

oder so ?

SQL-Code:
SELECT * FROM TREIHE Where Reihe = "Classic"

Heiko

Trigger2003 12. Mai 2009 03:01

Re: NexusDB Select eines Strings geht nicht
 
oder mal sicherheitshalber so?

SQL-Code:
SELECT * FROM treihe WHERE TRIM(reihe) = 'Classic'
funktioniert bei mir einwandfrei im Nexus EnterpriseManager, allerdings mit Remote-Server

NexusDB unterstützt übrigens keine doublequotes bei Feldwerten, nur bei Feldnamen

mkinzler 12. Mai 2009 05:28

Re: NexusDB Select eines Strings geht nicht
 
Zitat:

NexusDB unterstützt übrigens keine doublequotes bei Feldwerten, nur bei Feldnamen
Wie die meisten DBMS

Roadrunner.1 12. Mai 2009 10:09

Re: NexusDB Select eines Strings geht nicht
 
Hallo Zusammen,

PROBLEM GELÖST :bounce2:

Allerdings weiß ich noch nicht so genau warum, aber das ist erstmal zweitrangig.

Wie ich weiter oben schon schrieb, fügte ich die Datensätze mit folgendem Code hinzu:

Delphi-Quellcode:
SQL.Clear;
SQL.Add('INSERT INTO TREIHE ');
SQL.Add('(REIHE)');
SQL.Add('VALUES (''');
SQL.Add(_s);
SQL.Add(''');');
ExecSQL;
Dies führt wohl zu irgendwelchen nicht sichtbaren Zeichen in der Datenbank. Setz ich den
VALUES Teil des Strings in einer einzigen Zeile zusammen funktioniert nämlich auch der SELECT.

Delphi-Quellcode:
SQL.Clear;
SQL.Add('INSERT INTO TREIHE ');
SQL.Add('(REIHE)');
SQL.Add('VALUES ('''+_s+''');');
Ich dachte es wäre egal was ich in die Stringliste schreibe, Hauptsache alles in Reihe gelesen macht
Sinn. Dies scheint aber nicht der Fall zu sein. OK, ich lern ja noch damit umzugehen und werde
zukünftig zusammenhängende Befehlsteile auch zusammen in nur einen String schreiben.

Danke nochmal an alle für die Tipps.

DeddyH 12. Mai 2009 10:12

Re: NexusDB Select eines Strings geht nicht
 
Sofern die verwendeten Komponenten das unterstützen, solltest Du das SQL sowieso parametrisieren.

hoika 12. Mai 2009 10:15

Re: NexusDB Select eines Strings geht nicht
 
Hallo,

genau wegen sowas benutzt man Parameter.

Delphi-Quellcode:
SQL.Clear;
SQL.Add('INSERT INTO TREIHE ');
SQL.Add('(REIHE)');
SQL.Add('VALUES (:Reihe)');
ParamByName('Reihe').AsString:= _s;
ExecSQL;
oder QuotedStr

Delphi-Quellcode:
SQL.Clear;
SQL.Add('INSERT INTO TREIHE ');
SQL.Add('(REIHE)');
SQL.Add('VALUES ('+QuotedStr(_s)+')');
ExecSQL;
Parameter sind aber schöner, gerade wenn es um Datumsangaben geht.
Warum dann 2 Sachen (Parameter/QuotedStr) mischen.


Heiko

Heiko

nahpets 12. Mai 2009 10:32

Re: NexusDB Select eines Strings geht nicht
 
Hallo,
Zitat:

Zitat von Roadrunner.1
Delphi-Quellcode:
SQL.Clear;
SQL.Add('INSERT INTO TREIHE ');
SQL.Add('(REIHE)');
SQL.Add('VALUES (''');
SQL.Add(_s);
SQL.Add(''');');
ExecSQL;

damit hast Du "Zeilenvorschub + Classic + Zeilenvorschub" in die Datenbank geschrieben. Alles zwischen den beiden ' wird in die Datenbank eingefügt und wenn in der Stringliste (SQL) per Add dazwischen Zeilen eingefügt werden, so landen auch die entsprechenden Zeilenumbrüche in der Datenbank.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz