Laden...

[erledigt] Automatisiert Datenbank beim Kunden erstellen - ohne externe Tools

Erstellt von m.grauber vor 13 Jahren Letzter Beitrag vor 13 Jahren 5.389 Views
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren
[erledigt] Automatisiert Datenbank beim Kunden erstellen - ohne externe Tools

verwendetes Datenbanksystem: <SQL-Server 2000-2008R2>

Ich habe bereits einiges zur Auslieferung gelesen, aber noch kein Weg hat mich richtig überzeugt.

  • Ich möchte auf kein externes Tool angewiesen sein!!!
  • Tabellen, Indizes, Beziehungen etc. sollen erstellt, bearbeitet, gelöscht werden können
  • Tabelleninhalte sollen teilweise auch mit eingeschlossen werden

Der Weg über Backup etc. fällt daher aus. (Auch wegen den Versionskonflikten)

Überlegung: Script erstellen lassen und unter C# ausführen:

Gibt es unter C# die Möglichkeit das gesamte Script oder mehrere Anweisungen automatisiert auszuführen oder muss ich das immer manuell machen. (Auf sqlmetal würde ich auch gerne verzichten, da ich dort z. B. keinen Fortschrittsbalken anzeigen lassen kann bzw. Abfragen bei Änderungen nicht so toll machbar sind.

Oder gibt es einen besseren Weg über das EntityFramework, der auch alle Anforderungen erfüllt? (Auf meinen Entwicklungsrechner gehe ich aber den entgegengesetzten Weg: Modell aus SQL-Datenbank erzeugen)

Würdet ihr den SQL-Benutzer für die SQL-Server-Anmeldung auch innerhalb dieses Scripts erzeugen?

Bekomme ich den "Fortschrittsbalken" nur manuell realisiert und wenn ich jede einzelnen Befehl ausführe?

nvarchar(max) gibt es noch nicht auf dem SQL-Server 2000. Würdet ihr für die Abwärtskompabilität stattdessen ntext nehmen oder dies auf gar keinen Fall mehr nutzen?

Vielen Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

ich habe das so gemacht, daß ich die Scripte für die DB-Erstellung als Strings in die Resourcen des Installers gepackt habe.
Dann kannst Du ein SqlCommand erstellen, das Script dem CommandText zuweisen und über ExecuteNonQuery ausführen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

3.825 Beiträge seit 2006
vor 13 Jahren

Wenn Du alle Befehle, die mit Semikolon getrennt sind, trennst und einzeln ausführst, hast Du auch eine schöne Progressbar.

Und Du siehst bei welchem Befehl event. ein Fehler auftritt.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo MarsStein und BerndFfm,

vielen Dank 👍 👍

Also habt ihr das Script in einzelne Befehle zerlegt und ruft es in C# jeweils auf. Das ist zwar etwas Arbeit, aber wahrscheinlich auch die zukunftssicherste Variante.

Dann bin ich froh, das ich nicht auf dem Holzweg bin. 🙂

Noch 1 Frage:

nvarchar(max) gibt es noch nicht auf dem SQL-Server 2000. Würdet ihr für die Abwärtskompabilität stattdessen ntext nehmen oder dies auf gar keinen Fall mehr nutzen? Ich nehme an, dass ich keine 2 Varianten einer Datenbank möglich machen sollte?

Vielen Dank!

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

F
10.010 Beiträge seit 2004
vor 13 Jahren

Ich benutze FluentMigrator, das hat den Vorteil das es DB Unabhängig ist.

Damit lässt sich auch sehr einfach ein Versionsmanagement der DB erzeugen und im SCM ablegen.

Und das liese sich auch mit einem T4-Script erzeugen.

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

Also habt ihr das Script in einzelne Befehle zerlegt und ruft es in C# jeweils auf. So ist es. Ob Du - wie BerndFfm vorschlägt - jeden Befehl einzeln aufrufst, oder einige Anweisungen "en block" aufrufst, ist natürlich Dir überlassen.

Ich habe ein Script, welches zur master-DB switcht und die neue DB anlegt, und dann noch einige Scripte für die Tabellen und für die initialen Daten, also nicht ganz so sehr zerlegt.

Zu dem Datentyp kann ich nix sagen -> habe SQL-Server 2000 nicht benutzt.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

3.825 Beiträge seit 2006
vor 13 Jahren

Hallo MG,

Das ist zwar etwas Arbeit ...

Ja ?


foreach (string sql in createcommand.Split(';'))
{
    cmd.CommandText = sql;
    ...
}

nvarchar(max) gibt es noch nicht auf dem SQL-Server 2000. Würdet ihr für die Abwärtskompabilität stattdessen ntext nehmen ?

Wieso nicht ?

Unter SQL Compact benutze ich [text] und unter Oracle [clob].

Du musst nur aufpassen dass die SQL-Kommandos, die Du im Programm verwendest, unter alles Systemen funktionieren.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo MarsStein und BerndFfm,

vielen Dank nochmals! 👍 👍

Ich werde nun doch ntext statt nvarchar(max) nutzen, da der 2000er SQL-Server schon laufen muss. Sobald das bei einer neuen SQL-Server-Version nicht mehr möglich ist, muss ich allerdings umstellen.

Die Split-Variante ist sehr interessant! 8o Cool gelöst!

Nur ein klitzekleines Problem habe ich noch: Wird die Datenbankerstellung im Window-Loaded ausgeführt, sehe ich nur ein schwarzes Fenster und keine Aktualisierung. In welches Event muss ich den Code schreiben, damit das Fenster bereits vorher aufbaut und während des Durchlaufs aktualisiert werden kann?

Vielen Dank nochmals!

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

F
10.010 Beiträge seit 2004
vor 13 Jahren

[FAQ] Warum blockiert mein GUI?
[Artikel] Multi-Threaded Programmierung

Und cool ist das string gefrickel nicht.
Wenn du die von mir gezeigte Lib (oder ähnliches ) benutzt musst Du gar nichts mit strings machen, bist DB unabhängig und hast einen vernünftigen Up/Down Mechanismus.

W
955 Beiträge seit 2010
vor 13 Jahren

Die Split-Variante ist sehr interessant! Cool gelöst! ... dann will ich nur hoffen dass Ihr keine StoredProcs, die Semikolons enthalten, aktualisieren müßt.

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo witte,

nein, eigentlich versuche ich auf StoredProcedures komplett zu verzichten. - Die sind ja oft ein Problem. Aber Danke für den Hinweis!

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo FZelle,

ja auch Dir vielen Dank für die Hilfe! 👍

Ich habe nur etwas Zeit benötigt mir das Werkzeug anzusehen und bin auch noch nicht ganz durch.

Da es ja scheinbar komplett als Quellcode vorliegt, ist es auch noch später anpassbar, also keine "BlackBox" und auch keine EXE. Das gefällt mir daran.

Zudem können verschiedene Datenbanksysteme damit gemanaged werden.

Bis ich da aber komplett durchsteige, brauche ich etwas Zeit. Erst dann kann ich mich für einen bestimmten Weg entscheiden. 🤔

Danke auch noch für die Links zum Refresh 👍 - Natürlich ist der Aufruf mal wieder etwas aufwändiger. Ich hoffe nur, dass durch die zusätzlichen Threads, die hintereinander erstellt werden, nicht die Rechnerauslastung ins Höchste steigt.

Außerdem hoffe ich, das die Threads nicht von .NET aus irgendwelchen Performancegründen vertauscht werden, sondern brav der Reihe nach abgearbeitet werden.

Vielen Dank nochmals an alle!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

Außerdem hoffe ich, das die Threads nicht von .NET aus irgendwelchen Performancegründen vertauscht werden, sondern brav der Reihe nach abgearbeitet werden. Der Sinn von Threads ist es ja, daß verschiedene Aktionen parallel abgearbeitet werden können. Dabei lässt sich normalerweise nicht vorhersagen, welcher Thread nun als nächster an die Reihe kommt, wenn mehrere Threads gleichzeitig laufen.
Wenn die Reihenfolge wichtig ist, musst Du dafür über entsprechende Synchronisierungsmechanismen selber sorgen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo MarsStein,

Wow! X( Das scheint ja richtig tricky zu werden; nur um den Bildschirm zu aktualisieren. Ich arbeite mich gerade durch einige Infos durch.

Wenn die Threads beim Erstellen der Datenbank nicht der Reihe nach abgearbeitet werden, könnte man u. U. z.B. ein Index auf ein Feld setzen, was erst in einem später abgearbeiteten Thread angelegt wird. Das ist dann nicht mehr lustig. 😜 - Insbesonders nicht, wenn es in der Testumgebung immer klappen sollte und beim Kunden dann an der Stelle schief läuft. 🙄

Vielleicht "trickse" ich ja doch lieber. Das Argument gegen ein manuell erstelltes DoEvents ist ja scheinbar lediglich, dass ich verhindern muss, die Form zu schließen, während die Schleife noch läuft. Dies ist ja einfach möglich. Und: das gleiche Problem hätte ich auch, wenn alles per einzelne Threads gemacht würde. Da sollte das Fenster auch nicht geschlossen werden.

Zudem würde ich sehr viele und kleine Threads hintereinander starten müssen. Das ist doch reine Ressourcenverschwendung.

Mal sehen, ob mir jemand zustimmt; Die Meinungen im Forum tendieren ja eher zum Thread.

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

F
10.010 Beiträge seit 2004
vor 13 Jahren

Jo, da hast du etwas falsch verstanden.

Du sollst nicht jede Kleinigkeit in einen extra Thread packen, sondern nur den ganzen Teil der das DB Update macht in einen weiteren.
Wenn das in einem Extra Thread läuft, bleibt die UI weiterhin "bedienbar" und kann eben auch den Fortschritt anzeigen.

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo FZelle!

👍 vielen Dank - das hatte mich so gewundert.

Also dann packe ich alles dort rein.

Danke!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

3.825 Beiträge seit 2006
vor 13 Jahren

Hallo,

Nur ein klitzekleines Problem habe ich noch: Wird die Datenbankerstellung im Window-Loaded ausgeführt, sehe ich nur ein schwarzes Fenster und keine Aktualisierung. In welches Event muss ich den Code schreiben, damit das Fenster bereits vorher aufbaut und während des Durchlaufs aktualisiert werden kann?

schreibe deinen Code nicht ins Load-Event, sondern ins Shown-Event, dann wird dein Form richtig angezeigt.

Fzelle : String-Gefrickel ?

Um mehrere SQL-Kommandos nacheinander auszuführen ist das doch genau richtig, was braucht man da mehr ? Welche Vorteile habe ich wenn ich komplexere Komponenten verwende ?

Ich finde die einfachste Lösung oft die Beste.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

F
10.010 Beiträge seit 2004
vor 13 Jahren

Und ich halte das mit den Strings für zu Fehleranfällig.
Außerdem musst du jedesmal wenn du etwas änderst, dies mit Fallunterscheidungen für die Unterstützten Datenbanken machen.

Nicht die Einfachste Lösung ist die beste, sondern die Einfachste Saubere.

Was ist so kompliziert an:


public class TestMigration : MySpecialMigration
{
    public override void Up()
    {
        Alter.Column("SystemNr")
            .OnTable("Mandant"))
            .AsString(20).Nullable();

        Delete.Index("IX_Mandant_Name")
            .OnTable("Mandant");

        Create.Column("LoginCount")
            .OnTable("Mandant")
            .AsInt32().Nullable();


        Create.Table("TestTable")
                .WithColumn("ID").AsInt32().Identity().PrimaryKey()
                .WithColumn("IPAddress").AsString(30).Nullable()
                .WithColumn("Subnetmask").AsString(30).Nullable()
                .WithColumn("StandardGateway").AsString(30).Nullable()
                .WithColumn("ForainKeyID").AsInt32().NotNullable()
                .WithColumn("Note").AsString().Nullable()
                .AddTypicalFields();
    }
    public override void Down() { }
}

3.825 Beiträge seit 2006
vor 13 Jahren

Hallo Fzelle,

Und ich halte das mit den Strings für zu Fehleranfällig.

ist es nicht, ich hab so schon einige Hundert Datenbanken angelegt, hat immer funktioniert.

Außerdem musst du jedesmal wenn du etwas änderst, dies mit Fallunterscheidungen für die Unterstützten Datenbanken machen.

Nein, muss ich nicht.

Frage zum fluentmigrator : Wenn ich ein neues Feld anlege, wird es dann beim Start einer Datenbank automatisch angelegt, wenn noch nicht vorhanden ?

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

F
10.010 Beiträge seit 2004
vor 13 Jahren

ist es nicht, ich hab so schon einige Hundert Datenbanken angelegt, hat immer funktioniert.

Das behaupten auch immer die Leute die keine ParameterCollection benutzen.

Frage zum fluentmigrator : Wenn ich ein neues Feld anlege, wird es dann beim Start einer Datenbank automatisch angelegt, wenn noch nicht vorhanden ?

FluentMigrator ( wie alle Migratoren ) sind dazu da DB Neutral DDL Befehle auszuführen.
Da passiert nichts automatisch, du bist weiterhin dafür zuständig die DB Versionsnummer zu verwalten.
Das ist kein automatisches Schemaabgleichtool, ist auch explizit nicht so gedacht.

Es ist ja gerade so entworfen das man sehen kann, in welcher Version der SW welche Änderungen an der DB vorgenommen wurden.

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Danke für die rege Diskussion,

ich komme jetzt erst wieder dazu, weil ich ein Connection-Problem zum Server hatte.

Also ich sehe es so: Es gibt immer verschiedene und gangbare Wege nach Rom.

Jeder muss selbst abwägen, welchen Weg er wählt. Beide Wege haben für mich einen Reiz. Wenn man nur Datenbanken für den SQL-Server (und vielleicht noch eine andere DB) erstellen möchte, kann man sicher auch den Weg über die Scriptvariante gehen, die auf den ersten Blick sicher die einfachere und die mit weniger Gesamtcode ist.

Da ich momentan sehr wenig Tabellen und sehr wenig Zeit habe und mit dem Script-Weg bereits begonnen hatte, werde ich vorerst diesen Weg gehen - aber mir sicher Fluent Migrator nochmals genauer ansehen. Zumal man wirklich den Code "in den Händen" hat. - Der Code von FZelle wirkt ja auch sehr elegant.

Die Unterstützung von verschiedenen Datenbanksystemen möchte ich mir jederzeit offen halten, jedoch ist der Test- und Supportaufwand für mich derzeit nicht zu stämmen, weshalb ich mich auf den SQL-Server vorerst beschränken werde.

Zum Thema "Strick-Gefrickl": Ich finde diese Idee trotzdem immer noch sehr gut, weil sie mich auch auf Ideen gebracht hat, auf die ich sicher nicht gekommen wäre. Auf der anderen Seite ist der Einwand mit verbundenen Einschränkungen auch sehr hilfreich.

Fazit: Ich finde es einfach toll, wie in diesem Forum nach allen Seiten diskutiert werden kann! 👍 👍

An BerndFfm: Ich habe das WPF-Event "Shown" leider nicht gefunden. Heißt das irgendwie anders?

Danke

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

3.825 Beiträge seit 2006
vor 13 Jahren

Sorry, "Shown" gibt es nur bei Winforms. Wie es bei WPF heisst weiss ich nicht.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Nein, sorry, das war mein Fehler 🙄 - ich hatte nichts von WPF erwähnt.

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]