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


von Sql (Gast)


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)


Lesenswert?

#include "yourStatements.sql"

von Sql (Gast)


Lesenswert?

Wie soll das funktionieren?
1
void sql(string sTXT){
2
//...
3
}
4
5
sql('
6
#include "bla.sql"
7
');

von Vlad T. (vlad_tepesch)


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
1
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)


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:
1
select
2
name, 
3
nachname
4
from
5
mitglieder

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

Pseudocode:
1
executeSQL("
2
#include "sql.sql"
3
");

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)


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)


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)


Lesenswert?

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

makefile
1
# Alle quelldateien suchen
2
sources=$(shell find src -type f)
3
4
# Alle resourcen suchen
5
resources=$(shell find res -type f)
6
7
# Liste von Objektdateien erstellen
8
resource_objects=$(resources:%=build/%.res.o)
9
objects += $(resource_objects)
10
objects += $(sources:%.c=build/%.c.o)
11
12
# Default target
13
all: my_program
14
15
# Anwendung linken
16
my_program: $(objects) build/include/resources.h 
17
  $(cc) $(objects) -o "$@"
18
19
# .c Quelldatei kompilieren
20
build/%.o: %.c
21
  $(cc) -I build/include/ -I include/ -c "$<" -o "$@"
22
23
# Header für alle Resourcen erstellen
24
# Nachher als char array Zugreifbar, Variablenname ist Dateiname, mit allen Sonderzeichen ersetzt mit _
25
# Grösse ist in <name>_size gespeichert.
26
build/include/resources.h: $(resource_objects)
27
  mkdir "$(dir $@)"
28
  printf "#ifndef RESOURCES_H\n#define RESOURCES_H\n\n" > "$@".tmp
29
  for file in $(resources); \
30
  do \
31
    id="res_$$(printf '%s' "$$file"|sed 's/[^a-zA-Z0-9]/_/g')"; \
32
    printf "extern const char %s[];" "$$id" >> "$@".tmp; \
33
    printf "extern const size_t %s_size;" "$$id" >> "$@".tmp; \
34
  done
35
  printf "\n#endif\n" >> "$@".tmp
36
  mv "$@".tmp "$@"
37
38
# Resourcen zu Objektdateien umwandeln
39
build/%.res.o: %
40
  mkdir "$(dir $@)"
41
  file="$^"; \
42
  id="$$(printf '%s' "$$file"|sed 's/[^a-zA-Z0-9]/_/g')"; \
43
  ( \
44
    echo '#include <stddef.h>'; \
45
    printf "extern const char %s[];" "$$id"; \
46
    printf "extern const size_t %s_size;" "$$id"; \
47
    printf "const char %s[] = {" "$$id"; \
48
    cat "$$file" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g' | sed 's/.*/  "\0\\n"/'; \
49
    printf "};\nconst size_t %s_size = sizeof(%s)-1;\n" "$$id" "$$id"; \
50
  ) | $(CC) -c -o "$@" -x c - $(CC_OPTS) $(CPPFLAGS) $(CFLAGS)

res/hello.txt
1
Hello World!

src/main.c
1
#include <stdio.h>
2
3
int main(){
4
  puts(res_hello_txt);
5
}

von DPA (Gast)


Lesenswert?

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

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

sein.

von 50c (Gast)


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)


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)


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)


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)


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:
1
R"=(
2
3
SELECT * FROM table;
4
5
)="

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.