SQL File in Visual Studio 2019 statisch in Quellcode einfügen

Gast #6101718
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!
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
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?
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
}
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.
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?!
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
;

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.