AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi SQL Dateien als Resource einbinden.
Tutorial durchsuchen
Ansicht
Themen-Optionen

SQL Dateien als Resource einbinden.

Ein Tutorial von MaBuSE · begonnen am 12. Jul 2005 · letzter Beitrag vom 23. Sep 2016
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von MaBuSE
MaBuSE
Registriert seit: 23. Sep 2002
Tutorial
SQL-Dateien als Resource einbinden



Autor: MaBuSE für www.delphipraxis.net
Stand: 12.07.2005
(c) 2004-2005, MaBuSE
Das Tutorial wurde mit Delphi 7 getestet
Mein besonderer Dank für die Arbeit in der DP und Unterstützung für mich geht an:
Daniel, Sakura, Gerome und an alle Moderatoren



Warum dieses Turorial?
  • Oft soll es vermieden werden SQL Statements als Harccode fest im Programm zu implementieren.
    z.B.:
    Delphi-Quellcode:
    Query1.Close;
    Query1.SQL.Text := 'select * from Tabelle';
    Query1.Open;
    Wenn ein SQL Server benutzt wird, bieten sie so genannte StoredProcs an. Das sind Prozeduren, die in der Datenbank liegen und von Delphi aus aufgerufen werden. Leider benutzt jeder SQL Server eine andere Syntax. (Oracle = PLSQL, MS-SQL = Transact SQL, ...) Wenn nun ein Programm für verschiedene SQL-Server geschrieben wird, hat man ein Problem. Die BDE kann z.B. mit verschiedenen SQL Servern umgehen, aber auch nur wenn nur der SQL Umfang benutzt wird den alle SQL Server können. Sobald einige SQL Server spezifischen Spezialitäten verwendet werden, ist es aus mit der Version für alle Server.

    Wenn man grundsätzlich kein SQL im Pascal Quelltext haben möchte, bietet sich folgende Lösung an:

    Die SQL Statements werden einfach in eine Resource verpackt und dann zur Laufzeit ausgelesen.

    Das kann man natürlich analog auch für alle anderen Dateien machen (*.jpg, *.wav, ...)

    Da diese Dateien nun im Ordner \Source\SQL zu finden sind, kann man sich sicher sein, das nach Änderungen an den Statements keine vergessen wurden.
    Früher musste man dazu den kompletten Quelltext durchsuchen und auch in alle *.dfm Dateien schauen.
Wie geht das?
  • Das ist sehr einfach.

    Wir verwenden z.B. folgende Struktur:

    X:\Source - hier liegt der Quelltext der Delphianwendung (*.dpr, *.pas, *.dfm, ...)
    X:\Source\SQL - hier liegen die einzubindenden SQL Dateien (*.sql)

    Für jede Query wird ein eigenes SQL-File angelegt.
    In unserem Fall:
    • Query01.sql
      (Inhalt: select * from Tabelle01)
    • Query02.sql
      (Inhalt: select * from Tabelle02)
    Wir legen ein neues Projekt an. (Menü: Datei -> Neu -> Anwendung)
    In der Projektverwaltung klicken wir Project1.exe mit rechts an und wählen "Hinzufügen..."
    In dem Hinzufügen Dialog wählen wir in X:\Source\SQL die Datei Query01.sql aus.

    In das Delphi Projekt (Project1.dpr) wird nun folgende Zeile hinzugefügt und die SQL-Datei erscheint in der Projektverwaltung.
    {%File 'SQL\Query01.sql'} Ich persönlich schreibe nur die Zeilen in das *.dpr und gehe nicht den visuellen Weg.

    Das gleiche machen wir mit der Query02.sql Datei.

    Damit sind die Dateien zwar in der IDE dem Projekt zugeordnet, aber der Compiler bindet diese nicht ein.

    Dazu muss eine *.res Datei erzeugt werden.

    Wir erzeugen eine Textdatei Names X:\Source\SqlDateien.rc
    In diese Datei schreiben wir folgenden Text:
    Code:
    // Hier werden die SQL Dateien als Resource eingebunden
    Query01  TEXT ".\SQL\Query01.sql"
    Query02  TEXT ".\SQL\Query02.sql"
    Diese Datei binden wir mit einem Rechtsklick in der Projektverwaltung "Hinzufügen..." ein.
    Es wird nun folgende Zeile eingefügt:
    {$R 'SqlDateien.res' 'SqlDateien.rc'} Unsere Project1.dpr sieht nun wie folgt aus:
    Delphi-Quellcode:
    program Project1;

    {%File 'SQL\Query01.sql'}
    {%File 'SQL\Query02.sql'}
    {$R 'SqlDateien.res' 'SqlDateien.rc'}

    uses
      Forms,
      Unit1 in 'Unit1.pas{Form1};

    {$R *.res}

    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    Wenn nun ein Build (Menü: Projekt -> Project1 erzeugen) aufgerufen wird, wird nach dem Kompilieren in der "linken" Phase das *.rc File in ein *.res File umgewandelt.
    Dieses *.res File wird dann in die Exe eingebunden.

    Geschafft!
Super, aber wie kommt man nun wieder an den SQL-Text rann?
  • Das ist auch ganz einfach.

    In das Form1 legen wir nun 2 TButtons und ein TMemo Feld ab.
    Auf den 1. Button legen wir folgenden Quelltext:
    Delphi-Quellcode:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      tmpStream: TResourceStream;
    begin
      tmpStream := TResourceStream.Create( HInstance, 'Query01', 'TEXT' );
      try
        Memo1.Lines.LoadFromStream( tmpStream );
      finally
        tmpStream.Free;
      end;
    end;
    Auf den 2. Button analog dazu diesen Quelltext:
    Delphi-Quellcode:
    procedure TForm1.Button2Click(Sender: TObject);
    var
      tmpStream: TResourceStream;
    begin
      tmpStream := TResourceStream.Create( HInstance, 'Query02', 'TEXT' );
      try
        Memo1.Lines.LoadFromStream( tmpStream );
      finally
        tmpStream.Free;
      end;
    end;
    Ich laden den Text hier im Beispiel nur in ein Memo, in Eurem Programm müsst Ihr natürlich etwas in folgender Art schreiben:
    Delphi-Quellcode:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      tmpStream: TResourceStream;
    begin
      Query1.Close;
      tmpStream := TResourceStream.Create( HInstance, 'Query02', 'TEXT' );
      try
        Query1.SQL.LoadFromStream( tmpStream );
      finally
        tmpStream.Free;
      end;
      Query1.Open;
    end;
    Natürlich können im SQL Text auch Parameter (z.B. "arName") definiert werden, die dann im TParams Initialisiert und mit folgenden Delphi Quelltext zugewiesen werden können:
    Query1.ParamByName('paramName').AsString := 'blabla';
Anmerkung / Tipps & Tricks
  • Problem: Wenn Änderungen an den SQL-Dateien vorgenommen werden, kann es sein, das Delphi das nicht automatisch erkennt und diese Änderungen nicht in das *.res File aufnimmt.
    Lösung: Einfach das *.res File mit den SQL Dateien löschen, es wird dann beim Build ein Neues angelegt. (Im Beispiel ist das SqlDateien.res)
Ich hoffe dieses Tutorial hilft Euch ein wenig...
mfg
MaBuSE
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
 
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#11
  Alt 12. Jul 2005, 15:22
Zitat von joachimd:
Zitat von shmia:
Man darf auch Kommentare in den SQL-Dateien einbauen.
Diese Kommentare müssen aber vor dem Öffnen der Query gelöscht werden.
warum müssen die Kommentarzeilen entfernt werden? -- und // werden genauso wie /* */ im SQL unterstützt und können so an den Server geschickt werden.
Es gibt durchaus SQL-Engines die Kommentare in der Form -- nicht unterstützen.
(z.B. LocalSQL der BDE auf z.B. Paradox Dateien).

[edit]
Ich habe das gerade mal ausprobiert:

Query1.SQL.Text :=
SQL-Code:
-- Kommentar
select * from clients
-> Fehler: BDE Error No: $2E5D (11869)
Zitat:
Symbol-String nicht gefunden.
Symbol-String: --
Zeilennummer: 1
Ohne Kommentar gehts :-/
[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

 
Delphi 10.4 Sydney
 
#12
  Alt 12. Jul 2005, 15:29
Zitat von MaBuSE:
Es gibt durchaus SQL-Engines die Kommentare in der Form -- nicht unterstützen.
(z.B. LocalSQL der BDE auf z.B. Paradox Dateien).
Ach so...wir sprechen auch von kaputten
allerdings würde ich nicht knallhart -- und // am Zeilenanfang auswerten. Wenn jemand einigermassen Standard-konform SQL beherrscht, so wird er die Kommentare auch mal hinter eine gültige Zeile schreiben:

SQL-Code:
SELECT
 * //zum Testen mal alle Felder holen
FROM
  mytable --das müssen wir für die Produktion dann auf die richtige Tabelle umbauen
Joachim Dürr
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#13
  Alt 12. Jul 2005, 15:39
Zitat von joachimd:
allerdings würde ich nicht knallhart -- und // am Zeilenanfang auswerten. Wenn jemand einigermassen Standard-konform SQL beherrscht, so wird er die Kommentare auch mal hinter eine gültige Zeile schreiben:
SQL-Code:
SELECT
 * //zum Testen mal alle Felder holen
FROM
  mytable --das müssen wir für die Produktion dann auf die richtige Tabelle umbauen
Aber es sollte auch folgendes berücksichtigt werden:
SQL-Code:
select
  '-- Konstante --', Feldname
from
 Tabellenname
Wir hatten damals einen Parser geschrieben, der sogar in der Lage war nur bestimmte Kommentare auszublenden (private Kommentare, öffentliche Kommentare)

und auch solche "Tricks" wie
SQL-Code:
-- '
-- Programmname: Test
-- bla bla bla
-- '
select * from dual
müssen berücksichtigt werden.
(Die BDE erkennt den : im Kommentar als Parameter ohne Namen und motzt. In ' ... ' eingeschlossen ist es der BDE egal. Auch bei SQL Links mit SQL Servern wie Oracle.)

Das war der Grund warum ich solche Dinge nicht im Tutorial eingebaut habe.
Ich wollte es nicht unnötig kompliziert machen.
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

 
Delphi 10.4 Sydney
 
#14
  Alt 12. Jul 2005, 15:59
Zitat von MaBuSE:
Das war der Grund warum ich solche Dinge nicht im Tutorial eingebaut habe.
Ich wollte es nicht unnötig kompliziert machen.
Das ist weise. Jedem seinen Dialekt...und wenn man für Systeme entwickelt, welche keine Kommentare unterstützen, so muss man die Kommentare halt weglassen. Damit hat man zwar etwas weniger Funktionalität, aber schränkt es nicht ein.
Joachim Dürr
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

 
Delphi 12 Athens
 
#15
  Alt 22. Sep 2016, 11:00
Hallöle...

Diesmal gebe ich auch mal etwas an die Community zurück...

Ein Tool welches die Ressourcenstrings, entsprechend dem oben genannten Muster, verwaltet.
* Verwaltung Projekte
* Verwaltung SQL für mehrere Datenbanken
* Verwaltung der Stati der SQL´s im Netzwerk (Kollegen)
* Verwaltung beliebiger Ordner für die SQL
* Handling wie man aus einem Editor kennt
* Teilstringssuche
-> die Projekte / Ini werden im Benutzerverzeichnis abgelegt !

Lizenz: Freeware für die Community

Wenn es in einer Firma benutzt werden sollte, wäre es schön, das ihr gebt was in das Bugdet reinpaßt... In diesem Falle gibt es eine ordnungsgemäße Rechnung. Kontakt per PN...

22.09.2016:
* Relase

!!! weitere Änderungen und das aktuelle Release sind im Projekt Thread enthalten.
Miniaturansicht angehängter Grafiken
gui.jpg  
Angehängte Dateien
Dateityp: pdf Kurzbedienungsanleitung.pdf (431,5 KB, 43x aufgerufen)

Geändert von haentschman (12. Feb 2017 um 09:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

 
Delphi 10.2 Tokyo Professional
 
#16
  Alt 22. Sep 2016, 15:29
Warum schreibst du das denn hier rein? Machs doch in nen eigenen Projekt-Thread. Da werdens sich auch sicherlich mehr Leute anschauen
Michael
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

 
Delphi 12 Athens
 
#17
  Alt 22. Sep 2016, 16:32
Jetzt wo du es sagst...

Ich wollte es eigentlich thematisch zusammen haben. Das Projekt findet man eher nicht wenn man den Namen nicht weiß. Wenn man das Tutorial durchgeht dann stolpert man eigentlich drüber...

Ich mach das in einen eigenen Projekt Thread. Den kann ich dann hierher verlinken.

Der Projekt Thread: http://www.delphipraxis.net/190316-d...e-creator.html

!!! weitere Änderungen und das aktuelle Release sind im Projekt Thread enthalten.

Geändert von haentschman (27. Okt 2016 um 07:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#18
  Alt 23. Sep 2016, 09:38
Warum schreibst du das denn hier rein? Machs doch in nen eigenen Projekt-Thread. Da werdens sich auch sicherlich mehr Leute anschauen
Du hast es doch auch gefunden
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 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