Forum: PC-Programmierung SQL File in Visual Studio 2019 statisch in Quellcode einfügen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sql (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte meine SQL Anweisungen in einer separaten .sql Datei 
abspeichern, alleine schon aufgrund der Lesbarkeit. Ich Möchte nun 
jedoch, dass der Inhalt dieser Dateien beim Übersetzen quasi statisch an 
die Stelle im Quellcode gesetzt wird. Damit möchte ich verhindern, dass 
ich diese Datei nach dem Übersetzen noch benötige und diese einsehbar 
ist.

Die Sprache ist C++, Visual Studio 2019.

Wie stelle ich das am besten an? Danke!

von Vlad T. (vlad_tepesch)


Bewertung
-1 lesenswert
nicht lesenswert
#include "yourStatements.sql"

von Sql (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Wie soll das funktionieren?
void sql(string sTXT){
//...
}

sql('
#include "bla.sql"
');

von Vlad T. (vlad_tepesch)


Bewertung
0 lesenswert
nicht lesenswert
Sql schrieb:

> sql('
> #include "bla.sql"
> ');

was soll das denn sein? auf jeden Fall kein C++.


Selbst, wenn du ein C-String literal benutzt.

> sql("
> #include <bla.sql>
> ");


im String funktioniert das natürlich nicht. Das hast du aber auch nicht 
gesagt.

Ich dachte in deiner Datei Steht sowas wie
std::string Abfrage1 = "SELECT ....";


Was bring es dir denn, wenn alle SQL statements in einem String drin 
sind?

Falls es wirklich das ist was du willst, könntest du das versuchen:
https://github.com/graphitemaster/incbin

Sql schrieb:
> Damit möchte ich verhindern, dass
> ich diese Datei nach dem Übersetzen noch benötige und diese einsehbar
> ist.

Funfact: es ist trotzdem in deinem Binary und mit jedem Texteditor oder 
dem 'strings' util https://en.wikipedia.org/wiki/Strings_(Unix) könnte 
man das extrahieren

: Bearbeitet durch User
von Sql (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Es ist schon erstaunlich was nach vielen Jahrzehnten C++ immernoch nicht 
funktioniert.

Ich habe eine Datei sql.sql in der eine SQL Anweisung drin steht. Kein 
C++ Code, sondern:
select
name, 
nachname
from
mitglieder

Diesen SQL Befehl möchte ich nicht zur Laufzeit, sondern zur 
Compilierzeit in einer .cpp Datei inkludieren und einer Funktion 
übergeben.

Pseudocode:
executeSQL("
#include "sql.sql"
");

Warum? Sämtliche SQL Befehle sind in einer .sql Datei abgelegt, inkl. 
passendem Syntax Highlightning. Und nach dem Compilieren spielen diese 
.sql Dateien keine Rolle mehr, da quasi statisch im Programmcode 
eingefügt und übersetzt.

Es kann doch nicht sein, dass sowas nicht möglich ist?

von Dirk K. (merciless)


Bewertung
0 lesenswert
nicht lesenswert
Und wenn du in deiner Anwendung 500 verschiedene
SQL-Statements verwendest hast du 500 .sql-Files
im Projekt?

Bau dir ein Script, dass vor dem Build den Inhalt
des SQL-Files in ein .h/.c/.cpp schreibt.

merciless

von Oliver S. (oliverso)


Bewertung
0 lesenswert
nicht lesenswert
Hm. Schaue ich mit beiden Strings "C++" und "SQL" sehr genau an, dann 
fällt auf, daß die keinerlei Gemeinsamkeiten aufweisen. Was genau also 
erwartest du?

Vielelicht könnte man aus deiner db einen Stream generieren, und dann 
SQLLite unterschieben. Probiers halt aus.

Oliver

von DPA (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Immer dieser IDE spezifische BS. Mit Makefiles ist sowas viel einfacher 
(alles ungetestet):

makefile
# Alle quelldateien suchen
sources=$(shell find src -type f)

# Alle resourcen suchen
resources=$(shell find res -type f)

# Liste von Objektdateien erstellen
resource_objects=$(resources:%=build/%.res.o)
objects += $(resource_objects)
objects += $(sources:%.c=build/%.c.o)

# Default target
all: my_program

# Anwendung linken
my_program: $(objects) build/include/resources.h 
  $(cc) $(objects) -o "$@"

# .c Quelldatei kompilieren
build/%.o: %.c
  $(cc) -I build/include/ -I include/ -c "$<" -o "$@"

# Header für alle Resourcen erstellen
# Nachher als char array Zugreifbar, Variablenname ist Dateiname, mit allen Sonderzeichen ersetzt mit _
# Grösse ist in <name>_size gespeichert.
build/include/resources.h: $(resource_objects)
  mkdir "$(dir $@)"
  printf "#ifndef RESOURCES_H\n#define RESOURCES_H\n\n" > "$@".tmp
  for file in $(resources); \
  do \
    id="res_$$(printf '%s' "$$file"|sed 's/[^a-zA-Z0-9]/_/g')"; \
    printf "extern const char %s[];" "$$id" >> "$@".tmp; \
    printf "extern const size_t %s_size;" "$$id" >> "$@".tmp; \
  done
  printf "\n#endif\n" >> "$@".tmp
  mv "$@".tmp "$@"

# Resourcen zu Objektdateien umwandeln
build/%.res.o: %
  mkdir "$(dir $@)"
  file="$^"; \
  id="$$(printf '%s' "$$file"|sed 's/[^a-zA-Z0-9]/_/g')"; \
  ( \
    echo '#include <stddef.h>'; \
    printf "extern const char %s[];" "$$id"; \
    printf "extern const size_t %s_size;" "$$id"; \
    printf "const char %s[] = {" "$$id"; \
    cat "$$file" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g' | sed 's/.*/  "\0\\n"/'; \
    printf "};\nconst size_t %s_size = sizeof(%s)-1;\n" "$$id" "$$id"; \
  ) | $(CC) -c -o "$@" -x c - $(CC_OPTS) $(CPPFLAGS) $(CFLAGS)

res/hello.txt
Hello World!

src/main.c
#include <stdio.h>

int main(){
  puts(res_hello_txt);
}

von DPA (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Edit: Müsste
id="$$(printf '%s' "$$file"|sed 's/[^a-zA-Z0-9]/_/g')"; \

Statt:
id="res_$$(printf '%s' "$$file"|sed 's/[^a-zA-Z0-9]/_/g')";

sein.

von 50c (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Sql schrieb:
> Sämtliche SQL Befehle sind in einer .sql Datei abgelegt, inkl.
> passendem Syntax Highlightning.

...der ist gut und hat mich fast vom Stuhl gehauen...:D

von Vlad T. (vlad_tepesch)


Bewertung
0 lesenswert
nicht lesenswert
Sql schrieb:
> Es ist schon erstaunlich was nach vielen Jahrzehnten C++ immernoch nicht
> funktioniert.

für genau sowas wurden resource compiler erfunden.
Man definiert ein resource script, was die einzukompilierenden resourcen 
enthält und es gibt eine API um auf diese zuzugreifen.

Bei windows ist gehört dies zur Win32-API. Ist natürlich Win-only.
Aber du scheinst ja mit VS2019 zu arbeiten. Also füge deinem Projekt 
dein File als Resource hinzu und lade diese.

Wenn du was Platformunabhängiges suchst, kann ich nur Qt empfehlen. Das 
bringt sowas auch mit. Das geht sogar soweit, dass es quasi ein eigenes 
Dateisystem für die Resourcen simuliert und alle Funktionen, die 
Dateinamen erwarten auch mit Resourceidentifiern klarkommen (die wie 
Dateipfade aussehen nur mit vorangestelltem ':') 
https://doc.qt.io/qt-5/resources.html

Für kleinere Projekte ist sowas wahrschienlich overkill, aber eine sehr 
einfache Variante (das INCBIN repository) habe ich dir ja oben schon 
verlinkt. Wirklich sehr angenehm und einfach zu integrieren. Erfordert 
für den M$ Compiler leider einen extra prebuildstep.

von Vlad T. (vlad_tepesch)


Bewertung
0 lesenswert
nicht lesenswert
DPA schrieb:
> Immer dieser IDE spezifische BS. Mit Makefiles ist sowas viel einfacher
> (alles ungetestet):

Ja - sehr viel einfacher, als in einer IDE eine Resource hinzuzufügen.
und makefiles sind auch so intuitiv und laufen überall.

von Planlos (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Sql schrieb:
> Es ist schon erstaunlich was nach vielen Jahrzehnten C++ immernoch nicht
> funktioniert.
>
> Ich habe eine Datei sql.sql in der eine SQL Anweisung drin steht. Kein
> C++ Code, sondern:select
> name,
> nachname
> from
> mitglieder

In welcher anderen Sprache funktioniert das denn?

Mit irgendwelchen SQL Befehlen ohne Zuordnung kann doch keine Sprache 
was anfangen?!

von Vlad T. (vlad_tepesch)


Bewertung
0 lesenswert
nicht lesenswert
Sql schrieb:
> Warum? Sämtliche SQL Befehle sind in einer .sql Datei abgelegt, inkl.
> passendem Syntax Highlightning. Und nach dem Compilieren spielen diese
> .sql Dateien keine Rolle mehr, da quasi statisch im Programmcode
> eingefügt und übersetzt.


wenn dich 7 weitere Zeichen in deinen SQL-Dateien nicht stören, kannst 
du auch sowas machen:

bla.sql:
R"=(

SELECT * FROM table;

)="

Code:
const char *s =
#include "bla.sql"
;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.