Einfaches Datenbank-Programm (freeware), C#, Hilfe gesucht



  • Hallo,

    Ich bin an meinem ersten Programm mit dem SQL-Server 2005 Express (hatte bisher nur Mobile mit einer Tabelle verwendet) und stecke fest. Es ist mehr eine Übung aber ich denke ich werde es dann auch rausbringen mit meinen Freeware-Programmen.
    Jemand geübtes hat mein Problem möglicherweise in 10-15 Min. gelöst. Ich versuchte schon selbst, hier im Forum (http://c-plusplus.net/forum/viewtopic-var-t-is-247491-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html und kam etwas weiter, aber noch nicht ans Ziel und nun ist nach einem Absturz irgendwie das Projekt beschädigt (Fehler in der XSD); dazu habe ich momentan nicht so viel Zeit. Wäre sehr dankbar wenn mir jemand das Problem im Thread (eine Lösung auf der 2. Seite) beheben könnte und prüfen ob die Indizes sinnvoll vergeben sind, wenn nicht dann ändern und den Rest ev. kurz überblicken (ALTER INDEX REORGANIZE gibt -1 verarbeitete Zeilen zurück, und wenn Ihr Zeit hättet noch die Möglichkeit mit den Bildern in die Datenbank speichern, scheiterte ich auch, band eine PictureBox). Wenn ich mal ein funktionierendes Beispiel habe an dem ich sehe wie man es richtig macht werde ich künftig die Probleme auch nicht mehr haben aber jetzt im Moment bekomme ich es einfach nicht raus und wegen dem Absturz (dass sich die Projekte so leicht beschädigenlassen!?) fehlt gerade etwas die Motivation, aber wenn das gelöst wäre dann hätte ich wieder Neue.

    Der Reiz an dem Programm für mich ist dass es auch für grössere Datenmengen geeignet sein sollte (nicht einfach den Fill mit einem SELECT * FROM... sondern nur kleinere Teile jeweils), habe gespeicherte Prozeduren erstellt welche die nötigen Zeilen aus beiden Tabellen abrufen. Nur wäre ich froh wenn mir jemand diese Probleme beheben könnte und das Projekt dann zurücksenden könnte. Es findet sich hier: http://rebenstudio-it.ch/CDArchiv.zip

    Dafür wird der Name natürlich auch aufgeführt.

    Danke 🙂



  • also helfen beim coden kann ich dir nicht aber bei mir ist auch mal der pc abgestürtzt beim arbeiten und ich glaub da kam auch so ein fehler sicher mal deine projekte / codes usw aufm nem stik oder i-wo anders und installier da programm mit dem du es schreibst neu bei mir hats geholfen



  • danke, ja ich hab es auf dem 2. Betriebssystem auf diesem PC neu installiert; dort wo es war ist eh langsam ziemlich nicht mehr gut, darum hatte ich ein 2. Installiert.



  • also wenn ichs richtig verstanden hab funktionierts?



  • Ja also eine funktionierende IDE hab ich ja schon...



  • So nach einiger Zeit und leider noch immer hone Hilfe habe ich das Projekt wieder in Angriff genommen. Habe das Projekt neu erstellt aus der Datenbank, die ich geändert habe. Nun bin ich so weit: Einfügen, ändern und löschen von Einträgen (CDs und Tracks) funktioniert nun. Auch das Löschen eines Albums ohne verwaiste Track-Einträge zurückzulassen.

    Manchmal kommt eine Fehlermeldung betr. Nummer-Spalte; siehe dazu den anderen Post (Link in vorherigen Posts).
    Das Problem, dass es zu Fehlern bei Änderungen an der Datenbank kommt, sofern nicht die ganze DB ins DataSet geladen wird ist nun neu; da wäre ich um Hilfe sehr froh. Ebenfalls wenn sich jemand das selbe Problem kurz anschaut auch in der Images-Tabelle (welche momentan noch nicht im Einsatz ist).

    Ich hab's nun nach 12 Jahren im Verkauf arbeiten geschafft eine Stelle als Entwickler (Praktikum) zu bekommen; mit C++ und QT, Da ich nun auch QT übe blieb mir nicht so viel Zeit und ich wäre froh mal ein korrekt designtes Beispiel für eine Datenbank zu haben (war meine erste), damit ich zukünftig Bescheid weiss.

    Danke



  • Um was gehts jetzt hier eig. wenn man fragen darf 🙂
    Suchst du hilfe bei einem projekt oder ging es darum etwas zu fixen?



  • C. M. Obrecht schrieb:

    und ich wäre froh mal ein korrekt designtes Beispiel für eine Datenbank zu haben (war meine erste), damit ich zukünftig Bescheid weiss

    lies dir einfach mal die normalformen durch.
    sollte nicht so schwer zu verstehen sein.



  • Um was gehts jetzt hier eig. wenn man fragen darf
    Suchst du hilfe bei einem projekt oder ging es darum etwas zu fixen?

    Beides, also Hilfe beim Projekt indem das Problem gefixt wird in erster Linie. Es muss natürlich nicht nur dabei bleiben; wenn jemand Lust und eine Idee hat zum einbringen, gerne.

    lies dir einfach mal die normalformen durch

    Die hab ich gelesen. Nur da steht auch nicht welche Einstellungen für die FKs beispielsweise verwendet werden sollen etc. Ich habe nur eigentlich nicht eine vollständig normalisierte DB aber das macht ja da auch wenig Sinn, wie ich auch gelesen habe ist die Performance dann oft iemlich schlecht.



  • ich wäre evtl. interessiert wenn das Projekt in/mit WPF gemacht wird 😃



  • Ich habe nur eigentlich nicht eine vollständig normalisierte DB aber das macht ja da auch wenig Sinn,

    Das würde ich so nicht sagen.

    wie ich auch gelesen habe ist die Performance dann oft iemlich schlecht.

    Das kann sein, ja. Um das abschätzen zu können muss man allerdings schon einiges an Hintergrundwissen haben und/oder einfach Vergleiche anstellen.
    Einfach so sagen "ne, das normalisier ich jetzt nicht weiter, weil ich hab ja gelesen dann wird die Performance schlecht" ist allerdings Unfug.

    Hast du ein Backup der Datenbank (nur leere Tables, keine Daten)? Oder die SQL-Scripts die die DB erzeugen? Dann könnte man sich das ja vielleicht mal ansehen.



  • WPF? Nein, dasvon habe ich keine Ahnung, und kein VS 2008. Bleibe bei Windows Forms.

    OK ja gut das weiss ich wirklich nicht so genau wie weit das da Sinn macht weiter zu normalisieren. Ich lagerte einfach die Tracks-Tabelle (und images) eigen aus da dies ja unbedingt nötig ist und die CDs-Tabelle alle Informationen zu einer CD enthält ausser den Tracks, aber die Tabelle als solches alleine doch noch Sinn macht um es zu vereinfachen.

    Die Datenbank (mdf) enthält nur etwa 3, 4 Einträge; kürzlich begann ich aber die Implementierung einer Backup-Funktion welche die SQL-Server Backup-Funktion nutzt und soweit funktioniert dass es auf dem Entwicklerrechner läuft (das andere ist noch ein Problem mit der lokalisierung des ConnectionStrings); aber wenn Du das brauchen kannst kann ich Dir gerne ein Backup senden. In der mdf ist allerdings wie gesagt fast nichts an Daten.



  • aber wenn Du das brauchen kannst kann ich Dir gerne ein Backup senden

    äh. wenn du willst dass sich irgendjemand irgendwas ansieht, musst du es schon herzeigen.

    oder sind die entsprechenden daten in dem .zip file im ersten beitrag hier enthalten -- und auch noch aktuell?



  • Ja natürlich (sorry), habe das Zip-File auf dem Server aktualisiert. An der Anwendung habe ich seither etwas weitergemacht, aber nichts was die Datenbindung betrifft und die Datenbank ist unverändert.



  • also nur kurz 2-3 dinge die mir aufgefallen sind, und die schnell erklärt sind:

    1. "table" an tabellennamen anängen ist unnötig und redundant
    2. ich persönlich finde plural namen ("CDs") für tabellen nicht gut - singular namen ("CD") sind IMO praktischer
    3. es ist nicht unüblich den primary key "TABELLENNAME_ID" zu nennen, und als erste spalte zu haben (wenn man eine extra spalte für den primary key verwendet)
    4. IMO sind da einige spalten nullbar, die nie null sein dürfen (CD-Name z.B.)
    5. sonderzeichen in tabellen/-spaltennamen sind pfui
    6. nvarchar(50) ist vermutlich etwas kurz für CD-titel/interpreten-namen
    7. die interpreten solltest du vermutlich schon in eine eigene tabelle auslagern
    8. ich persönlich nenne spalten immer "TABELLENNAME_SPALTENNAME", also z.B. "CD_Erscheinungsjahr" oder so - ich finde das übersichtlicher.
    9. wieso nvarchar für das erscheinungsjahr? willst du da "irgendwann in den 70ern" reinschreiben oder was?
    10. was ist die "original" spalte - und wieso ist die nvarchar?
    11. was ist die "quelle" spalte? reicht auch nach einem kandidat für ne eigene tabelle
    12. "Stil" nennt man üblicherweise Genre
    13. ist es beabsichtigt dass du mehrere bilder zu einer CD haben kannst, diese bilder aber keinerlei beschreibung/rolle/reihung/... haben?
    14. in der tracks tabelle würde ich keine extra spalte für den primary key verwenden, sondern die beiden spalten "CD_Nummer" und "Nr" (-> Track_Nummer) zusammen als primary key verwenden (ja, man kann mehrspaltige primary keys machen)
    15. in der tracks tabelle fehlt die info zum interpreten - wie willst du sonst sample abdecken?
    16. genaugenommen kann es mehrere "contributers"/"interpreters" für eine CD/für einen track geben -- kann man aber natürlich der einfachkeit halber weglassen
    17. für die track-länge wäre vermutlich ein integer feld (sekunden), oder ein smalldatetime objekt sinnvoller als ein char feld


  • Vielen Dank für die Vorschläge!

    zu 4: eine der Spalten - Album-Name der Interpret darf absichtlich leer sein, die eine ist ja not null; gerade z.B. bei Samplern störte es mich schonmal nicht einfach nur einen Namen angeben zu können.

    zu 5: Meinst Du Nr. ? Ja das habe ich im Nachhinein realisiert aber da es dann ging habe ich es so belassen.

    zu 6: Stimmt, das lässt sich ja auch ändern ohne das DataSet ändern zu müssen oder?

    zu 9: Ja tatsächlich so ähnlich; es soll nicht nach Daten dort gesucht werden aber Benutzer haben manchmal diverse Vorlieben und sollen da auch tun können was sie wollen 🙂

    zu 10: Auch so ähnlich; Original z.B. "Schallplatte" oder Tonband usw. oder man kann J/N eingeben (wo es auch ein Bool täte, den Benutzern überlassen).

    11: siehe 10: LP, Download, Band oder CD, selbst aufgenommen etc. könnte man da reinschreiben.
    Diese beiden Spalten kann man auch umfunktionieren wenn man nicht nur CDs sondern eben auch Platten, MDs, Bänder, mp3s usw hat und auflisten möchte.

    13: Die Bilder-Funktion habe ich noch nicht so überlegt; versuchte mal eine Datenbindung zu einer PictureBox automatisch herzustellen aber es gelang nicht; ich dachte zuerst nur an ein Bild, eine PictureBox welche einfach das Bild zeigt wenn die Spalte aktiv ist. Das ist eine eigene Tabelle wegen der Grösse, 1000 Alben mit Bild, je 100 Kb wenn sie relativ gross sind......

    zu 14: Im Forenthread zu meinem Problem (welches teilweise ja gelöst ist) mit dem Update der Tabelle stand doch ich solle so eine Spalte machen...ist das einfach Geschmackssache oder habe ich das falsch verstanden?

    zu 15: Stimmt - Ich dachte einfach frei die Namen mit einem Bindestrich getrennt einzugeben; habe ich vorher mit meiner Freundin besprochen; sie würde es OK finden. Allerdings ist es natürlich schon besser wenn es die vorgesehenen (nullbaren) Spalten hätte!

    zu 16: Stimmt, aber das wäre ach nicht so schlimm einfach alle reinzuschreiben.

    Zu 15 noch: Ist ja nicht so ganz einfach im Nachhinein die Struktur zu verändern; die muss ja genau so im DataSet stimmen, ich hatte da mal Mühe aber hab's dann irgendwie hingekriegt, aber musste dann mit der Anwendung neu beginnen wegen dem Absturz-Problem; konnte einfach Code wieder einfügen. Bringst Du das schnell hin dies zu ändern? Und dann ev. noch zu 7 ebenfalls; ich wüste jetzt nicht wie ich das anstellen sollte. Wären gute Ideen! Falls Du Lust hast...

    Das Hauptproblem ist allerdings ja ein anderes wegen den SPs (mit den diversen Fill-Methoden) die da nicht korrekt funktionieren bzw. man danach die Datenbank nicht mehr bearbeiten/aktualisieren kann (Lieder-Table und ev. Images-Table).

    Aber schonmal vielen Dank für die Ratschläge!



  • C. M. Obrecht schrieb:

    zu 5: Meinst Du Nr. ? Ja das habe ich im Nachhinein realisiert aber da es dann ging habe ich es so belassen.

    Irgendwo war ein "/" drinnen. Wenn du etwas mit Datenbanken machst, solltest du meiner Meinung nach immer davon ausgehen, dass jemand mit Hand SQL Code schreiben wird, um mit den Daten irgendwas zu machen. Und das wird ziemlich lästig, wenn man Feldnamen immer als "[Name, oder auch nicht???]" schreiben muss, statt einfach "Name".

    zu 6: Stimmt, das lässt sich ja auch ändern ohne das DataSet ändern zu müssen oder?

    Keine Ahnung. Ich arbeite meistens direkt mit Command/DataReader Instanzen.

    zu 9: Ja tatsächlich so ähnlich; es soll nicht nach Daten dort gesucht werden aber Benutzer haben manchmal diverse Vorlieben und sollen da auch tun können was sie wollen 🙂

    ok. Ich finde zwar eher dass für sowas eine Kommentar-Spalte besser ist, ober auch eigene "Custom" Spalten, aber ist ja schliesslich deine Datenbank.

    zu 10: Auch so ähnlich; Original z.B. "Schallplatte" oder Tonband usw. oder man kann J/N eingeben (wo es auch ein Bool täte, den Benutzern überlassen).

    Sollte man sich auch überlegen ob ein Freitext-Feld hier gut ist. Sonst schreibst du einmal "Platte", dann wieder "LP" oder "Schallplatte" rein.

    11: siehe 10: LP, Download, Band oder CD, selbst aufgenommen etc. könnte man da reinschreiben.

    Ja, siehe 10 🙂

    Diese beiden Spalten kann man auch umfunktionieren wenn man nicht nur CDs sondern eben auch Platten, MDs, Bänder, mp3s usw hat und auflisten möchte.

    Dafür wäre dann wohl eher ein "Typ" Feld gut, nicht? Wobei dieses Type Feld wohl wieder kein Freitext-Feld sein sollte.

    13: Die Bilder-Funktion habe ich noch nicht so überlegt; versuchte mal eine Datenbindung zu einer PictureBox automatisch herzustellen aber es gelang nicht; ich dachte zuerst nur an ein Bild, eine PictureBox welche einfach das Bild zeigt wenn die Spalte aktiv ist. Das ist eine eigene Tabelle wegen der Grösse, 1000 Alben mit Bild, je 100 Kb wenn sie relativ gross sind......

    Sobald du den Typ "image" oder "text" verwendest, legt das der SQL-Server sowieso ausserhalb der eigentlichen Tabellenstruktur ab. Abfragen auf die Tabelle werden durch solche Spalten nicht ausgebremst.

    zu 14: Im Forenthread zu meinem Problem (welches teilweise ja gelöst ist) mit dem Update der Tabelle stand doch ich solle so eine Spalte machen...ist das einfach Geschmackssache oder habe ich das falsch verstanden?

    Pfuh. Müsste ich nachgucken um was es da genau ging. Updaten kann man es auf jeden Fall so oder so.

    zu 15: Stimmt - Ich dachte einfach frei die Namen mit einem Bindestrich getrennt einzugeben; habe ich vorher mit meiner Freundin besprochen; sie würde es OK finden. Allerdings ist es natürlich schon besser wenn es die vorgesehenen (nullbaren) Spalten hätte!

    zu 16: Stimmt, aber das wäre ach nicht so schlimm einfach alle reinzuschreiben.

    In "Textfeldern mit Trennzeichen" kann man halt nicht wirklich gut suchen. Und joinen kann man da auch nix. Hier wären schon Detailtabellen angebracht.

    Und ich würde auch wissen wollen, welcher Track nun von wem ist. Bei 10 Titeln und der Interpreten-Info "A, B" weiss ich halt nicht welche Tracks von A und welche von B sind.

    Zu 15 noch: Ist ja nicht so ganz einfach im Nachhinein die Struktur zu verändern; die muss ja genau so im DataSet stimmen, ich hatte da mal Mühe aber hab's dann irgendwie hingekriegt, aber musste dann mit der Anwendung neu beginnen wegen dem Absturz-Problem; konnte einfach Code wieder einfügen.

    Änderungen am Code gehören zum Programmieren. Erst alles Designen und dann programmieren und alles bleibt so ist ein (sehr unrealistischer) Wunschtraum. Je früher du dir angewöhnst so zu programmieren, dass man Änderungen schnell machen kann, desto besser. Und der beste Weg um das zu lernen, ist vermutlich, Programme zu schreiben die schlecht mit Änderungen klarkommen, und dann aus den Fehlern zu lernen 🙂
    (Vielleicht mit Hilfe einiger guter Bücher, wie z.B. Design Pattern von Gamma et al. ("GoF"))

    Bringst Du das schnell hin dies zu ändern? Und dann ev. noch zu 7 ebenfalls; ich wüste jetzt nicht wie ich das anstellen sollte. Wären gute Ideen! Falls Du Lust hast...

    Er. Neh. Mach mal selbst. Ist ja schliesslich dein Projekt. Oder willst du, wenn du mal in dem Bereich arbeitest auch immer jmd. suchen der etwas für dich erledigt, wenn du es selbst nicht hinbekommst. Oder dir einfach nicht den Aufwand antun willst, dir das nötige Wissen anzueignen, um es selbst zu machen.
    Bringt dir ausserdem auch nix wenn ich es mache. Vielleicht würdest du meine Änderungen verstehen, aber etwas zu verstehen und etwas selbst machen zu können, sind zwei paar Schuhe.

    Das Hauptproblem ist allerdings ja ein anderes wegen den SPs (mit den diversen Fill-Methoden) die da nicht korrekt funktionieren bzw. man danach die Datenbank nicht mehr bearbeiten/aktualisieren kann (Lieder-Table und ev. Images-Table).

    Wenn die Stored-Procedures nach einer Änderung nichtmehr passen, dann muss man die halt aktualisieren. Und den ggf. Code der sie verwendet.

    Dein Projekt ist ja nicht wirklich gross, nen? Sollte schon schaffbar sein da einige Änderungen zu machen, auch wenn diese sich etwas weiter durchziehen.



  • Ja stimmt CD/Album Name, in der Art.
    Bei den Freitext-Feldern, das ist natürlich schon so dass da mal LP, mal Platte usw drin stehen kann. Solange nicht nach Daten dort gesucht werden soll oder sortiert geht's ja; das habe ich auch nicht vor; denke einerseits wenn die Leute da sich nicht an ihr eigenes Schema halten sind sie selber Schuld, andererseits lassen sich die Spalten so individuell verwenden; ich mag das auch lieber, machen ja alle anders. Jedenfalls lässt dies auch exotische Angaben zu, wer weiss was die Leute so haben, vielleicht hat ja jemand noch DCC oder sowas und möchte die eintragen.

    Sobald du den Typ "image" oder "text"...

    Die Bilder würden, wenn in der CDs-Tabelle vorhanden, allerdings eim Fill alle geladen, das möchte ich dann lieber erst bei der Verwendung.

    Änderungen am Code gehören zum Programmieren.

    Das ist schon klar; nur Code und die automatische Datenbindung mit dem Designer ist noch etwas anderes, aber hab's auch schon hinbekommen.
    Jedenfalls, ich arbeite eben mit C++ und QT und wenn ich etwas nicht weiss ist's natürlich etwas anders, kann natürlich sagen "komm mal kurz, ich hab da ein Problem" und kann weiter probieren, ist schon etwas ein Unterschied wenn Hilfe direkt verfügbar ist, und ich nicht nur ein kleines Stück weiterkomme und dann wieder warten muss.
    Wegen dem Hauptproblem: mit den SP: Das ist nicht wegen einer Änderung, ich glaube das funktionierte nie; und ich komme nicht dahinter wieso... Habe nur erst jetzt versucht die Daten einzugeben/verändern wenn ein Fill einer SP verwendet wurde. Das ist das grösste Problem; den Rest bekomme ich eher noch hin (ausser vielleicht die Interpreten in eine eigene Tabelle auslagern).


Anmelden zum Antworten