Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 Uhr.
Seite 2 von 3     12 3      

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