Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQLite select geht nicht (https://www.delphipraxis.net/198618-sqlite-select-geht-nicht.html)

Dr. Jack 19. Nov 2018 12:02

Datenbank: sqlite • Version: 10.1 • Zugriff über: firedac

SQLite select geht nicht
 
Hallo zusammen,

ich habe von MSSQL auf die SQLite DB umgestellt, jedoch funktionieren jetzt einige select-Anweisungen nicht, die aber bereite in MSSQL funktionierten. Woran kann das liegen?

Delphi-Quellcode:
procedure TfrmGettingStarted.BitBtn5Click(Sender: TObject);
var
  Column: TListColumn;
   Item: TListItem;
   i:Integer;

begin



 if not main.dbMain.Connected then
    Exit;

 main.qryproducts.FetchOptions.AutoClose := False;
 main.qryproducts.SQL.Clear;



  for i := 1 to Length(edit12.text) do
    if not (edit12.text[i] in ['0'..'9'])
    then begin



            main.qryproducts.SQL.Add(' and fam_db.name like ');
            main.qryproducts.SQL.Add(QuotedStr(#37+edit12.text+#37));

            main.qryproducts.SQL.Add(' and fam_db.menge like ');
            main.qryproducts.SQL.Add(QuotedStr(#37+edit13.text+#37));
            //einheit
            main.qryproducts.SQL.Add(' and fam_db.einheit_kurz like ');
            main.qryproducts.SQL.Add(QuotedStr(#37+edit14.text+#37));
            //dafo
            main.qryproducts.SQL.Add(' and fam_db.dafo_kurz like ');
            main.qryproducts.SQL.Add(QuotedStr(#37+edit15.text+#37));
            //hersteller
            main.qryproducts.SQL.Add(' and fam_db.hersteller_lang like ');
            main.qryproducts.SQL.Add(QuotedStr(#37+edit16.text+#37));

           main.qryproducts.SQL.Add('order by fam_db.name asc, fam_db.menge asc');
           main.qryproducts.SQL.Add('ORDER_BY fam_db.name, (cast(menge as integer)) ASC');

          main.qryproducts.Open;
            //  main.qryproducts.ExecSQL;
         end

    else begin                     //pzn
            main.qryproducts.SQL.Add('SELECT *');
            main.qryproducts.SQL.Add('FROM fam_db')           ;
            main.qryproducts.SQL.Add(' WHERE fam_db.nr_pzn like ')  ;
           main.qryproducts.SQL.Add(QuotedStr(#37+edit12.text+#37));


            main.qryproducts.Open;
    end;



 listview2.Items.Clear;


 while not main.qryproducts.Eof do
     begin
        saveitemdata( main.qryproducts.fieldbyname('nr_pzn').asString, main.qryproducts.fieldbyname('name').asString, main.qryproducts.fieldbyname('menge').asString, main.qryproducts.fieldbyname('einheit_kurz').asString, main.qryproducts.fieldbyname('dafo_kurz').asString, main.qryproducts.fieldbyname('hersteller_lang').asString ,main.qryproducts.fieldbyname('n_bez').asString ,main.qryproducts.fieldbyname('bestand').asString, main.qryproducts.fieldbyname('listen_vk').asString   );

         main.qryproducts.Next;
     end;



end;
[FireDAC][Phys][SQLite] ERROR: near "and": syntax error

FireDAC Executor Error
The application performed an incorrect operation with the database.
-------------------------------------------
Message text: near "and": syntax error
Error code: 00001
Error kind: Other
Server object:
Command text offset: 2
-------------------------------------------
Command text: and fam_db.name like
'%aspirin%'
and fam_db.menge like
'%%'
and fam_db.einheit_kurz like
'%%'
and fam_db.dafo_kurz like
'%%'
and fam_db.hersteller_lang like
'%%'
order by fam_db.name asc, fam_db.menge asc
ORDER_BY fam_db.name, (cast(menge as integer)) ASC
Command parameters:
-------------------------------------------
Exception class name: ESQLiteNativeException
FireDAC error code: 1600
FireDAC object name: main.qryProducts

DeddyH 19. Nov 2018 12:12

AW: SQLite select geht nicht
 
Was geschieht, wenn Du Deine Abfrage parametrisierst und das ORDER_BY (scheint eine Art Makro zu sein) einmal weglässt?

mkinzler 19. Nov 2018 12:13

AW: SQLite select geht nicht
 
Zudem fehlt die Grundabfrage. Es get mit ' and ...' los.

hhcm 19. Nov 2018 12:16

AW: SQLite select geht nicht
 
Ich würde sagen, dass dies selbst bei MSSQL nicht funktioniert hat. Wenn ich das richtig lese fängt der SQL Befehl mit

and fam_db.name like

an.
Da fehlt was.

p80286 19. Nov 2018 12:19

AW: SQLite select geht nicht
 
Da fehlt ein "Select"!
Delphi-Quellcode:
if not (edit12.text[i] in ['0'..'9'])
     then begin
        main.qryproducts.SQL.Text:='Select irgendwas from irgendeinetabelle '+
                                   'where irgendeinFeld=irgendwas ';


             main.qryproducts.SQL.Add(' and fam_db.name like ');
             main.qryproducts.SQL.Add(QuotedStr(#37+edit12.text+#37));
Gruß
K-H

Dr. Jack 19. Nov 2018 12:21

AW: SQLite select geht nicht
 
stimmt, das war allerdings ein Flüchtigkeitsfehler. Es geht so los:
...
Delphi-Quellcode:
             main.qryproducts.SQL.Add('Select name from fam_db where fam_db.name like')  ;
            main.qryproducts.SQL.Add(QuotedStr(#37+edit12.text+#37));

            main.qryproducts.SQL.Add(' and fam_db.menge like ');
            main.qryproducts.SQL.Add(QuotedStr(#37+edit13.text+#37));
...

hhcm 19. Nov 2018 12:25

AW: SQLite select geht nicht
 
Schau dir vor dem öffnen des Querys mal den Inhalt an. Da du nicht mit Parametern arbeitest sollte dort das komplette Statement zu sehen sein.

Code:
main.qryproducts.SQL.Text

Jasocul 19. Nov 2018 12:28

AW: SQLite select geht nicht
 
Zitat:

Zitat von Dr. Jack (Beitrag 1418424)
Command text: and fam_db.name like
'%aspirin%'
and fam_db.menge like
'%%'
and fam_db.einheit_kurz like
'%%'
and fam_db.dafo_kurz like
'%%'
and fam_db.hersteller_lang like
'%%'
order by fam_db.name asc, fam_db.menge asc
ORDER_BY fam_db.name, (cast(menge as integer)) ASC

Zitat:

Zitat von Dr. Jack (Beitrag 1418429)
stimmt, das war allerdings ein Flüchtigkeitsfehler. Es geht so los:
...
Delphi-Quellcode:
             main.qryproducts.SQL.Add('Select name from fam_db where fam_db.name like')  ;
            main.qryproducts.SQL.Add(QuotedStr(#37+edit12.text+#37));

            main.qryproducts.SQL.Add(' and fam_db.menge like ');
            main.qryproducts.SQL.Add(QuotedStr(#37+edit13.text+#37));
...

Dein Command-Text sagt, dass es kein Flüchtigkeitsfehler war, sondern tatsächlich fehlt(e).
Mach doch mal sowas, bevor das Statement ausgeführt wird:
Delphi-Quellcode:
main.qryproducts.SQL.SaveToFile(<DeinDateiname>);
Danach schaust dir das Statement an oder führst es manuell aus. Dann siehst du vermutlich genauer, was da schief läuft.

Dr. Jack 19. Nov 2018 12:36

AW: SQLite select geht nicht
 
Danke für den Tip mit der Ausgabe. Funktioniert wunderbar im MSSQL...

Select * from fam_db where fam_db.name like
'%aspirin%'
and fam_db.menge like
'%%'
and fam_db.einheit_kurz like
'%%'
and fam_db.dafo_kurz like
'%%'
and fam_db.hersteller_lang like
'%%'
order by fam_db.name asc, fam_db.menge asc

hhcm 19. Nov 2018 12:40

AW: SQLite select geht nicht
 
Ich hab´s kurz ausprobiert. Funktioniert auch wunderbar in SQLite.

Dr. Jack 19. Nov 2018 12:59

AW: SQLite select geht nicht
 
Also der select muss sauber sein...

Trotzdem: [FireDAC][Phys][SQLite] ERROR: near "Select": syntax error

Dieser Aufruf ohne Daten aus einem Edit-Feld zu benutzen geht aber...

Delphi-Quellcode:
main.qryproducts.SQL.Add('select * from fam_db where fam_db.name like '+ quotedstr('%aspirin%') );
main.qryproducts.Open;
ist das irgendwie falsch?
Delphi-Quellcode:
  main.qryproducts.SQL.Add(' Select * from fam_db where fam_db.name like ')  ;
            main.qryproducts.SQL.Add(QuotedStr(#37+edit12.text+#37));

hhcm 19. Nov 2018 13:03

AW: SQLite select geht nicht
 
Falsch ist relativ, ich würde es trotzdem immer parametrisieren.

Delphi-Quellcode:
 main.qryproducts.SQL.Add(' Select * from fam_db where fam_db.name like :param1') ;
 main.qryproducts.ParamByName('param1').AsString := '%'+edit12.text+'%';

DeddyH 19. Nov 2018 13:06

AW: SQLite select geht nicht
 
Und SQL.Add fügt immer neue Zeilen hinzu, alter Inhalt wird dabei weder gelöscht noch überschrieben.

Jasocul 19. Nov 2018 13:07

AW: SQLite select geht nicht
 
Abgesehen von der Parametrisierung, kann ich mir höchstens noch vorstellen, dass der Zeilenumbruch nach dem "like" ein Problem verursacht.

jobo 19. Nov 2018 13:41

AW: SQLite select geht nicht
 
Schau mal, ob noch irgendwo eine nicht ausgeführte, commitete Table Änderung rumfliegt, besonders eine, die Spalten hinzufügt, die Du in Deinem Statement benutzt.

Alternativ schau in Deiner Tabelle oder im Ergebnis des funktionierenden Statements, ob die Spalten alle vorhanden sind, von denen Du glaubst, dass sie da sind.

Delphi.Narium 19. Nov 2018 13:53

AW: SQLite select geht nicht
 
Was ist denn edit12?

Ein TEdit oder irgendwas anderes?

Ja nach Typ hat .Text am Ende noch 'nen Zeilenumbruch (das ist z. B. bei TMemo.Text der Fall).

Damit wird dann ein fehlerhaftes SQL zusammengestellt.

Da der Fehler aber near "Select" heißt, liegt er vermutlich auch in der Nähe des Wortes select.

Die beiden SQLs, die den Unterschied zwischen funktioniert und funktioniert nicht darstellen sollen, unterscheiden sich nicht nur im Wert hinter dem Like (bzw. wie der aufgebaut wird), sondern auch an dem Text (Leerzeichen?) vor dem Select.

Mal den "Debugger für Arme" nutzen und es so versuchen:
Delphi-Quellcode:
 main.qryproducts.SQL.Add(' Select * from fam_db where fam_db.name like ') ;
            main.qryproducts.SQL.Add(QuotedStr(#37+edit12.text+#37));
ShowMessage(main.qryproducts.SQL.text);
Die Anzeige per Strg+C und Strg+V hier posten, eventuell sieht man dann ja mal, was da wirklich im SQL steht und nicht nur, was man anhand der Quelltextfragmente vermuten würde.

Achso: Für den Fall, dass sich mal in edit12.text irgendwo ein Hochkomma befinden sollte, wird die Methode scheitern, dann entsteht automatisch ein ungültiges SQL.

Einfach zuerst mal den Aufruf auf Parameter umstellen. Und wenn das dann nicht funktioniert, nochmal fragen.

So, wie es momentan ist, kann man keine dauerhaft vollumfänglich fehlerfreie Ausführung des Selects realisieren, da man ein dateninduziert fehlerhaftes SQL nicht ausschließen kann.

Noch ein achso:

QuotedStr quoted delphikonform und nicht SQL-konform.

Ungefähr sowas sollte da am Ende mal bei rauskommen:
Delphi-Quellcode:

function LikeParam(AValue : String) : String;
begin
  Result := '%' + AValue + '%';
end;

begin
...
  main.qryproducts.Close;
  main.qryproducts.SQL.Clear;
  main.qryproducts.SQL.Add('select * from fam_db'
  main.qryproducts.SQL.Add('where fam_db.name like :Name');
  main.qryproducts.SQL.Add('and fam_db.menge like :Menge');
  main.qryproducts.SQL.Add('and fam_db.einheit_kurz like :Einheit_kurz');
  main.qryproducts.SQL.Add('and fam_db.dafo_kurz like :Dafo_kurz');
  main.qryproducts.SQL.Add('and fam_db.hersteller_lang like :Hersteller_lang');
  main.qryproducts.SQL.Add('order by fam_db.name asc, fam_db.menge asc');
  main.qryproducts.ParamByName('Name').AsString := LikeParam(edit12.text);
  main.qryproducts.ParamByName('Menge').AsString := LikeParam(edit13.text);
  main.qryproducts.ParamByName('Einheit_kurz').AsString := LikeParam(edit14.text);
  main.qryproducts.ParamByName('Dafo_kurz').AsString := LikeParam(edit15.text);
  main.qryproducts.ParamByName('Name').AsString := LikeParam(edit16.text);
  main.qryproducts.Open;
Damit dürfen dann auch Hochkommas in der Eingabe enthalten sein und wenn jemand in der Eingabe noch SQL-Fragmente erfasst, die bei der bisherigen Logik zu 'nem gültigen SQL führen, bleibt das schadlos und führt nicht zu irgendwelchen kontraproduktiven Nebenwirkungen (nennt man zuweilen schonmal SQL-Injection).

Dr. Jack 19. Nov 2018 14:21

AW: SQLite select geht nicht
 
so nach 6 Stunden Frust:

Delphi-Quellcode:
 main.qryproducts.FetchOptions.AutoClose := False;
 main.qryproducts.SQL.Clear;

       name_edit:=edit12.Text;
       menge_edit:=edit13.Text;
       einheit_edit:=edit14.Text;
       dafo_kurz_edit:=edit15.Text;
       hersteller_edit:=edit16.Text;
    begin                           //name
            main.qryproducts.SQL.Add('select * from fam_db where fam_db.name like '+ quotedstr('%'+(name_edit) +'%') );
            main.qryproducts.SQL.Add('and fam_db.menge like '+ quotedstr('%'+(menge_edit) +'%') );
            main.qryproducts.SQL.Add('and fam_db.einheit_kurz like '+ quotedstr('%'+(einheit_edit) +'%') );
            main.qryproducts.SQL.Add('and fam_db.dafo_kurz like '+ quotedstr('%'+(dafo_kurz_edit) +'%') );
            main.qryproducts.SQL.Add('and fam_db.hersteller_lang like '+ quotedstr('%'+(hersteller_edit) +'%') );
            main.qryproducts.SQL.Add('order by fam_db.name asc, fam_db.menge asc');

            main.qryproducts.Open;

 listview2.Items.Clear;
ich weiß gerade nicht warum genau sowas funktioniert, aber es geht. Vielleicht hat SQLite ein Problem, wenn Daten direkt aus einem Edit-Feld kommen...
Danke wie immer an die fleißigen Leute mit den guten Tips.
Das mit dem Hochkomma werde ich noch anpassen. Da habe ich gar nicht dran gedacht...Gut zu wissen

TOP :-D

hoika 19. Nov 2018 14:49

AW: SQLite select geht nicht
 
Hallo,
bei einem Deiner letzten Statements stand das Order by doppelt

main.qryproducts.SQL.Add('order by fam_db.name asc, fam_db.menge asc');
main.qryproducts.SQL.Add('ORDER_BY fam_db.name, (cast(menge as integer)) ASC');


Ausserdem hattest du +37 statt dem % genommen.

Die Statements sind also auch so verschieden gewesen.

So wie du es jetzt hast, ist es zumindestens etwas besser lesbar, aber Parameter sind noch besser (Stichwort: Sql-Injection)

mkinzler 19. Nov 2018 16:50

AW: SQLite select geht nicht
 
Warum sieht man immer wieder komische Konstrukte
wie
main.qryproducts.SQL.Clear;
main.qryproducts.SQL.Add('select * from fam_db')...


Wenn die Alternative
Delphi-Quellcode:
main.qryproducts.SQL.Text := 'select * from fam_db';
viel sauberer und schneller ist.

Delphi.Narium 19. Nov 2018 18:19

AW: SQLite select geht nicht
 
Weil damit klargemacht werden sollte, dass das SQL vor dem Befüllen leer sein muss, das war in den bisherigen Beispielen nicht klar, so dass der Fehler auch von einem Select stammen konnte, dass (irrtümlich) an ein bereits vorhandenen SQL "darangepappt" wurde. Das führt nämlich genau zu der Fehlermeldung.

Außerdem macht man im Quelltext keine derartigen .Text := 'irgendwas'-.Add-Orgien. Solche SQLs werden einmalig ausformuliert und dann als Konstanten, Resourcen ... abgelegt, so dass im Quelltext nur noch diese zugewiesen werden müssen und anschließend werden die Parameter befüllt.

Aus den obigen 15 Zeilen von mir werden dann nur noch acht Zeilen.

Und wenn man dann mal die Datenbank wechseln muss, muss man nur noch an einer (möglichst zentralen) Stelle die SQL-Statement-Konstanten-Resourcen ... anpassen. Für den Rest des Quelltextes ist das transparent: Sprich: da muss man dann nicht mehr ran.

p80286 19. Nov 2018 20:25

AW: SQLite select geht nicht
 
Dann sei doch so nett und formulier es einmal "richtig" damit der TE ein sauberes Vorbild hat.

Gruß
K-H

haentschman 20. Nov 2018 06:52

AW: SQLite select geht nicht
 
Moin...8-)
Zitat:

Warum sieht man immer wieder komische Konstrukte
wie
main.qryproducts.SQL.Clear;
main.qryproducts.SQL.Add('select * from fam_db')...
...:thumb: ...:kotz:
Zitat:

muss man nur noch an einer (möglichst zentralen) Stelle die SQL-Statement-Konstanten-Resourcen ... anpassen.
...du sprichst mir aus der Seele. :cheer:
Das Tutorial erklärt wie man es machen könnte. http://www.delphipraxis.net/49505-sq...einbinden.html
Zitat:

Dann sei doch so nett und formulier es einmal "richtig" damit der TE ein sauberes Vorbild hat.
1. Immer statt SQL.Clear; SQL.Add -> SQL.Text verwenden
2. immer Parameter! .ParamByName('Name').AsString := 'blubb';
3. wenn möglich auf LIKE verzichten

:zwinker:

hoika 20. Nov 2018 12:27

AW: SQLite select geht nicht
 
Hallo,
naja.

1. SQL immer als Ressource, tztz.

2. Das schlecht lesbare SQL.Text statt mehrzeiligem SQL.Add.
Wenn ich das SQL in Abhängigkeit einiger Einstellugen im Formular selber zusammenbauen will (z.B. zurückgegebene Spalten=Felder einstellbar),
kann ich den SQL-Text dynamisch zusammenbauen pder SQL.Add benutzten. Ich finde 2eres besser.

3. immer Parameter bentzen
natürlich volle Zustimmung

1/3 -> 33% Zustimmung, mehr als bei den heutigen Parteien ;)

Delphi.Narium 20. Nov 2018 12:51

AW: SQLite select geht nicht
 
Sagen wir mal so:

Wenn ich zur Entwicklungszeit nicht weiß, wie das SQL zur Laufzeit aussehen wird, dann muss ich es natürlich zur Laufzeit erstellen und kann es nicht als Konstante, Resource ... ablegen ;-)

Bei meinem Delphi ruft der Setter für SQL.Text übrigens implizit ein Clear auf ;-)

haentschman 20. Nov 2018 13:00

AW: SQLite select geht nicht
 
Zitat:

SQL immer als Ressource, tztz.
Wie meinst du das?
Zitat:

Wenn ich zur Entwicklungszeit nicht weiß, wie das SQL zur Laufzeit aussehen wird, dann muss ich es natürlich zur Laufzeit erstellen und kann es nicht als Konstante, Resource ... ablegen
Auch Kostanten oder Ressourcen kann man dynamisch im QT zusammenbauen.

hoika 20. Nov 2018 13:13

AW: SQLite select geht nicht
 
Hallo,
wäre mir viel zu aufwendig.
schon alleine das Debuggen stelle ich mir nicht so einfach vor.

DB-Service-Methode
z.B.
Select Id,Name,Vorname From Person
Where Id=:Id

Wie baust du das mit Ressourcen?

var
Res_Select, Res_Person_Id: String;
sSQL: String;
begin
Res_Select := LoadFromResource();
sSQL:= Res_Select+','+Res_Person_Id+','+Res_Person_Name usw?

Jasocul 20. Nov 2018 13:55

AW: SQLite select geht nicht
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1418528)
Wenn ich zur Entwicklungszeit nicht weiß, wie das SQL zur Laufzeit aussehen wird, dann muss ich es natürlich zur Laufzeit erstellen und kann es nicht als Konstante, Resource ... ablegen ;-)

Richtig. Aber dann bastel ich mir doch lieber eine Klasse, die das für mich erledigt.
Für mehr oder weniger feste Statements sind Ressourcen schon ein guter Weg, den ich auch verwende.

Delphi.Narium 20. Nov 2018 14:02

AW: SQLite select geht nicht
 
Sagen wir mal so: Konstante und Resource impliziert für mich, dass wird zur Entwicklungszeit festgelegt und ändert sich dann nicht mehr.

Zur Laufzeit erstellen impliziert für mich, dass es eine Klasse oder sonstwie sinnvoll und geeignete Methode gibt, die den Aufbau der Statements übernimmt.

haentschman 20. Nov 2018 14:04

AW: SQLite select geht nicht
 
Zitat:

Wie baust du das mit Ressourcen?
...einfach. :wink:

1: gemeinsam für alle SQL. Auf dem Datenmodul z.B.
Delphi-Quellcode:
function TDatabaseIB.GetSQLByName(SQLName: string): string;
var
  SQLStream: TResourceStream;
  SQLStrings: TStringList;
begin
  Result := '';
  SQLStrings := TStringList.Create;
  try
    SQLStream := TResourceStream.Create(HInstance, SQLName, PWideChar(conDatabaseResourceGroupString[FDatabaseProperties.DBMS]));
    try
      try
        SQLStrings.LoadFromStream(SQLStream);
        Result := SQLStrings.Text;
      except
        Result := '';
      end;
    finally
      SQLStream.Free;
    end;
  finally
    SQLStrings.Free;
  end;
end;
2. Im QT (Beispiel)
Delphi-Quellcode:
function TDatabaseIB.GetLastRead(ParameterID: Integer): TDateTime;
var
  Qry: TUniQuery;
begin
  Qry := CreateQuery;
  try
    Result := 0;
    Qry.SQL.Text := GetSQLByName('SER_GET_LAST_READ'); // ! mehrzeiliges SQL weil viele Felder oder so
    Qry.ParamByName('PI').AsInteger := ParameterID;
    Qry.Open;
    Result := Qry.Fields[0].AsDateTime;
  finally
    Qry.Free;
  end;
end;
oder zusammenbauen wie gehabt
Delphi-Quellcode:
Qry.SQL.Text := GetSQLByName('SER_GET_LIST_LOGMESSAGE');
    if (MessageState <> msAll) or (TimeRange <> trAll) then
    begin
      Qry.SQL.Add(GetSQLByName('SER_GET_LIST_LOGMESSAGE_WHERE'));
      if MessageState <> msAll then
      begin
        Qry.SQL.Add(GetSQLByName('SER_GET_LIST_LOGMESSAGE_STATE'));
        Qry.ParamByName('MS').AsInteger := Ord(MessageState);
        HasMessageState := True;
      end;
      case TimeRange of
        tr24h:
          begin
            if HasMessageState then
            begin
              Qry.SQL.Add(GetSQLByName('SER_GET_LIST_LOGMESSAGE_AND'));
            end;
            Qry.SQL.Add(GetSQLByName('SER_GET_LIST_LOGMESSAGE_TIME'));
            Qry.ParamByName('TI').AsDateTime := Now - 1;
          end;
        tr7d:
          begin
            if HasMessageState then
            begin
              Qry.SQL.Add(GetSQLByName('SER_GET_LIST_LOGMESSAGE_AND'));
            end;
            Qry.SQL.Add(GetSQLByName('SER_GET_LIST_LOGMESSAGE_TIME'));
            Qry.ParamByName('TI').AsDateTime := Now - 7;
          end;
      end;
    end;
    Qry.SQL.Add(GetSQLByName('SER_GET_LIST_LOGMESSAGE_ORDER'));
    Qry.Open;
oder ausfüllen mit Format
Delphi-Quellcode:
Device := aList[0]; // ersten nehmen wegen ID
      InList := Copy(InList, 1, Length(InList) - 1); // letztes Komma entfernen
      Qry.SQL.Text := Format(GetSQLByName('SER_EDIT_DEVICES_ACTIVE'), [InList]);
      Qry.ParamByName('MDI').AsInteger := Device.MasterDeviceID;
      Qry.ExecSQL;
InList könnte auch die Feldnamensliste sein...

Zitat:

Select Id,Name,Vorname From Person
Where Id=:Id
Die SQL Datei wird z.B. mit Notepad erstellt und wird auf der Platte in deinem beliebigen Ordner gespeichert. Diese Datei wird in der *.rc Datei aufgelistet damit der Compiler weiß wo die Qellen sind.
Die SQL liegen als SQL Dateien auf der Festplatte und sind aber, bedingt, mit einem zum DBMS passenden SQL Editor testbar. Die IDE compiliert das automatisch zur Ressource.
https://www.delphipraxis.net/49505-s...einbinden.html

Hilfsmittel zum Erstellen der Dateien: https://www.delphipraxis.net/190316-...e-creator.html

Zitat:

schon alleine das Debuggen stelle ich mir nicht so einfach vor.
Nur das SQL liegt "extern" und nicht verstreut in Querys auf den Datemmodulen. Debuggen ist wie gehabt.

Zitat:

dass es eine Klasse oder sonstwie
:thumb: Ich persönlich benutze ein Interface für verschiedene DBMS.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00: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