Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.298 Beiträge
 
Delphi 12 Athens
 
#29

AW: SQLite select geht nicht

  Alt 20. Nov 2018, 14:04
Zitat:
Wie baust du das mit Ressourcen?
...einfach.

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
Ich persönlich benutze ein Interface für verschiedene DBMS.

Geändert von haentschman (20. Nov 2018 um 14:46 Uhr)
  Mit Zitat antworten Zitat