Werte aus einer Datenbank mit Dateinamen in einem Verzeichnis vergleichen und nicht vorhandene Dateien in eine CSV-Datei schreiben

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Marvin315.

    Werte aus einer Datenbank mit Dateinamen in einem Verzeichnis vergleichen und nicht vorhandene Dateien in eine CSV-Datei schreiben

    Hallo Leute,

    ich steh aktuell wieder vor einem Problem und das sieht so aus:

    Ich habe eine Tabelle in meiner SQl Datenbank in der Dateinamen stehen.
    Und dementsprechend ein Verzeichnis mit Dateien. Nun kann es aber sein das manche Dateien nicht vorhanden sind, diese würde ich dann gerne in einer csv-Datei speichern.
    Also mein Vorhaben wäre nun Tabelle ausgeben lassen, einen Wert aus der Liste nehmen und mit den Dateien in dem Verzeichnis vergleichen.
    Sollte die Datei nicht vorhanden sein soll der Name in die CSV-Datei geschrieben werden.
    Dann zweiten Wert nehmen und vergleichen usw.

    Das ist aktuell mein Ansatz:

    VB.NET-Quellcode

    1. Dim schemadb As String = "select name from sys.schemas where name LIKE '%pdb%' or name LIKE '%plm%'"
    2. Dim cmd As New OleDbCommand
    3. Dim adapter As New OleDbDataAdapter
    4. cmd.Connection = condatabase
    5. condatabase.Open()
    6. cmd.CommandText = schemadb
    7. adapter.SelectCommand = cmd
    8. schema = cmd.ExecuteScalar
    9. If (schema = "pdb") Then
    10. Using cmd2 As New OleDbCommand("SELECT Spalte1 FROM pdb.Tabelle1", condatabase)
    11. cmd2.CommandType = CommandType.Text
    12. Dim dr As OleDbDataReader = cmd2.ExecuteReader()
    13. While dr.Read()
    14. Dim resultfile As String = dr("Spalte1").ToString()
    15. End While
    16. End Using
    17. ElseIf (schema = "plm") Then
    18. Using cmd2 As New OleDbCommand("SELECT Spalte1 FROM plm.Tabelle1", condatabase)
    19. cmd2.CommandType = CommandType.Text
    20. Dim dr As OleDbDataReader = cmd2.ExecuteReader()
    21. While dr.Read()
    22. Dim resultfile As String = dr("Spalte1").ToString()
    23. End While
    24. End Using
    25. End If
    26. condatabase.Close()
    27. If Not IO.File.Exists(sCSVFile) Then
    28. IO.File.Create(sCSVFile)
    29. End If
    30. Dim fs As New FileStream(sCSVFile, FileMode.Open)
    31. Dim sw As New StreamWriter(fs)
    32. sw.WriteLine(resultFiles)
    33. sw.Close()


    resultfile ist als String deklariert
    sCSVFile ist der Pfad + Name der CSV und ebenfalls als String deklariert

    Als Zwischenschritt wollte ich mir die Werte aus der Tabelle in einer CSV-Datei anzeigen lassen, was aktuelle aber auch nicht geht.
    Die Verbindung steht soweit und funktioniert auch.

    Es wäre mir eine riesen Hilfe wenn mich da jemand unterstützen könnte.
    Hallo Marvin,

    schaut etwas wirr aus...

    adapter - wozu?
    cmd2 - warum nicht das erste wieder verwenden?
    condatabase, schema - Deklaration?

    Abhängig vom Schema würde ich erstmal einen String mit dem query befüllen,
    dann wird das ganze viel kürzer und übersichtlicher.
    Kann immer nur eines der beiden existieren?

    Zu Beginn könntest du über IO.DirectoryInfo alle Filenamen in deinem Verzeichnis in ein Hashset einlesen.
    im While (dr.Read()) fragst du das HashSet ob der Filename schon vorhanden ist - wenn nicht, anlegen.

    Schöne Grüße
    Mandy
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup:
    Hallo Mandy,

    danke für deine Hilfe ich konnte mein Problem nun lösen.
    Und zwar lasse ich per SQL Script mir den Dateipfad + Namen ausgeben (CONCAT) und füge alle Daten die existieren einer Liste zu.

    VB.NET-Quellcode

    1. Dim command As New OleDbCommand
    2. Dim reader As OleDbDataReader
    3. datapathErrors.Add("NAME" & ";" & "PATH")
    4. command.CommandType = CommandType.Text
    5. command.CommandText = "SELECT name, CONCAT(Dateipfad, '\', Dateiname) as datapath FROM pdb.documents"
    6. command.Connection = condatabase
    7. reader = command.ExecuteReader()
    8. While reader.Read()
    9. If System.IO.File.Exists(reader.GetString(3)) Then
    10. datapathErrors.Add(reader.GetString(0) & ";" & reader.GetString(1) & ";" & reader.GetString(2) & ";" & reader.GetString(3))
    11. End If
    12. End While
    13. System.IO.File.AppendAllLines(sCSVFile, datapathErrors)


    Das ist nicht das richtige SQL Script aber aus Datenschutz musste ich es kürzen.