Autor Beitrag
m.keller
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mi 28.02.18 14:47 
Hallo,

ich habe mal eine Frage zu Datenbank und Applikationsabgleich.

Also die Idee ist, wenn die Applikation startet, ein art Schemavergleich durchgeführt wird.
Um heraus zu finden Ob die Applikation mit der Datenbank auch Lauffähig ist.
Im schlimmstenfalls würde die Application abstürzen, das sollte aber nicht die Lösung sein.
Entweder sollte ein Automatisches Update der Datenbank durchgeführt werden oder eine Meldung ausgegeben werden und die Application wird beendet.

Kann man das mit einem Schemavergleich machen?
Gibt es dazu beispiele oder nutzt man eine Versionierung von der Datenbank?
Hat jemand da eine Idee oder sogar ein Beispiel wie man das am sinnvollsten löst?

Gefunden habe ich bis jetzt nix was dazu passen könnte.
Vermutlich habe ich nicht die richtigen Stichwörter verwendet.

Vielen dank.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1177
Erhaltene Danke: 157

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
BeitragVerfasst: Mo 05.03.18 00:11 
Das EntityFramework kann das, such in dem Kontext mal nach Migrations.
Die Migrations vom EF sind aber relativ komplex, damit kannst Du nicht nur das Schema abgleichen, sondern auch z.B. die Datenbank für die aktuelle Version updaten, inklusive ganzen SQL-Commands, die für die jeweiligen Versions-Updates ausgeführt werden.

NHibernate kann das auch, hier kenne ich aber keine Details.
Die Form, die ich kenne, kann einen Schema-Abgleich und ergänzt fehlende Tabellen und Spalten, vorhandene Spalten ändert oder entfernt es aber nicht.
Das ist - so wurde es mir zumindest erzählt - eine recht einfache und schnell umgesetzte Variante, aber nicht so flexibel.

Ich persönlich würde das EntityFramework nehmen. Man muss zwar mit jeder neuen Version Migration-Dateien bereit stellen, für einfache Änderungen geht das aber auch automatisch. Es braucht dann also min. einen Befehl, den man absetzen muss, das hast Du bei der NHibernate-Variante (die ich kenne) nicht.

Vom Funktionsumfang unterscheiden NHibernate und EntityFramework kaum, die Unterschiede stecken im Detail und kann man denke ich für die Wahl für ein neues Projekt vernachlässigen.
Vom EntityFrameworkCore solltest Du aber vorerst die Finger lassen, da das scheinbar noch einige sehr wichtige Funktionen nicht unterstützt. Das kann (wird) sich aber noch ändern, was es für manche Projekte vielleicht doch noch interessant macht.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mi 07.03.18 15:13 
Vielen Dank.
Ich habe mir einige Seiten im I-Net durchgelesen.
Werde aber nicht ganz schlau daraus.

Wenn ich das richtig verstehe, muss ich Class anlegen die den Tabellen entsprechen.
Das würde zusätzlich viel arbeit bedeuten.

Da ich ein Datenbank Projekt so wie die komplette Applikation in VS abbilde, dachte ich geht es einfacher.
Mein Gedanke war, Compilieren und es wird ein Script exportiert (eventuell ein SQL-Updatescript, irgendwie so in der art wird es doch auch im VS gemacht oder?).
Dieses Script vergleicht beim Start der Application den Soll/Ist zustand.
Wenn dieser Ungleich ist, wird ein Backup erstellt und die Änderungen durchgeführt.
So meine Theorie, bzw. Wunsch.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4346
Erhaltene Danke: 877


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 07.03.18 15:37 
Zitat:
Wenn ich das richtig verstehe, muss ich Class anlegen die den Tabellen entsprechen.


Nein, im Code hast du eh nie Tabellen sondern immer nur Klassen. Es könnte aber sein das du bisher DataTables/DataSet Klassen etc. verwendest und du für EF/NHibernate eine andere Art Klassen brauchst.

Zitat:
Mein Gedanke war, Compilieren und es wird ein Script exportiert (eventuell ein SQL-Updatescript, irgendwie so in der art wird es doch auch im VS gemacht oder?).


Wir haben keine Ahnung welche Datenbanktechnik du genau verwendest insofern können wir da keine konkreten Vorschlag machen. Es wird jedesmal ein wenig anders sein je nachdem was du genau tust. Ohne Details können wir dir aber nur grüne Wiese Lösungen vorschlagen die du nicht hast oder wir müssen so allgemein bleiben das es dir letztlich nicht hilft bzw. sogar kontraproduktiv ist.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mi 07.03.18 15:45 
Ich verwende eine MSSQL 2014 Datenbank.
Das SQL Datenbank Projekt wird in VS 2017 erstellt.
Dort werden alle Tabellen, StoredProcedures, Views und User angelegt.

In der Application selber werden keine DataSet's oder sonstiges verwendet es wird ausschließlich mit StoredProcedures gearbeitet.
Aktuell war es bis jetzt so, das Über VS ein Schemaabgleich erstellt und in VS auch das Update der DB gefahren wurde.

Dieses sollte nach Möglichkeit nun beim start der Application eigenständig gemacht werden.
Ich weiß leider nicht welche Informationen ihr sonst noch braucht.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4346
Erhaltene Danke: 877


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 07.03.18 16:15 
Zitat:
Dieses sollte nach Möglichkeit nun beim start der Application eigenständig gemacht werden.


Wer oder was ist die Application. Ist das genau der eine Server der den Zugriff auf die Datenbank steuert oder gibt es da viele Applikationen die direkt auf die gleiche DB schauen (und du potentiell ein Concurrency Problem hättest von parallelen DB Schema updates)?
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mi 07.03.18 16:52 
Es ist eine WPF application. Diese ist aktuell die einzige die dort ein Update ausführen soll bzw. Darf. Es gibt eine Application die noch lesen Rechte hat um Daten zu lesen. Ansonsten wird die Datenbank nicht verwendet.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3897
Erhaltene Danke: 794

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Mi 07.03.18 17:44 
Geht es um eine lokale Datenbank (d.h. jeder User hat seine eigene DB) oder um eine DB im (lokalen) Netz, auf der mehrere User zugreifen?
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mi 07.03.18 17:50 
Es ist eine lokale DB die auf einer MSSQL Express Server läuft.
Dort wird mit maximal zwei Usern zugegriffen.
Diese DB wird im Netzwerk zur Verfügung gestellt.
Die DB wäre von der Theorie auch im Firmennetzwerk verfügbar.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 12.03.18 07:39 
Also ich komme jedenfalls nicht weiter. Ich finde die MSDN Beschreibung richtig miserabel in dem Thema. Scheinbar ist das Thema sehr selten gefragt. Schade eigentlich.Ich würde mich freuen, wenn jemand von euch erfahrenen kurz erläutern kann wie man ein Vergleich erstellen kann und daraus ein Script um die Datenbank zu Migrieren.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3897
Erhaltene Danke: 794

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Mo 12.03.18 09:04 
Ich habe folgende 2 Libraries/Tools gefunden, welche dir dabei helfen können:
DbUp
DBSourceTools
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 12.03.18 11:20 
Danke,

aber damit kann ich nicht viel anfangen.
Ich versuche es noch ein mal zu erklären, was ich mir ausgedacht habe.

Ich besitze ein Datenbankprojekt (Visual Studio 2017) für eine MSSQL 2014 Server.
Dieses Projekt kann ich über Schemavergleich, vergleichen und auch auf die Datenbank übertragen.

Diese soll nach Möglichkeit automatisch funktionieren. Und zwar wenn meine Application XY startet.
Datenverluste usw. sind vorerst ein mal egal. Das werde ich wenn anders abfangen.
Wichtig ist erst ein mal, das es irgendwie machbar ist, aus einem Datenbankprojekt zur Laufzeit die Datenbank zu vergleichen und so zu erweitern, wie das Project zum Kompilierzeitpunkt war.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4346
Erhaltene Danke: 877


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 12.03.18 11:35 
Ich würde das mit dem Schemaabgleich verwerfen. Das Problem dabei die Daten korrekt beizubehalten bzw. korrekt umzuformen stößt sehr schnell an Grenzen. Und letztlich ist das Schemaabgleich Feature schlecht in einen eigenen Prozess zu kapseln so das du auch die nötige Kontrolle behälst.

Ich würde es ganz klassisch machen. Wenn du ein neues Features implementierst schreib auch gleich das passende SQL Script dazu, verwalte dann diese Scripte in deiner Anwendung, Versioniere die Datenbank, und führe nur die Skripte aus die dich von der vorgefunden Version zu der Version bringen zu der du hin willst. Möglicherweise sind beim upgrade auch bestimmte kodierte Prozesse nötig (Datenumformung etc.) die nicht in so einfach in SQL ausdrückbar sind die du dann gleich miterledigen kannst.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 12.03.18 11:38 
OK das bedeutet es wird viel Handarbeit werden. Aber gut.
Dann muss ich mich damit zufriedengeben.

Dann zu dem Thema Pensionierung.
Wie macht man das am sinnvollsten?
Bei .dll ist es klar und deutlich, wie sieht es in einer MSSQL DB aus?
Wie geht man da vor?

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4346
Erhaltene Danke: 877


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 12.03.18 11:57 
Zitat:
Dann zu dem Thema Pensionierung.


Da kann ich nicht helfen bin nicht verbeamtet :roll:

Zitat:
Bei .dll ist es klar und deutlich, wie sieht es in einer MSSQL DB aus?
Wie geht man da vor?


Man denkt sich eine Tabelle aus in der die notwendigen Details stehen. Im einfachsten Fall halt nur eine Versionsnummer.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mo 12.03.18 12:01 
:D
Ich meinte Versionierung ;)

OK. Damit kann ich arbeiten.
Hatte mir schon gedacht, das es da auf eigene Entwicklung ankommt.

Danke für eure Geduld.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Fr 16.03.18 14:12 
So, ich habe nun eine Lösung für mich gefunden und erarbeitet.

Ich habe eine Tabelle erstellt, wo die Aktuelle Version eingetragen ist.
Diese Version wird mit der aus dem Projekt erstellten .dacpac verglichen.
Ist die Version vom .daccpac neuer wird eine Aktualisierung vom .dacpac durchgeführt.
Hier das Beispiel blogs.msmvps.com/deb...cpac-with-dacfx-api/

Danke für eure Hilfe.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)