![]() |
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:
Die Ausführung sieht so aus
SELECT * FROM Tabelle WHERE MeinFeld = 'String'
Delphi-Quellcode:
Die Exception
Query.sql.clear;
Query.sql.add(...); Query.open; // hier tritt Dann der Fehler auf Query.first;
Code:
Ich habe irgendwie keine Ahnung ...
... Exception class $C0000005 with Message 'Access violaton at 0x1003ba5b: read of address 0x00000000'
Danke für Hilfe Puke EDIT: Passiert nur bei Strings!!! |
AW: Probleme mit SELECT und Strings
Es sihet eher danach aus, dass die Komponente nicht instantiiert ist.
|
AW: Probleme mit SELECT und Strings
Ich habe die Abfrage schon einmal auf Integer umgewandelt! Ohne Probleme...
Das kann nicht das Problem sein :( |
AW: Probleme mit SELECT und Strings
Ist das wirklich die Query? Oder soll das nur ein Beispiel sein?
|
AW: Probleme mit SELECT und Strings
Zitat:
|
AW: Probleme mit SELECT und Strings
Zeig' doch mal bitte, was Du hier genau machst:
Delphi-Quellcode:
Bei .add passiert doch was anderes als ... und das SQL-Statement steht bestimmt nicht genauso anstelle der ...
Query.sql.add(...);
Es könnte also z. B. so aussehen:
Delphi-Quellcode:
oder eher so?
Query.sql.add('SELECT * FROM Tabelle WHERE MeinFeld = ''String''');
Delphi-Quellcode:
oder vielleicht mit Parameter?
Query.sql.add('SELECT * FROM Tabelle WHERE MeinFeld = ' + QuotedStr('String'));
Delphi-Quellcode:
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.
Query.sql.add('SELECT * FROM Tabelle WHERE MeinFeld = :Suchbegriff');
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. |
AW: Probleme mit SELECT und Strings
Zitat:
|
AW: Probleme mit SELECT und Strings
Zitat:
|
AW: Probleme mit SELECT und Strings
Sollte eigentlich nur ein Beispiel sein:oops:. Na dann:
Delphi-Quellcode:
Ich gehe davon aus das die Exception vom Open ausgeht, weil beim durchgehen der Prozedur mit dem Debugger bleibt der dort hängen!
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; Das Objekt wird während des constructors instanziiert und bleibt bis zum destructor vorhanden. |
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?
|
AW: Probleme mit SELECT und Strings
Delphi-Quellcode:
Da fehlt der Feldtrenner, es komt ja so was raus
SendSQlSelect('SELECT * FROM ' + IN_Table + ' WHERE ' + IN_Table + 'Name = ''' + IN_Data + '''';
Code:
Eine weiter Möglichkeit wäre noch zu prüfen, ob die Abfrage synchron oder asynchron ausgeführt wird.
SELECT * from TABELLE WHERE TABELLENAME = 'Beispiel'
|
AW: Probleme mit SELECT und Strings
das Feld heißt so.
Syncron und Asyncron? Damit kann ich momentan nichts anfangen :?: |
AW: Probleme mit SELECT und Strings
Wie wäre es denn hiermit:
Delphi-Quellcode:
Es soll Komponenten geben, die ein Close vor irgendwelchen Änderungen mögen.
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; Gruß K-H |
AW: Probleme mit SELECT und Strings
Du meinst
Delphi-Quellcode:
???
FdbquerySelect.Close;
Das funktioniert auch nicht! |
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; |
AW: Probleme mit SELECT und Strings
Dadurch bekomme ich die Fehlermeldung:cry::
Code:
X ist dann der IN_Data Wert.
[...] raised Exception class EDatabaseError with Message 'Parameter 'x' Not found'.
|
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:
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 |
AW: Probleme mit SELECT und Strings
Nein, getestet hatte ich mit 'Hallo'.
Bei mir hat die TZQuery kein MacroByName! |
AW: Probleme mit SELECT und Strings
Nicht MakroByName, sondern nur ParamByName. Hier noch mal ein anderes Beispiel, welches definitiv funktioniert :
Delphi-Quellcode:
So mache ich das ständig und es funktioniert.
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; Edit: Und hier noch die korrigierte Fassung aus Beitrag #15:
Delphi-Quellcode:
Ich hatte zweimal den Doppelpunkt vergessen und habe jetzt mal vorsichtshalber die Unterstriche entfernt.
query.sql.text := 'SELECT * FROM Tabelle WHERE Name = :INData';
query.parambyname('INData').AsString := 'blablabla'; {oder} query.parambyname('INData').AsInteger := 1; query.open; Beide Beispiele funktionieren mit allen gängigen Datenbankkomponenten. |
AW: Probleme mit SELECT und Strings
Danke :thumb:
Funktioniert einwandfrei!:-D |
AW: Probleme mit SELECT und Strings
Und was hattest Du jetzt falsch gemacht ?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 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