Dateien mit VB.net im SQL Server speichern und laden

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von toddel.

    Dateien mit VB.net im SQL Server speichern und laden

    Hallo liebes Forum...

    ich habe ein Problem. Wir sollen - so der Plan - Worddateien bzw. Richtext mittels einer Web-Anwendung erstellen (Eine Vorlage wird durch die Anwendung gefüllt und dann gespeichert) und in einer SQL-Server-Datenbank speichern. In der Anwendung werden Bewerbungsvorgänge gespeichert und es soll auch eine Möglichkeit geben, neben Standard-Texten auch frei erstellte Dokumente zu erstellen und in der "Akte" zu speichern.

    Wir lesen unzählige Beiträge dazu im Netz, ein Haufen Schrott... Sogar Beiträge von MS direkt funktionieren schlicht nicht, weil sie Fehler enthalten. Naja...

    Hat hier jemand damit schon mal Erfahrungen gesammelt und kann ein paar nützliche Beiträge/Seiten verlinken?

    Vielen Dank vorab und einen schönen Tag an alle!
    Wie wäre es wenn du uns mitteilst was du schon ausprobiert hast und wo es hapert?
    Wäre ja blöd wenn wir dich auf die Seiten schicken die angeblich nicht funktionieren.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Hmm da müsste ich mal den Verlauf meines Kollegen durchsuchen.

    Wir haben eine Menge durchsucht in Richtung Filestream, Memorystream, load file from sql etc. Einzelne Seiten hier aufzuführen ist momentan problematisch.

    Hast Du sowas schon mal realisiert?
    Eine Möglichkeit (ziemlich stumpf) wäre folgende:
    Der Spaltentyp für die Dateien ist varbinary(MAX).
    Willst du eine Datei Speichern, lese sie Komplett in ein byte[] und übertrage das per normalen INSERT oder UPDATE an die Datenbank.
    Willst du eine Datei auslesen, machst du nen SELECT, und per DataReader kann man mit der GetBytes Methode, die Datei wieder erhalten und zurück auf die Platte schreiben, wenn nötig.

    Ist halt ziemlich Ram-intensiv bei großen Dateien. Über einen DataAdapter usw. sollte das afaik auch funktionieren, kann jedoch keine Garantie dafür abgeben.

    Vorteil ist, es funktioniert mit den 3 großen Datenbanken.
    Wir haben es nun wie folgt hinbekommen:



    Quellcode

    1. Protected Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    2. Dim sqlConnection As New SqlConnection
    3. Application("DMS") = "Persist Security Info=False;Initial Catalog=DMS4;user id=TestFS;password=TestFS;Server=senbjwdb194\ZSC4"
    4. Dim sqlCommand As New SqlCommand()
    5. sqlConnection.ConnectionString = HttpContext.Current.Application("DMS")
    6. sqlCommand.Connection = sqlConnection
    7. Try
    8. sqlConnection.Open()
    9. If sqlConnection.State <> ConnectionState.Open Then
    10. LblFehler.Text = "Fehler bei der Verbindung!"
    11. LblFehler.ForeColor = Color.Red
    12. Else
    13. LblFehler.Text = "Verbindung steht."
    14. LblFehler.ForeColor = Color.Green
    15. End If
    16. Dim cmd As SqlCommand = New SqlCommand("SELECT Name, file_stream FROM sample_filetable WHERE Name='Pups.txt'", sqlConnection)
    17. cmd.CommandType = CommandType.Text
    18. Dim myreader As SqlDataReader = cmd.ExecuteReader
    19. If myreader.Read Then
    20. Dim myFile As String = (Server.MapPath("Tempverzeichnis\") + "Neuestesfile.txt")
    21. If File.Exists(myFile) Then File.Delete(myFile)
    22. LblFehler2.Text = "Versuche jetzt, Datei zu schreiben!"
    23. Dim MyData() As Byte = CType(myreader("file_stream"), Byte())
    24. File.WriteAllBytes(myFile, MyData)
    25. If File.Exists(myFile) Then
    26. LblFehler2.Text = "Datei wurde erstellt!"
    27. LblFehler2.ForeColor = Color.Green
    28. Else
    29. LblFehler2.Text = "Datei wurde nicht erstellt."
    30. LblFehler2.ForeColor = Color.Red
    31. End If
    32. Dim Sendfile As System.IO.FileInfo = New System.IO.FileInfo((Server.MapPath("Tempverzeichnis\") + "Neuestesfile.txt"))
    33. Response.Clear()
    34. Response.AddHeader("Content-Disposition", "attachment; filename=" & Sendfile.Name)
    35. Response.AddHeader("Content-Length", Sendfile.Length.ToString())
    36. Response.ContentType = "application/octet-stream"
    37. Response.WriteFile(Sendfile.FullName)
    38. Response.End()
    39. LblFehler3.Text = "Datei wurde gesendet."
    40. LblFehler3.ForeColor = Color.Green
    41. Call Datei_loeschen((Server.MapPath("Tempverzeichnis\") + "Neuestesfile.txt"))
    42. If File.Exists(myFile) Then
    43. LblFehler4.Text = "Datei nicht gelöscht!"
    44. LblFehler4.ForeColor = Color.Red
    45. Else
    46. LblFehler4.Text = "Datei wurde vom Webserver gelöscht."
    47. LblFehler4.ForeColor = Color.Green
    48. End If
    49. End If
    50. sqlConnection.Close()
    51. Catch ex As Exception
    52. LabelError.Text = ex.ToString()
    53. Finally
    54. End Try
    55. End Sub
    56. Private Sub Datei_loeschen(Datei As String)
    57. System.IO.File.Delete(Datei)
    58. End Sub


    Das Problem ist, sobald ein Response.irgendwas im Code ist, wird nichts auf der Oberfläche angezeigt - also keinerlei Labelfelder gefüllt. Die Datei wird auf dem Webserver im Tempverzeichnis angelegt. Bis dahin super. Es kommt der Datei-Öffnen/Speichern-Dialog, aber danach ist Ende. Er kommt nicht ins Datei löschen. Hier benutze ich scheinbar die falsche Methode...

    Ich möchte die Datei, die aus der DB gekommen ist, an den Client senden, die Datei auf dem Webserver im Temp löschen und dann gleich (lokal) mit Word die heruntergeladene Datei öffnen und bearbeiten. Es wird dann eine Funktionalität geben, wo die bearbeitete Datei wieder in den SQL-Server hochgeladen wird. Aber das später. Schritt für Schritt...

    Habt Ihr eine Idee?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „toddel“ ()

    OK, ich versuchs noch mal...

    wir haben es hinbekommen, Daten in die DB zu packen und auch in eine Datei wieder raus zu bekommen. Super...

    Wie schiebe ich die Datei vom Webserver (ohne Nachfrage) auf den Client in ein bestimmtes Verzeichnis, um sie dort mit Word zu bearbeiten?