[SQL] Access Datenbank in C#

  • Hallo toter Bereich, ich hab ein paar Fragen ^^



    So dann probier ich mal mein Anliegen verständlich zu formulieren.


    Projektvorgaben:
    Ich hab ein Projekt von meiner Berufsschule, bei dem ID3-Tag Informationen aus MP3-Dateien gelesen werden und in eine Datenbank geschrieben werden sollen. Um die Redundanz zu reduzieren, würde ich jetzt ganz gern Dinge wie Album(name), Interpret, Jahr (der Veröffentlichung), Bewertung (1-5), Wiedergaben (Soll ein Counter werden, wie oft die MP3 abgespielt wurde) in eine jeweils eigene Tabelle packen. In der Haupttabelle ist also der Primärschlüssel, der (Lied)Titel und dann für die ganzen Hilfstabellen die Hilfsschlüssel. In den Hilfstabellen sind dann jeweils Primärschlüssel und dann jeweils die betreffende Spalte (Albumname bei der Albumhilfstabelle etc.).


    Wenn jetzt vom Benutzer eine MP3-Datei ausgewählt wird, möchte ich dann gern abfragen, ob das ausgewählte Lied bereits in der Datenbank vorhanden ist, um sie eben nicht doppelt einzutragen. Da würde ja eine Auswahlabfrage nicht wirklich Sinn machen. Möchte da ja einfach nur ein Ja/Nein zurückbekommen. Gibt es da ne einfach Möglichkeit das zu überprüfen?


    Dann wäre meine zweite Frage, wie ich die Informationen dann in die ganzen Tabellen reinklatschen kann. Muss ich dann eine Anfügeabfrage mit 5 inner joins machen und klappt das dann mit den Hilfstabellen so ohne weiteres? Hab das nie über ein externes C# Projekt über mehrere Tabellen gemacht. :D




    Eventuell dann noch paar weitere Fragen:
    Wie kommt man an den Inhalt der Musikbibliothek bzw. den Standard Musikordner von Windows 7? Die müssten ja eigentlich hinter den jeweiligen Windowsnutzer hinterlegt sein, daher die Frage, ob es da einen andere Weg gibt um an den Pfad zu kommen.


    Falls ich dadran komm, würde ich gerne in einem Ordner alle MP3-Dateien auslesen und zur Auswahl/Playlistfunktion auflisten. Welches Steuerelement würde sich da anbieten (Um eben mehrere Sachen übersichtlich untereinander anzeigen zu können und einzeln auswählen zu können)?


    Falls da jemand interessiert ist, kann er da auch gerne mithelfen bzw. könnte den Rotz später auch veröffentlichen (Hat eigentlich noch jemand die Projekte von dem Mp3Player Kontest von 2012 oder wann der war?). :D


    MfG Mario64

  • Wenn jetzt vom Benutzer eine MP3-Datei ausgewählt wird, möchte ich dann gern abfragen, ob das ausgewählte Lied bereits in der Datenbank vorhanden ist, um sie eben nicht doppelt einzutragen. Da würde ja eine Auswahlabfrage nicht wirklich Sinn machen. Möchte da ja einfach nur ein Ja/Nein zurückbekommen. Gibt es da ne einfach Möglichkeit das zu überprüfen?


    Ich würde das über die Anzahl der Einträge machen.

    SQL
    1. SELECT COUNT(*)
    2. FROM musiktitel
    3. WHERE titel = 'Atemlos' AND interpret = 'Helene Fischer'


    Gibt dir 0 zurück, wenn nichts gefunden wurde oder die Anzahl der gefundenen Titel die passen.


    Eventuell dann noch paar weitere Fragen:
    Wie kommt man an den Inhalt der Musikbibliothek bzw. den Standard Musikordner von Windows 7? Die müssten ja eigentlich hinter den jeweiligen Windowsnutzer hinterlegt sein, daher die Frage, ob es da einen andere Weg gibt um an den Pfad zu kommen.


    Hmm, der "Eigene Musik" Ordner ist immer "C:\Users\<Username>\Music". (Echter Dateipfad, sollte unter allen Sprachen funktionieren).
    Alternativ gibts in der Registry unter HKEY_CURRENT_USER\ Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders ein paar Einträge, die dir helfen könnten
    (ungefähr, lange kein Windows bedient :S)


    Falls ich dadran komm, würde ich gerne in einem Ordner alle MP3-Dateien auslesen und zur Auswahl/Playlistfunktion auflisten. Welches Steuerelement würde sich da anbieten (Um eben mehrere Sachen übersichtlich untereinander anzeigen zu können und einzeln auswählen zu können)?


    Defintiv das ListView Control mit Icons. Ist das übersichtlichste.


    Gruß
    florian0

  • Wieso bin ich nich auf Count gekommen... :D


    Genau das war halt mein "Problem", da ja der Username variable ist und da dachte ich, dass die da eventuell irgendein Trick17 haben um direkt auf spezielle Order zugreifen zu können. War halt auch eher eine Idee was ich noch machen könnte, wenn es nich zu umständlich ist.


    Hab noch nie was mit ListView gemacht, sieht schon recht speziell aus, danke für den Hinweis. Hast du da eventuell einen simplen Code Snippet für?


    MfG Mario64

  • Das ListView is ein wenig tricky. Ich kann nur die Windows-Forms Methode. Das WCF habe ich bisher strikt abgelehnt.


    Ich verwendet das ListView gerne im Detail-Modus. Die Eigenschaft heißt View, glaube ich. Über Rechtsklick -> Spalten bearbeiten, kann man weitere Spalten angeben.
    Man füttert das ListView mit ListViewItem-Objekten:


    Code
    1. ListViewItem myItem = new ListViewItem("Text im Item");
    2. myListview.Items.Add(myItem);


    So steht in der ersten Zeile, erste Spalte "Text im Item". Für die weiteren Spalten fügt man Subitems ein.


    Code
    1. ListViewItem myItem = new ListViewItem("Text im Item");
    2. myItem.Subitems.Add("Spalte 2");
    3. myItem.Subitems.Add("Spalte 3");
    4. myListview.Items.Add(myItem);


    Das sieht als Snippet ganz ok aus:
    http://msdn.microsoft.com/de-d…istViewItem(v=vs.80).aspx

  • Das mit der Anzahl klappt schonmal gut, egal ob mit oder ohne Hilfstabellen.


    SQL
    1. SELECT COUNT(*)
    2. FROM Interpret INNER JOIN Mp3Hilf ON Interpret.ID = Mp3Hilf.IntID
    3. WHERE Titel="Test" AND Interpret="Test2";


    SQL
    1. SELECT COUNT(*)
    2. FROM Mp3
    3. WHERE Titel="Test" AND Interpret="Test2";



    Also das ListView-Teil sieht echt ekelhaft aus. :D
    Keine Ahnung ob ich das noch einbauen kann^^

  • Was ich mir zu meinem eigentlichen Problem gedacht habe:
    Ich könnte für das Eintragen der Daten eigentlich folgendes machen.


    -Bei jeder Hilfstabelle gucken, ob der jeweilige Wert schon vorhanden ist
    -Falls ja, ID abfragen und zwischenspeichern
    -Falls nein, eintragen und anschließend ID abfragen und zwischenspeichern
    -Das dann insgesamt bei 6 Hilfstabellen um dann bei der Haupttabelle den Titel und dann anschließend die Hilfsschlüssel für die Hilfstabellen einzutragen


    Wenn es wirklich keinen anderen Weg gibt, werde ich wohl doch auf Redundanz scheiße und nur eine Tabelle benutzen. Es muss doch wohl einen einfacheren Weg geben um Daten in mehrere miteinander verknüpfte Tabellen zu bekommen...

  • Code
    1. string test = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic);
    2. var allFilenames = Directory.EnumerateFiles(test).Select(p => Path.GetFileName(p));
    3. var candidates = allFilenames.Where(fn => Path.GetExtension(fn) == ".mp3")
    4. .Select(fn => Path.GetFileNameWithoutExtension(fn));


    Irgendwie will das noch nicht so richtig funktionieren... Jemand Vorschläge? ^^


    Ansonsten ist mir grade aufgefallen, dass ich keine Ahnung hab, wie ich das das Ergebnis der SQL-Abfrage komme, die überprüft, ob ein Wert schon in der Datenbank ist (Die mit COUNT in einem der vorherigen Posts). Ich werde wohl jetzt mit Redundanz und nur einer Tabelle arbeiten, weil mir sonst eben nur der bereits niedergeschriebene Weg einfällt und mir dieser einfach zu umständlich ist.



    Nun zum ListView:
    Ok ich schätze mal ich kann die Logik auf das ItemActivate-Ereignis beschränken. Es sollen ja letztenendes alle MP3-Dateien dort angezeigt werden und mit Doppelklick ausgewählt werden können. Daher sollte ja ItemActivate allein ausreichen, oder?


    MfG Mario64



    Edit: Ich Idiot hab ja auch keine Dateien im Musikordner von Windows. :D Ok der Code funktioniert ohne Probleme.^^
    Edit: Ok res1 = ((int)cmd.ExecuteScalar()); für die Überprüfung. <3
    Langsam wird ja echt was draus :D


  • Wisst ihr zufällig, wie ich die Items vernünftig justieren kann?
    Würde gerne alle untereinander anzeigen (Detailsansicht beim Windows Explorer).


    Hab da bisher nur was von Bounds gelesen, nur irgendwie will da bisher nichts von funktionieren.


    MfG Mario64

  • "View" auf "Details" setzen. Am besten noch FullRowSelect und ggf. GridLines aktivieren. Dann sieht das eigentlich ganz ordentlich aus.


    Sieht vom Aufbau schonmal genau so aus, wie ich es haben möchte und könnte mir dafür echt in den Arsch beißen, dass ich das nich gefunden haben. :D


    Nur leider wird beim Wechsel der View nichts mehr angezeigt. Über den Code wurden die Daten als Items eingetragen:



    Dort soll eventuell dann später nicht mehr der komplette Pfad angegeben werden, aber das ist ja erstmal egal. Mit dem Code wird bei der View LargeIcon alles richtig angezeigt, bei Details bleibt es leer.


    MfG Mario64

  • So am Dienstag durfte ich dann mein "fertiges" Programm abgeben und direkt vorstellen. Die gewünschte Ansicht habe ich sogar noch hinbekommen. ^^


    Hier ein paar Screenshots der Oberfläche (Habe mich 0 ums Design gekümmert und alles so belassen wie es standardmäßig ist :D)






    Da ich in dem Programm keinen Nutzen finde, kann sich jeder Interessierte den Spaß herunterladen und damit machen was er will. :D


    Downloadlink (Als Rar-Datei gepackt)
    https://mega.co.nz/#!jUskSZoT!…MkzdqG3YuSyCJIR6DB2ts0tdQ


    MfG Mario64