Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Datenbanken


Csharp-programmierer - So 22.05.16 00:56
Titel: Datenbanken
Hallo,
ich möchte erstmal sagen, dass ich der Meinung bin, dass man die Daten einer ListView besser speichern kann als ich es gerade mache. Ich erstelle mir eine Basisklasse, welche die Columns der LV besitzt, dann eine Klasse, die eine Liste vom Typ der Basisklasse enthält und die über Speicher - und Öffnungsmethoden verfügt.

Über eine foreach- Schleife wird eine neue Basisklasse erstellt und mit den einzelnen Daten gefüllt. Diese Klasse wird anschließend in der Klasse mit der Liste geaddet. Anließen wird die Klasse mit der Liste als XML serialisiert.
Wenn ich mir die XML- Datei aber ansehe, sieht es sehr verwirrend aus. Kann es passieren, dass sich der Computer nach ganz großen Datenmengen vertut oder Fehler auftreten?

Deswegen denke ich über Datenbanken nach. Erstmal die wichtigste Frage: angenommen ich erzeuge eine Datenbank, die für eine LV spezialisiert wurde, kann ich dies dann so programmieren, dass die Anwendung auch auf einem Client-PC fehlerlos funktioniert? Wie kann ich mir eine Datenbankdatei vorstellen (braucht diese Datei Internet)? Und welchen Datenbanktyp würdet ihr mir für eine LV empfehlen?

Mfg Yannic M.
:)


jaenicke - So 22.05.16 13:39

Internet benötigst du für eine Datenbank nicht. Was du benötigst, hängt vom Datenbanktyp ab.

Es gibt echte Datenbankserver, die du auf deinem Rechner installieren musst, wie MS SQL Server oder Firebird. Es gibt aber auch Embedded Datenbanken wie Firebird Embedded, SQLite usw., die lokal lediglich die Datenbank als Datei und die Zugriffsbibliotheken benötigen.

Den Zugriff kannst du ähnlich wie bei der XML Datei über eine Schleife erledigen. Lediglich die andere Richtig, das Abspeichern, wird ein wenig mehr Aufwand. Denn anders als bei einer XML-Datei speicherst du nur die Änderungen und nicht die ganze Datei. Deshalb sind Datenbanken auch deutlich schneller als eine XML-Datei.
Zudem kannst du da sehr einfach filtern und sortieren usw.

Aber erst einmal kannst du ja mir dem Auslesen anfangen.
Ein einfaches Beispiel siehst du zum Beispiel hier:
https://www.youtube.com/watch?v=LxeM010HLJI


Ralf Jansen - So 22.05.16 14:21

Zitat:
Deswegen denke ich über Datenbanken nach. Erstmal die wichtigste Frage: angenommen ich erzeuge eine Datenbank, die für eine LV spezialisiert wurde, kann ich dies dann so programmieren, dass die Anwendung auch auf einem Client-PC fehlerlos funktioniert? Wie kann ich mir eine Datenbankdatei vorstellen (braucht diese Datei Internet)? Und welchen Datenbanktyp würdet ihr mir für eine LV empfehlen?


Sorry aber das ist keine Frage sondern eine Zurschaustellung das du dem Problem aus der falschen Richtung begegnest. Versuche, auch wenn schwer fällt, diesen Gedankengang zu löschen. Von einem Control zur Datenablage zu denken ist eine Sackgasse. Immer. Möglicherweise bekommt man so was raus was am Ende irgendwie funktioniert aber mir annähernd 100% Wahrscheinlichkeit wird es Mist sein ;)

Datenbanken sind zur persistenten Datenablage gedacht. Controls zur Datenanzeige. 2 unterschiedliche, ja unabhängige, Probleme. Wenn du die gedanklich als ein Problem betrachtest machst du dir die Sache schwerer als sie ist. Du solltest versuchen Probleme zu trennen nicht sie zu einem zu machen. Ich empfehle dir mit einer (möglicherweise erstmal abstrakten) Betrachtung eines Datenmodels zwischen Persistierung der Daten und Anzeige der Daten zu beginnen. Von da aus hast du 2 sauber abgegrenzte Probleme (wie bringe ich die Daten in die UI und zurück, wie speichere/lade ich die Daten) die du einzeln lösen kannst und die isoliert auch einfacher zu lösen sind.

Für den Anfang kannst du von da aus auch erstmal zur Datenablage weiterhin eine xml Datei verwenden. Wenn sich das dann als Problem darstellt kannst du, aus dem dann richtigen Grund (weil zu langsam, schwer auszuwerten etc.), überlegen ob du zur Datenablage was geeigneteres benutzen möchtest. Dieser Austausch passiert dann ohne das du irgendwas Richtung Anzeige ändern müsstest. Denn du hast die Teilprobleme ja voneinander isoliert.


Csharp-programmierer - So 22.05.16 16:47

Zitat:
Für den Anfang kannst du von da aus auch erstmal zur Datenablage weiterhin eine xml Datei verwenden.

Okay. Ein Kumpel von mir hat mich gefragt, ob ich ihm eine Software für sein kleines Unternehmen schreiben kann. Diesen "Auftrag" habe ich angenommen. Diese Software habe ich nun fast fertig geschrieben und sie enthält 4 unterschiedliche ListViews mit vielen (max 6) Columns. Was mir Bauchschmerzen macht, ist die Frage, ob der XmlSerializer mit vielen / großen Datenmengen umgehen kann. Ich weiß ja nicht, wie viele Aufträge / Buchungen mein Kumpel in das Programm einträgt. Nicht dass es da irgendwelche Fehler gibt.


Ralf Jansen - So 22.05.16 17:24

Zitat:
Nicht dass es da irgendwelche Fehler gibt.

Ich vermute mal dir ist mittlerweile klar das man solche Fragen vorher klärt ;)
Fehler wird es immer geben. Und bei manchen hast du gar keine Chance sie zu verhindern weil sie gar nicht direkt mit deinem Stück Software zusammenhängen sondern nur davon betroffen ist.
Für dich als der Entwickler (und natürlich genauso für den Auftraggeber) der Software ist es aber wichtig wie die Software auf Fehler reagiert und ob sie Verfahren unterstützt die Fehler ~reparierbar~ machen.

Mal das offensichtlichste. Wenn irgendein Fehler (Stromausfall, Hardware schaden, Platte kaputt etc.) deinen Datenbestand beschädigt. Wie gut lässt sich der aus einem Backup möglichst ohne viel Verlust wieder herstellen? Und ist das hier wichtig? Hast du Absprachen für diesen Fall getroffen? Was ist wenn Fehleingaben denn Datenbestand kaputtmachen. Wie einfach ist es auf einen vorherigen Zustand zurückzukommen. Ist das hier wichtig? Habt ihr das abgesprochen? Falls ihr unausgesprochen Fehlerfreiheit angenommen habt dann hast du mein Mitleid. Es werden Fehler auftreten egal wie gut das programmiert ist. Ich hoffe eure Freundschaft leidet darunter nicht ;)

Eine Datenbank hat üblicherweise bereits Verfahren dazu eingebaut. Aber ob sie für deinen Fall ausreichen sind, geeignet sind oder eher sogar überdimensioniert sind kann ich nicht beurteilen. Das hängt davon ab was ihr besprochen habt was der Rahmen des Auftrags an dich ist.
Zitat:
Was mir Bauchschmerzen macht, ist die Frage, ob der XmlSerializer mit vielen / großen Datenmengen umgehen kann

Das kann der. Aber es hört irgendwann auf sinnvoll zu sein. Du musst ja immer alles laden und immer als speichern. Da wird vermutlich sehr bald, sehr viel, sehr unnötig hin und hergeschoben.
Zitat:
Ich weiß ja nicht, wie viele Aufträge / Buchungen mein Kumpel in das Programm einträgt

Ah. Der Starter für ein Datenmodell ;) Du hast also Aufträge und Buchungen. Da lässt sich doch ein einfaches Datenmodel designen und du kannst beim speichern der Daten das Listview erstmal aus dem Kopf streichen.


Csharp-programmierer - So 22.05.16 17:38

Zitat:
Ich hoffe eure Freundschaft leidet darunter nicht ;)

Ach quatsch. Dazu kenne ich ihn zu lange und zu gut ;)

Zitat:
Das kann der. Aber es hört irgendwann auf sinnvoll zu sein. Du musst ja immer alles laden und immer als speichern. Da wird vermutlich sehr bald, sehr viel, sehr unnötig hin und hergeschoben.

Angenommen die Listview hat 6 Columns und mein Kumpel fügt 10.000 Einträge hinzu (unrealistisch aber ein gutes Beispiel zur Frage) :lol: und speichert dies. Nun wird eine Liste 10.000 mal mit einer gefüllten Klasse geaddet und anschließend über den XmlSerializer serialisiert. Kann er damit beim speichern und beim öffnen umgehen?
Ist es aber nicht so, dass der FileStream eine Datei leert und diese dann anschließend mit den neuen Daten befüllt? Ich bin mir aber nicht sicher :)

Zitat:
Ah. Der Starter für ein Datenmodell ;) Du hast also Aufträge und Buchungen. Da lässt sich doch ein einfaches Datenmodel designen und du kannst beim speichern der Daten das Listview erstmal aus dem Kopf streichen.

Das verstehe ich gerade nicht ganz :gruebel:

Moderiert von user profile iconTh69: C#- durch Quote-Tags ersetzt


Ralf Jansen - So 22.05.16 18:05

Zitat:
Angenommen die Listview hat 6 Columns und mein Kumpel fügt 10.000 Einträge hinzu (unrealistisch aber ein gutes Beispiel zur Frage) :lol: und speichert dies. Nun wird eine Liste 10.000 mal mit einer gefüllten Klasse geaddet und anschließend über den XmlSerializer serialisiert. Kann er damit beim speichern und beim öffnen umgehen?


Ja. Aber nur weil du vielleicht 1 dieser 10000 Datensätze änderst möchtest du kaum alle 10000 schreiben müssen. Und laden eigentlich auch eher nicht. Bei 10000 Datensätzen bist du meiner Meinung nach schon lange an der sinnvollen Menge für ein Xml Datei vorbei. Soviel Daten in einem Xml Datei würde ich nur machen wenn sie zum Transport gedacht ist aber nicht um damit zu arbeiten(regelmäßig lesen, schreiben, ändern). Die Grenze liegt da eher bei einer kleinen 3stelligen Zahl.

Zitat:
Das verstehe ich gerade nicht ganz :gruebel:


Ich hacke immer noch auf dir rum damit du ein Datenmodel schreibst das UI (Listview) und Datenablage(Xml, Datenbank) isoliert damit du von der unsäglichen Frage "eine für ein Listview spezialisierte Datenbank" los kommst. Wenn man klar definierte Dinge schon benennen kann (Auftrag, Buchungen) ist ein Datenmodell nicht weit.


Csharp-programmierer - So 22.05.16 19:39

Ah okay. Jetzt weiß ich, was Sie meinen. Was stellen Sie sich unter einem Datenmodell vor? Sowas? Gewusst wie: Anpassen der Datenfeldanzeige im Datenmodell [https://msdn.microsoft.com/de-de/library/cc488522%28v=vs.100%29.aspx]

Moderiert von user profile iconTh69: URL-Titel hinzugefügt.


Delete - So 22.05.16 20:26

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Mo 23.05.16 09:41

Nein. Ich dachte ganz simpel an eine Satz Klassen die in Beziehung stehen und über Properties die Daten beschreibt die das abzubildende ~Business~ darstellt.
Das was du verlinkst geht schon viel zu weit und bezieht sich auch auf eine bestimmte Technik. Es ist schon falsch das es sich überhaput auf eine Technik (Asp.Net) bezieht.
Ein Datenmodel sollte erstmal was völlig technikunabhängiges sein, und am besten wäre wenn es das auch bleibt. Einfach nur Klassen und Properties. Wenn in den using Klauseln der Klassen des Datenmodels irgendwas von abhängigen Techniken auftaucht (aus dem der Asp.Net, Wpf, Winforms oder auch ADO.Net namespaces) solltest du dich fragen ob das richtig ist.


Csharp-programmierer - Mo 23.05.16 11:26

Also meinen Sie so etwas Ralf:

C#-Quelltext
1:
2:
3:
4:
public class Artikel {
 public string Name {get; set;}
 public steigt Abkürzung   {get; set;}
}


Und natürlich noch mehr. Oder was meinen Sie?


Ralf Jansen - Mo 23.05.16 14:14

Genau.


Csharp-programmierer - Di 24.05.16 15:58

Und wie geht es mit dieser Klasse nun weiter?


Ralf Jansen - Di 24.05.16 21:31

Du kannst dir jetzt überlegen wie du Daten aus der Klasse bzw. den Klassen die dein Datenmodell darstellen in die UI bekommst und anzeigst. Und unabhängig davon kannst du dir überlegen wie du die Daten aus den Klassen irgendwo ablegst und wieder einließt. Also 2.Probleme die man völlig unabhängig lösen kann. Nur dafür ist im Moment das Datenmodell da um als Fixpunkt zwischen den 2 Teilproblemen zu dienen und ein großes Problem (wie von Listview in eine Datenbank/xml und zurück) in 2 kleinere zu teilen die einzeln einfacher zu lösen sind. Aber du musst jetzt nicht prinzipiell was grundsätzlich anderes machen als vorher.


Csharp-programmierer - Fr 27.05.16 23:21

Okay. Ich werde mich dann nun mit Datenbanken beschäftigen müssen.
Ich habe dazu mal eine Frage:
Welchen Datenbanktyp empfehlt ihr mit? Das Programm soll - mit der Datenbank - auf anderen PC's laufen sollen. In meinem Programmierbuch verwenden sie eine Microsoft Access Datenbank. Auf YouTube habe ich mir ein Tutorial über MySQL angesehen. Die Schritte im Video habe ich dann auf VS 2013 nachgemacht, aber irgendwie funktioniert das nicht.


Delete - Sa 28.05.16 01:56

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - So 29.05.16 21:43

Also zum Erlernen von MySQL habe ich mir dieses Video angesehen: https://www.youtube.com/watch?v=9Pbg-XFqqfA
Do weit - so gut. Ich habe nun in meiner Datenverbindungsliste eine Datei namens MyDatabase.mdf

Wenn ich aber nun die Tabelle auf die Form ziehe, passiert nichts.
Und wo soll ich die Datenbankdatei speichern? In dem ZIP, in dem ich das Programm liefere?


Delete - So 29.05.16 22:48

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - So 29.05.16 23:10

Zitat:

Du bist ein angehender Profi-Entwickler, also versuch es auch entsprechend zu beschreiben. ;)


Vielen Dank für das Kompliment (angehender Profi Entwickler) :D
Also in Video sieht man, dass dieses Element per Drag'n'Drop auf die Windows Form gezogen wurde. Wenn ich das bei mir veruche, passiert nichts ;)

Zitat:
Ja, warum denn nicht? Oder du bietest sie zum Download an.

Teils. Also wenn die Benutzer (der Firma) die Anwendung schließen, soll die neue Datenbankdatei auf einen Server geladen werden, damit alle 4 Computer von den Daten auf den neuesten Stand sind. Ich denke mal das Hoch/Runterladen der Dateien sollte mittels UploadFile kein Problem sein - naja... schauen wir mal ;)

Um mit der Datenbankdatei zu "kommunizieren", habe ich mir mal so ein Video auf YouTube angesehen: https://www.youtube.com/watch?v=1EpYqtSlOr8

Wenn ich bei mir (VS 2013) ein Item "lokale Datenbank" in das Projekt einbeziehen möchte, finde ich dies nicht. Was muss ich jetzt genau suchen bei mir? SQL oder Microsoft SQL?


Delete - Mo 30.05.16 03:05

- Nachträglich durch die Entwickler-Ecke gelöscht -


Blup - Mo 30.05.16 10:23

user profile iconCsharp-programmierer hat folgendes geschrieben Zum zitierten Posting springen:
Also wenn die Benutzer (der Firma) die Anwendung schließen, soll die neue Datenbankdatei auf einen Server geladen werden, damit alle 4 Computer von den Daten auf den neuesten Stand sind. Ich denke mal das Hoch/Runterladen der Dateien sollte mittels UploadFile kein Problem sein - naja... schauen wir mal ;)

Normalerweise löst man dieses Problem, in dem nur eine Datenbankdatei und der Datenbankserver(Software) auf dem Server(Hardware) installiert wird. Die Anwender greifen über den Datenbankclient(Software) der auf seinem PC installiert ist auf diese gemeinsame Datenbank zu. So ist jede Datenänderung sofort für alle Benutzer verfügbar.

Sollen die Anwender auch ohne Verbindung zum Server (z.B. unterwegs auf einem Laptop) arbeiten können, ist das ein Fall für Replication.
Damit möchtst du dich als DB-Anfänger nicht auseinandersetzen.


Csharp-programmierer - Mo 30.05.16 16:12

Okay. Ich habe die .xsd Datei nun im Projektmappenexplorer gefunden. Ich habe jetzt aber das Problem, was ich immer habe, aber nur gestern nicht.

Ich erstelle eine neue Datenverbindung. Dann gehe ich unter dieser Datenverbindung auf Tabelle und dann aus Tabelle hinzufügen. Dann bearbeite ich die Tabelle und gehe auf das Speichern Symbol und fülle den Dialog aus. Wenn ich den Datenbankenexplorer aktuelisiere, steht die erstellte Tabelle nicht in der Liste.
Wenn ich nun auf z.B. Form1 [Entwurd] klicke und dann wieder auf speichern, öffnet sich wieder ein Dialogfeld. Gestern hatte ich dieses Problem nicht aber sonst immer. Deswegen war ich auch geeckelt von Datenbanken.


doublecross - Mo 30.05.16 18:07

Hallo,

ich muss zugeben ich kenne mich mit den im Studio Integrierten Datenbanktools nicht besonders aus, ich erzeuge Datenbanken sofern möglich in der Regel zur Laufzeit aus dem Code und da ich noch nicht lange in der .NET Welt unterwegs bin mache ich das bisher auch nur bei einem ADO.NET Projekt (bei dem die äußeren Umstände das Entity Framework nicht zulassen).

Ein kürzer Test hat mir aber gezeigt, dass das von dir Verwendete Tool scheinbar dafür da ist SQL-Skripte zu erzeugen, also Textdateien, die du wie auch immer verwenden kannst. Zumindest sind es diese Dateien die herausfallen, wenn du auf Speichern drückst.

Wenn du diese Skripte direkt ausführen willst musst du den "Aktualisieren-Knopf" bemühen und nicht Speichern. Dann erscheint deine Designte Tabelle sofort in der Datenbank und du kannst damit arbeiten.
Wie du sie dann Später zu deinen "Kunden" bringst, damit sie auch dort läuft ist wieder eine ganz andere Frage.

Generell habe ich den Eindruck, dass du zu viel auf einmal willst. Ich habe einige deiner Fragen, die sich um dieses Projekt drehen, gelesen und diese deuten da auf eine ziemliche Überforderung hin (das ist keineswegs böse gemeint, sondern nur eine Feststellung). Daher möchte ich dir nahe legen, erst noch einmal einen Gang runter zu schalten und dich unabhängig von dem Projekt noch mehr mit den Grundlagen zu beschäftigen.

Wie user profile iconRalf Jansen dir weiter oben erklärte näherst du dich dem Problem aus einer ungünstigen Richtung, dann hast du wenig bis keine Erfahrung mit den verwendeten Techniken (ja ich halte es für absolut richtig hier auf ein Datenbanksystem zu setzen) und daher kannst du keine auch nur annähernd optimalen Lösungen umsetzen. Das ganze wird zu einem Produkt führen, dass du spätestens in einem Jahr, wenn du etwas mehr Erfahrung hast neu schreiben willst.

Du solltest dich zumindest mit den Grundlegenden Möglichkeiten von Datenbanken und SQL vertraut machen, ich würde dir hierfür vorschlagen, ein neues privates Projekt zu machen, in dem du zumindest mal eine Relation hast. Vielleicht eine Mini DVD Verwaltung, diese sollte mindestens eine Liste mit deinen DVDs enthalten (klar) und eine mit den Namen deiner Freunde, da du in dem Programm vermerken solltest an welchen Freund du welche DVD verliehen hast. Wichtig hierbei, jeder Freund kann mehrere DVDs leihen und du darfst weder die Namen der Freunde noch die der Filme in mehr als eine Tabelle schreiben. Des weiteren solltest du zuerst dein Datenbank Modell erstellen und erst wenn dass Fertig ist mit dem Programm beginnen.
Wenn du so eine Aufgabe lösen kannst, dann wirst auch das Programm für deinen Freund viel besser gestalten, und ihm ein qualitativ hochwertigeres Programm abliefern.

Wie gesagt, ich meine dass ganze überhaupt nicht böse, wir alle haben mal angefangen und es ist bewundernswert, wie du dich in dein Projekt verbeißt, aber das gezielte verbessern deiner Fähigkeiten im Vorfeld kann das Ergebnis nur besser machen.


Delete - Mo 30.05.16 19:29

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - Mo 30.05.16 19:47

Zitat:
Wie du sie dann Später zu deinen "Kunden" bringst, damit sie auch dort läuft ist wieder eine ganz andere Frage.

Heißt das, dass die Anwendung mit der SQL-Datenbank nicht auf anderen PC funktioniert? :crying:

Zitat:
Generell habe ich den Eindruck, dass du zu viel auf einmal willst. Ich habe einige deiner Fragen, die sich um dieses Projekt drehen, gelesen und diese deuten da auf eine ziemliche Überforderung hin (das ist keineswegs böse gemeint, sondern nur eine Feststellung). Daher möchte ich dir nahe legen, erst noch einmal einen Gang runter zu schalten und dich unabhängig von dem Projekt noch mehr mit den Grundlagen zu beschäftigen.

Also wie soll ich anfangen. Wenn ich diesen Auftrag von meinem Kumpel nicht bekommen hätte, würde ich wahrscheinlich immer noch auf den XmlSerializer rumsitzen und mir die Frage stellen, ob dies der richtige Weg ist, so eine Menge von Daten abzuspeichern. Doch nun stelle ich mich halt den neuen Herausforderungen z.B. den Datenbanken. Dadurch, dass ich immer komplexere Aufträge bekomme, bilde ich mich mit meinen Programmierkenntnissen deutlich weiter, als ohne die Aufträge. Denn dann würde ich mich wahrscheinlich immer auf dem selben Niveau aufhalten und nicht viel neues erlernen. Also das ist zwar Ansichtssache, aber ich bin der Meinung, dass ich mich dadurch besser entwickle. Zumal ich für private Testprojekte nicht wirklich Ideen habe. :lol:

Also durch den Button Aktualisieren habe ich nun eine Tabelle erzeugt und (wie im Video) das DataSet auf die Form bekommen :party:
Wenn ich in das DataGridView nun Daten eingebe und speichere, passiert anscheinend nichts. Beim öffnen enthält das DGV keinerlei Daten, was ich nicht vertshe, da das im Video problemlos funktioniert. Auch in dem VS Projektordner befinden sich die Datenbankendateien. Woran kann das jetzt liegen?


Ralf Jansen - Mo 30.05.16 20:12

Zitat:
Heißt das, dass die Anwendung mit der SQL-Datenbank nicht auf anderen PC funktioniert? :crying:


Nicht von alleine. Je nachdem was du genau tust musst du den SQL Server mit installieren. Da du ja überraschenderweise eh eine Multiuser Anwendung zu schreiben scheinst wäre es eh ratsam einen zentralen Sql Server zu installieren auf den alle Clients(deine Anwendung) drauf zugreifen und gleich mit den gemeinsamen Daten arbeiten.

Alles was du dir da mit UploadFile und abgleichen ausgedacht hat klingt nach Problem. Denke mal kurz durch was bei paralleler Bearbeitung von irgendwas passiert(Ein User ändert a nach b und ein anderer a nach c. Wer gewinnt? Eine, beide, keiner? Wie führst du diese Daten richtig zusammen?)

Zitat:

Also wie soll ich anfangen. Wenn ich diesen Auftrag von meinem Kumpel nicht bekommen hätte, würde ich wahrscheinlich immer noch auf den XmlSerializer rumsitzen und mir die Frage stellen, ob dies der richtige Weg ist, so eine Menge von Daten abzuspeichern. Doch nun stelle ich mich halt den neuen Herausforderungen z.B. den Datenbanken. Dadurch, dass ich immer komplexere Aufträge bekomme, bilde ich mich mit meinen Programmierkenntnissen deutlich weiter, als ohne die Aufträge. Denn dann würde ich mich wahrscheinlich immer auf dem selben Niveau aufhalten und nicht viel neues erlernen. Also das ist zwar Ansichtssache, aber ich bin der Meinung, dass ich mich dadurch besser entwickle. Zumal ich für private Testprojekte nicht wirklich Ideen habe. :lol:


Jeder Jeck ist anders und es kann so funktionieren. Ich mache es eigentlich ähnlich wenn ich mich einem neuen Thema nähere. Ich versuche es aber bei jedem Projekt bei einer unbekannten zu belassen. Wenn man n Techniken neu lernen muss bekommst du die beim lernen kaum getrennt. Insofern finde ich die angesprochenen Idee mal kurz dieses Projekt wegzulegen und was speziell nur zu Datenbanken zu probieren richtig. Deine Idee mit Uploadfile drückt noch soviel Unverständnis aus (das war vermutlich schon bei der Xml Lösung nahe am Wahnsinn) das du eigentlich nur was richtig kaputtmachen kannst wenn du es nicht vorher an was anderem kurz probierst und ein paar Grundlagen legst. Dabei sollten dann ein paar Dinge klar werden bzw. die Probleme die du auch lösen musst bewußt werden (was ist eine Datenbank - Es gibt da verschiedene Typen nicht nur verschiedene Marken - Was für eine Datenbank will ich eigentlich, wie bekomme ich die deployed, soll die auf einen extra Rechner, wie löse ich Multiuserprobleme, was sind Transaktionen, welche Zugriffvarianten gibt es für Datenbanken, wie sichere ich die Daten, wie steuere ich Zugriffsrechte etc.)


Delete - Mo 30.05.16 20:35

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Mo 30.05.16 20:48

Zitat:
Auch in dem VS Projektordner befinden sich die Datenbankendateien. Woran kann das jetzt liegen?


Kopierst du bei jedem kompilieren die Datenbank Files neu in den Ausgabeordner?


Klabautermann - Di 31.05.16 07:18

Hallo user profile iconCsharp-programmierer,

es gibt unzählige Datenbanken mit denen du Arbeiten kannst und es gibt ebenso verschiedene Techniken wie du dann darauf zugreifst. In deinem Fall würde ich mir z. B. mal das Entity-Framework ansehen. Das ist (vereinfacht gesagt) eine Technik, die aus deinen C# Objekten eine dazu passende Datenbank erzeugen kann oder anders herum aus einer Datenbank die Passenden C#-Objekte. Du arbeitest dann nur mit den Objekten und bekommst nur Bedingt mit, was in der Datenbank passiert. Du musst ehe du es nutzen kannst, sicher auch hier eine Menge Theorie büffeln [http://openbook.rheinwerk-verlag.de/visual_csharp_2012/1997_37_001.html], aber ich kann mir vorstellen, dass es in der Summe weniger ist als wenn du dich in die "Manuelle" Datenbank Programmierung [http://openbook.rheinwerk-verlag.de/visual_csharp_2012/1997_31_001.html#dodtpe8718b27-0d2c-45fd-a030-421a21b5d151] einarbeitest (hoffe ich zumindest ;)).

Generell können auch hier Grundlagen nicht schaden aber vielleicht kommen die ja beim Arbeiten damit. Da ich es selbst aber noch nicht verwendet habe (komme eher aus der Delphi Ecke) kann ich das aber nicht beurteilen.

Gruß,
Klabautermann


Csharp-programmierer - Di 31.05.16 19:28

Zitat:
Das kann nur daran liegen, wenn man keine Datenbankdatei erstellt hat, in der man die nötigen Datensätze aus dem DataGridView speichern kann.


Okay. Ich habe die .sql Datei nun in den selben Ordner wie die .exe gelegt und nun funktioniert es.

Zitat:
Kopierst du bei jedem kompilieren die Datenbank Files neu in den Ausgabeordner?


Ich habe die Datenbankdateien und die .sql Datei einmal in einen Seperaten Ordner auf den Desktop kopiert. Scheint bei mir zu funktionieren. Ich habe einem Kumpel gerade den ZIP-Ordner mit diesen Files geschickt, aber bei ihm kommt der Fehler, dass der Server nicht gefunden wurde.


Ralf Jansen - Di 31.05.16 20:03

Hast du den den Sql Server installiert bzw. etwas das dem entspricht? Eine Datenbank ist nicht einfach ein File.


Csharp-programmierer - Di 31.05.16 20:12

Nein. Ich erkläre mal meinen Gadenkengang :puke:
Die SQL Datei sagt wie die Datenbank aussehen soll und die 2 Datenbankfiles beinhalten die Daten der Datenbank. Ich dacht mehr braucht man nicht. Aber wie installiere ich den Server? Woher bekomme ich die Serverdatei?


Ralf Jansen - Di 31.05.16 20:20

Ein Sql Server ist eine Anwendung die du wie jede andere Anwendung installierst. Downloadbar bei Microsoft.

Zitat:
Die SQL Datei sagt wie die Datenbank aussehen soll und die 2 Datenbankfiles beinhalten die Daten der Datenbank.


Ich vermute ganz schwer das die Sql Datei überflüssig ist. Das wäre so als würdest du Sourcecodedateien (*.cs) mit der Anwendung ausliefern. Entweder du lieferst die sql Dateien mit um vor Ort eine neue Datenbank zu erzeugen (die mdf) oder du lieferst gleich die mdf mit um sie in einen SqlServer einzuhängen aber nicht beides.


Klabautermann - Mi 01.06.16 07:20

Hallo user profile iconCsharp-programmierer,

wenn du mit Datenbanken Arbeitest, dann ist das im Grunde so, als ob du ein eigenständiges Programm verwendest, dass darauf spezialisiert ist, deine Daten, besonders schnell, organisier, durchsuchbar oder sonst wie Toll zu speichern. Dieses andere Programm, das Datenbank Management System (DBMS) musst du mit ausliefern. Dabei gibt es von DBMS die einfach nur in einer DLL laufen bis zu komplexen Client-Server Systemen alles, übrigens auch mit den Unterschiedlichsten Lizenzen, die dich als Nutzer eventuell zu diesem oder jenen Verpflichten.

Mit dem MS-SQL-Server (Express) hast du dich für ein eher großes System entschieden, welches eine Installation voraussetzt. Wenn ich mich recht erinnere war das ein recht einfaches Setup (ich habe nie eine ernsthafte Anwendung gegen dem MS-SQL Server programmiert), somit muss dieses vor dem Start deines Programms durchgelaufen sein. Hättest du dich z.B. für SQLite entschieden so müsstest du nur eine DLL mitliefern, das System würde aber z. B. weniger gut funktionieren, wenn mehrere Clients gleichzeitig auf deine Datenbank zugreifen wollen. Was du verwendest ist also sehr abhängig von dem Einsatzszenario deiner Anwendung, jedes DBMS hat seine eigenen Stärken und Schwächen.

Wenn du also eine Datenbank-Anwendung schreibst besteht dein Programm aus mindestens 3 Komponenten 1. Deinem Programm, 2. dem DBMS und 3. Deiner Darenbank/Tabellenstruktur.

Gruß,
Klabautermann


Csharp-programmierer - Mi 01.06.16 16:26

Zitat:
Ein Sql Server ist eine Anwendung die du wie jede andere Anwendung installierst. Downloadbar bei Microsoft.

Ist die Version egal? Dann würde ich diese nehmen:

Muss man den Server richtig auf dem PC installieren, oder reicht es, alle Dateien von diesem Download mit in den ZIP zu packen?


Delete - Mi 01.06.16 17:08

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Mi 01.06.16 19:49

Zitat:
Ist die Version egal?

Es ist ein eigenes Stück Software die ihre eigenen Systemanforderungen mitbringt. Du solltest vor einem Projekt Wissen auf welchen Betriebssystemen das denn nachher mindestens laufen soll.
Ich würde einfach die aktuellste Version vom Sql Server [https://www.microsoft.com/de-de/download/details.aspx?id=42299] nehmen und nur wenn die Systemanforderungen nicht passen was älteres aussuchen. Z.b. wenn du die Anforderung hast das dein Programm noch unter XP/Vista laufen muss.
Zitat:
Muss man den Server richtig auf dem PC installieren, oder reicht es, alle Dateien von diesem Download mit in den ZIP zu packen?

Wir reden von etwas das schon ~Server~ im Namen trägt. Also nein es ist nichts was man einfach irgendwo dabei packen kann. Es muss schon richtig irgendwo installiert werden. Letztlich steckt dahinter ein Windows-Dienst [https://de.wikipedia.org/wiki/Windows-Systemdienst].

Später wenn du das mal gemacht und verstanden hast kannst du dir den Sql Server LocalDB [https://msdn.microsoft.com/de-de/library/hh510202(v=sql.120).aspx] anschauen ob dir das hilft. Der ist etwas leichtgewichtiger als wenn man das volle Paket nimmt. Aber es ist immer noch ein eigener msi Installer. Mit einem guten MSI Setup Builder Tool das du zum erstellen deines Installers benutzt sollte man den aber mit integrieren können. Ich vermute aber mal das das für dich nicht das richtige ist. Wie der NAme schon andeutet ist das für den lokalen Fall gedacht. Für ein Mehrbenutzersystem an dem mehrere Leute an verschiedenen Rechner gleichzeitig arbeiten wollen ist es mehr als empfehlenswert ein Datenbank Server auf einem expliziten System zu installieren zu dem sich alle Benutzer verbinden.
Das ist also eine eigene Installation nur für den Server, potentiell auf einem anderen Rechner, eher unabhängig von der Installation deiner Anwendung.


Csharp-programmierer - Di 07.06.16 17:48

Okay. Ich habe mir mal den ersten Link angesehen. Ich weiß nicht, welche Dateien davon man wirklich braucht, damit
1) die Anwendung (mit SQL Datenbankserver) auch auf dem Userpc läuft
2) die Daten von PC A auf PC B übertragen werden.

Ich kenne meinen Kumpel und wenn ich ihm sage, dass der Download (alle Dateien) 6,1 GB groß ist, wird er es wahrscheinlich nicht zulassen (wegen Speicherkapazität von der Festplatte). Also welche Dateien davon sind wirklich notwendig?


Ralf Jansen - Di 07.06.16 20:43

Zitat:
1) die Anwendung (mit SQL Datenbankserver) auch auf dem Userpc läuft


Der Sql Server ist erstmal eine andere Anwendung. Näherungsweise solltest du dir Vorstellen das der nicht auf einem Userpc läuft sondern woanders. Zumindest solltest du davon nur einen brauchen gegen den dann alle Userpcs arbeiten. Die Verbinden sich alle zur gleichen Datenbank. Wenn dieser eine Sql Server zufällig auf einem PC läuft wo auch deine Anwendung läuft solltest du das also genau als das betrachten ... einen Zufall.

Du solltest dich nicht fragen welche Dateien vom Sql Server du brauchst. Du brauchst den ganzen Installer mit allen Dateien. Der Installer ist nicht Teil deiner Anwendung damit man denn auch z.B. an einem Ort installieren kann auf dem deine Anwendung nicht installiert ist sondern der explizit als Server gedacht ist. Eine Datenbank gehört nur dann zu deiner Anwendung wenn das explizit eine Einzelplatz Anwendung ist an der nur ein Anwender allein mit diesen Daten arbeitet. Aber wenn ich dich verstehe willst du die Daten mit mehreren Anwendern an eigenen Arbeitsplätzen teilen. Dafür brauchst du einen zentralen Punkt an dem alle Daten zusammenlaufen. Diese Stelle nennt man üblicherweise Server und da gehört dein Sql Server hin.

Zitat:
2) die Daten von PC A auf PC B übertragen werden.


Wenn PC A und PC B dem entspricht was du Userpc genannt hast tauschen die direkt keine Daten aus. Beide speichern ihre Daten in der einen Datenbank die auf dem Rechner liegt auf dem der Sql Server installiert ist und vom Sql Server verwaltet wird. Lokal speichert keiner der beiden Daten beide schauen nur in die gemeinsame Datenbank und ~sehen~ was der jeweils andere gemacht hat.

Zitat:
Ich kenne meinen Kumpel und wenn ich ihm sage, dass der Download (alle Dateien) 6,1 GB groß ist, wird er es wahrscheinlich nicht zulassen (wegen Speicherkapazität von der Festplatte). Also welche Dateien davon sind wirklich notwendig?


Wenn du zum Beispiel Office installierst oder eine Spiel überlegst du vor dem installieren(oder danach) welche Dateien davon du wirklich brauchst? Schaust du in die Ordner dieser Programme und fängst an alles zu entsorgen von dem du denkst das wäre nur Ballast udn braucht man nicht? Nein du installierst diese Anwendungen und benutzt die so. Das solltest du auch mit dem Sql Server machen.


Csharp-programmierer - Sa 18.06.16 11:58

Okay, also ich habe es jetzt (endlich) geschafft, den SQL Server von Ralf Jansen zu installieren. Durch mein Praktikum kann ich jetzt auch ein paar SQL Querys schreiben und weiß auch, was sie bedeuten. Ich versuche durch diese Methode an die Datenbank heranzukommen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public DataTable OpenQuery(string ConnectionString, string Query)
        {
            OdbcConnection connection = new OdbcConnection(ConnectionString);
            connection.Open();

            OdbcCommand command = new OdbcCommand(Query, connection);
            OdbcDataReader dataReader = command.ExecuteReader();

            DataTable resultData = new DataTable();
            resultData.Load(dataReader);

            connection.Close();
            command.Dispose();
            connection.Dispose();
            return resultData;
        }


Jetzt habe ich das Problem, dass ich nicht weiß, wie man den ConnectionString schreibt. Dieser funktioniert auf jeden Fall nicht :(
Wie muss nun also so ein ConnectionString heißen?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void button1_Click(object sender, EventArgs e)
        {
            string ConnectionString = "Persist Security Info=False;Integrated Security=true;Initial Catalog=Northwind;server=(local)";
            string Query = "SELECT *" + 
                   "FROM Mitarbeiter" +
                   "ORDER BY Nachname";

            OpenQuery(ConnectionString, Query);
        }


Th69 - Sa 18.06.16 12:16

Schau mal unter connectionstrings.com [http://connectionstrings.com] bzw. explizit unter SQL Server [http://www.connectionstrings.com/sql-server/].


Ralf Jansen - Sa 18.06.16 13:03

Du solltest nicht ODBC benutzen sondern die nativen Zugriffsklassen für den Sql Server.
Also nicht OdbcConnection sondern SqlConnection. Bei den anderen Datenzugriffsklassen genauso. Dort wo du gerade die Odbc... Variante verwendest nimm die Sql... Variante.

Wenn man Dispose manuell aufruft macht man meist was falsch. Gewöhne dir an wenn du schon merkst das man Dispose aufrufen sollte/kann einen using Block zuverwenden. Der ruft Dispose garnatiert auf und nicht nur wenn kein Fehler auftritt wie in deinem Code.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public static DataTable OpenQuery(string connectionString, string query)
{
    DataTable dt = new DataTable();
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        con.Open(); 
        using (SqlDataAdapter da = new SqlDataAdapter(query, conn))
        {            
            da.Fill(dt );
        }
    }
    return dt;
}


Dein ConnectionString sieht nicht so falsch aus wenn man den auch Sql Server Zugriffkomponenten benutzt und nicht ODBC. Vermutlich heißt deine Datenbank aber nicht Northwind?


Csharp-programmierer - So 03.07.16 17:06

Okay. Also ich weiß nicht, ob ich es richtig verstanden habe. Ich habe hier (glaube ich) den SQL Server installiert. Nun muss ich für einen Freund ein Programm mit Login schreiben.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
private void button1_Click(object sender, EventArgs e)
        {
            string ConnectionString = "Server=" + "" + ";Database=myDataBase;Trusted_Connection=True;";
            string Query = "";
            OpenQuery(ConnectionString, Query);
        }

        public static DataTable OpenQuery(string connectionString, string query)
        {
            DataTable dt = new DataTable();
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                con.Open();
                using (SqlDataAdapter da = new SqlDataAdapter(query, con))
                {
                    da.Fill(dt);
                }
            }
            return dt;
        }


Soo. Jetzt hätte ich folgende Idee: Ich liefere Ihm einfach die Datenbankdatei (.mdf) mit, und über einen OpenFileDialog kann er das nun öffnen (einmalig, beim ersten Programmstart). Den Pfad füge ich bei Server=... ein. In Visual Studio heißt die Datenbankdatei nun LoginDaten. Würde das dann nun so funktionieren?


Ralf Jansen - So 03.07.16 20:53

Kommt ein wenig auf die Variante des Sql Servers an die du benutzt. Üblicherweise braucht man dafür dann eine AttachDbFilename Parameter im ConnectionString.

Richtiger wäre aber bei einer Datenbank die dafür vorgesehen Backup/Restore Mechanismen zu verwenden. Nebenbei musst du dann eh einen Backup/Restore Mechanisus in deiner Anwendung einbauen der sich für Zwischendurch eh gut macht (wenn man nicht davon ausgehen kann das der Benutzer eine professionelle Backupsoftware benutzt oder selbst als Admin Hand an den Sql Server anlegen will) und nicht nur um am Anfang zu Initialisierung ein initiales Backup per Restore einzuspielen.


Csharp-programmierer - So 03.07.16 21:23

Das Thema Datenbanken wird ja von Post zu Post immer komplizierter. Trotzdem möchte ich es erlernen. Was ist nun der Unterschied zwischen einem normalen Pfad und einem AttachDbFilename? Als Server verwende ich den 2012 SQL Server, glaube ich. Wozu brauche ich nun die Backup Mechanismen? Ich kann ja auch einen Algorithmus schreiben, der die Datenbankdatei auf einen externen Datenträger kopiert, oder?


Ralf Jansen - So 03.07.16 21:38

Zitat:
Ich kann ja auch einen Algorithmus schreiben, der die Datenbankdatei auf einen externen Datenträger kopiert, oder?


Kannst du aber warum nicht das Benutzen was schon da ist und (erprobt) funktioniert? Backup/Restore ist ein Standardverfahren und ja in deinem speziellen Fall mag es unnötig sein aber Backup/Restore ist was was bei jedem DB System in irgendeiner Form existiert und auch in fast jede Größenordnung skaliert. Backup/Restore kannst du z.B auch benutzen wenn das System läuft (unterbrechungsfrei). Auf solche Backups kannst du Transaktionlogs anwenden um im Zweifel sekundengenau eine Datenbank wiederherstellen (Wenn du weißt ein Problem war um 12:01 kannst du die Datenbank genau zum Zeitpunkt 12:00 Uhr wieder herstellen). Backup/Restore löst viele Problem die du möglicherweise nicht hast, glaubst nicht zu haben oder noch nicht siehst.


Christian S. - So 03.07.16 21:49

Hallo,

ich mache dieses Thema jetzt mal zu.

Vorweg, @Csharp-programmierer: Das heißt ausdrücklich nicht dass Du dazu nicht mehr fragen sollst oder darfst, ganz im Gegenteil!

Aber:

Dieses Thema entwickelt sich in die Richtung "Alles, was zu Datenbanken mal gesagt werden sollte". Das ist weder für Dich, Csharp-programmierer, sinnvoll noch für irgendwen, der hinterher ein Problem lösen möchte und dieses Topic liest.

Daher stelle bitte konkrete Fragen und am besten angefangen bei den Grundlagen. Pro Topic eine Frage mit hoffentlich lernstands-gerechten Antworten. *mit dem Zaunpfahl winkt*
Das dürfte hier alle irgendwie weiter bringen als ein Sammelsurium, in dem sich niemand mehr zurecht findet ;)

Viele Grüße
Christian