Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probleme mit SELECT und Strings (https://www.delphipraxis.net/178667-probleme-mit-select-und-strings.html)

Puke 20. Jan 2014 16:54

Datenbank: Firebird • Version: 1.5 • Zugriff über: ZEOS Libary 7.1.2

Probleme mit SELECT und Strings
 
Hi,
Irgendwie scheine ich irgendetwas nicht ganz verstanden zu haben.
Ich versuche mittels Zeos und firebird diese Abfrage zu Starten:
Code:
SELECT * FROM Tabelle WHERE MeinFeld = 'String'
Die Ausführung sieht so aus
Delphi-Quellcode:
Query.sql.clear;
Query.sql.add(...);
Query.open; // hier tritt Dann der Fehler auf
Query.first;
Die Exception
Code:
... Exception class $C0000005 with Message 'Access violaton at 0x1003ba5b: read of address 0x00000000'
Ich habe irgendwie keine Ahnung ...

Danke für Hilfe
Puke

EDIT: Passiert nur bei Strings!!!

mkinzler 20. Jan 2014 17:02

AW: Probleme mit SELECT und Strings
 
Es sihet eher danach aus, dass die Komponente nicht instantiiert ist.

Puke 20. Jan 2014 19:39

AW: Probleme mit SELECT und Strings
 
Ich habe die Abfrage schon einmal auf Integer umgewandelt! Ohne Probleme...

Das kann nicht das Problem sein :(

Union 20. Jan 2014 19:53

AW: Probleme mit SELECT und Strings
 
Ist das wirklich die Query? Oder soll das nur ein Beispiel sein?

vagtler 20. Jan 2014 20:42

AW: Probleme mit SELECT und Strings
 
Zitat:

Zitat von Puke (Beitrag 1244588)
[...] Das kann nicht das Problem sein :(

Famous last words...

nahpets 20. Jan 2014 22:13

AW: Probleme mit SELECT und Strings
 
Zeig' doch mal bitte, was Du hier genau machst:
Delphi-Quellcode:
Query.sql.add(...);
Bei .add passiert doch was anderes als ... und das SQL-Statement steht bestimmt nicht genauso anstelle der ...

Es könnte also z. B. so aussehen:
Delphi-Quellcode:
Query.sql.add('SELECT * FROM Tabelle WHERE MeinFeld = ''String''');
oder eher so?
Delphi-Quellcode:
Query.sql.add('SELECT * FROM Tabelle WHERE MeinFeld = ' + QuotedStr('String'));
oder vielleicht mit Parameter?
Delphi-Quellcode:
Query.sql.add('SELECT * FROM Tabelle WHERE MeinFeld = :Suchbegriff');
ok, dann fehlt in Deinem Beispiel noch das Befüllen des Parameters, dass sollte aber nicht zu dem auftretenden Fehler führen, sondern eher zu einem ungültigen SQL-Statement.

Wenn es mit Integer funktioniert und nicht mit Zeichenfolgen, dann liegt der Fehler genau in an der Stelle, die Du uns durch ... verheimlichst.
Ohne eine Info über die drei ??? (achne, dass sind ja schöne Kinderbücher ;-)), also ohne den Inhalt der drei ... können wir bestenfalls die :glaskugel: bemühen, die Erfolgsaussichten tendieren jedoch gegen 0.

Perlsau 21. Jan 2014 04:28

AW: Probleme mit SELECT und Strings
 
Zitat:

Zitat von mkinzler (Beitrag 1244577)
Es sihet eher danach aus, dass die Komponente nicht instantiiert ist.

Würde in diesem Fall der Fehler nicht bereits bei Query.sql.clear; auftreten?

Perlsau 21. Jan 2014 04:31

AW: Probleme mit SELECT und Strings
 
Zitat:

Zitat von Puke (Beitrag 1244576)
EDIT: Passiert nur bei Strings!!!

Hast du die Strings in deiner Abfrage (Query.sql.add(...); ) auch gequoted (in Hochkommas gesetzt)?

Puke 21. Jan 2014 11:20

AW: Probleme mit SELECT und Strings
 
Sollte eigentlich nur ein Beispiel sein:oops:. Na dann:
Delphi-Quellcode:
Function TFireBird.DoRelationExists(IN_Table: String; IN_Data: WideString; Var OUT_Index: Integer):Boolean;
Begin
[...]
// Wenn ich hier das StringFeld durch ein IntegerFeld ersetze und die Werte anpasse funktioniert es
// einwandfrei. Nur der Sinn kommt dann abhanden ...
SendSQlSelect('SELECT * FROM ' + IN_Table + ' WHERE ' + IN_Table + 'Name = ''' + IN_Data + '''';
[...]
End;

Procedure TFireBird.SendSQLSelect(IN_Command: String);
Begin
FdbquerySelect.SQL.Clear;
FdbquerySelect.SQL.Add(IN_Command);
FdbquerySelect.Open; // Debugger gibt hier den Fehler aus!!!
FdbquerySelect.First;
End;
Ich gehe davon aus das die Exception vom Open ausgeht, weil beim durchgehen der Prozedur mit dem Debugger bleibt der dort hängen!
Das Objekt wird während des constructors instanziiert und bleibt bis zum destructor vorhanden.

hsg 21. Jan 2014 11:27

AW: Probleme mit SELECT und Strings
 
Mir fällt als erstes ein fehlendes Leerzeichen bzw. Punkt vor dem 'Namen =' auf. Dadurch wird der Inhalt von IN_TABLE mit 'Name' kombiniert. Heißt das Datenbankfeld wirklich so?

Union 21. Jan 2014 11:28

AW: Probleme mit SELECT und Strings
 
Delphi-Quellcode:
SendSQlSelect('SELECT * FROM ' + IN_Table + ' WHERE ' + IN_Table + 'Name = ''' + IN_Data + '''';
Da fehlt der Feldtrenner, es komt ja so was raus
Code:
SELECT * from TABELLE WHERE TABELLENAME = 'Beispiel'
Eine weiter Möglichkeit wäre noch zu prüfen, ob die Abfrage synchron oder asynchron ausgeführt wird.

Puke 21. Jan 2014 11:31

AW: Probleme mit SELECT und Strings
 
das Feld heißt so.

Syncron und Asyncron? Damit kann ich momentan nichts anfangen :?:

p80286 21. Jan 2014 11:34

AW: Probleme mit SELECT und Strings
 
Wie wäre es denn hiermit:
Delphi-Quellcode:
Procedure TFireBird.SendSQLSelect(IN_Command: String);
 Begin
 FdbquerySelect.SQL.Close;
 FdbquerySelect.SQL.Clear;
 FdbquerySelect.SQL.Add(IN_Command);
 FdbquerySelect.Open; // Debugger gibt hier den Fehler aus!!!
 FdbquerySelect.First;
 End;
Es soll Komponenten geben, die ein Close vor irgendwelchen Änderungen mögen.

Gruß
K-H

Puke 21. Jan 2014 11:41

AW: Probleme mit SELECT und Strings
 
Du meinst
Delphi-Quellcode:
FdbquerySelect.Close;
???

Das funktioniert auch nicht!

RWarnecke 21. Jan 2014 11:47

AW: Probleme mit SELECT und Strings
 
Warum nehmt Ihr keine Parameter. Hier braucht man sich keine Sorgen um die Formatierung in der SQL Anweisung machen.

Delphi-Quellcode:
query.sql.text = 'SELECT * FROM Tabelle WHERE Name = :IN_Data';
query.parambyname('IN_Data').AsString := 'blablabla';
{oder}
query.parambyname('IN_Data').AsInteger = 1;
query.open;

Puke 21. Jan 2014 11:57

AW: Probleme mit SELECT und Strings
 
Dadurch bekomme ich die Fehlermeldung:cry::
Code:
[...] raised Exception class EDatabaseError with Message 'Parameter 'x' Not found'.
X ist dann der IN_Data Wert.

himitsu 21. Jan 2014 12:00

AW: Probleme mit SELECT und Strings
 
Wer steht denn im IN_Data?
Wenn da z.B. \ oder ' drin vorkommt, dann muß es ja knallen.

Zitat:

Zitat von RWarnecke (Beitrag 1244680)
Warum nehmt Ihr keine Parameter.

Und Makros.
Der Name des Feldes kann ja nicht als Parameter übergeben werden.

Nja, oder alternativ die entsprechenden Funktion zum Quoten der Strings und Namen verwenden.

Delphi-Quellcode:
Query.Sql.Text = 'SELECT * FROM &Table WHERE &Field = :Data';
Query.MacroByName('Table').Value := QuoteIdent(IN_Table); // Ich glaub Makros werden nicht automatisch gequotet, bzw. ich bin mir relativ sicher.
Query.MacroByName('Field').Value := QuoteIdent(IN_Table + 'Name');
Query.ParamByName('Data').AsString := IN_Data;
Query.Open;

Query.Sql.Text = 'SELECT * FROM ' + QuoteIdent(IN_Table) + ' WHERE ' + QuoteIdent(IN_Table + 'Name') + ' = ' + QuoteText(IN_Data);
Query.Open;

// QuoteIdent und QuoteText entsprechend anpassen ... die heißen ja überall irgendwie anders

Puke 21. Jan 2014 12:10

AW: Probleme mit SELECT und Strings
 
Nein, getestet hatte ich mit 'Hallo'.
Bei mir hat die TZQuery kein MacroByName!

RWarnecke 21. Jan 2014 14:47

AW: Probleme mit SELECT und Strings
 
Nicht MakroByName, sondern nur ParamByName. Hier noch mal ein anderes Beispiel, welches definitiv funktioniert :

Delphi-Quellcode:
  UniQuery_MessageTypes.SQL.Clear;
  UniQuery_MessageTypes.SQL.Add('SELECT * FROM Message_Types WHERE IsStandard = :IsStandard;');
  UniQuery_MessageTypes.ParamByName('IsStandard').AsInteger := 1;
  UniQuery_MessageTypes.Open;
  while not UniQuery_MessageTypes.Eof do
  begin
    tmpIdx := Items.Add(UniQuery_MessageTypes.FieldByName('MessageTypeName').AsString);
    Items.Objects[tmpIdx] := TObject(UniQuery_MessageTypes.FieldByName('MessageTypeID').AsInteger);
    UniQuery_MessageTypes.Next;
  end;
  UniQuery_MessageTypes.Close;
  Items.EndUpdate;
So mache ich das ständig und es funktioniert.

Edit:
Und hier noch die korrigierte Fassung aus Beitrag #15:
Delphi-Quellcode:
query.sql.text := 'SELECT * FROM Tabelle WHERE Name = :INData';
query.parambyname('INData').AsString := 'blablabla';
{oder}
query.parambyname('INData').AsInteger := 1;
query.open;
Ich hatte zweimal den Doppelpunkt vergessen und habe jetzt mal vorsichtshalber die Unterstriche entfernt.

Beide Beispiele funktionieren mit allen gängigen Datenbankkomponenten.

Puke 21. Jan 2014 15:03

AW: Probleme mit SELECT und Strings
 
Danke :thumb:
Funktioniert einwandfrei!:-D

RWarnecke 21. Jan 2014 16:11

AW: Probleme mit SELECT und Strings
 
Und was hattest Du jetzt falsch gemacht ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 Uhr.

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