Zum Inhalt springen

Brauche Hilfe. Speichern von PDF´s in bestimmten Ordner


ickebins1989

Empfohlene Beiträge

Hi.

Ich suche im Internet von uns abgelaufene Dokumente.

Mit

catch (Exception ex)

      {

        DialogResult no = MessageBox.Show("Dokument wurde nicht gefunden.\n\nMöchten Sie im Internet suchen?", "ProgrammName", MessageBoxButtons.YesNoCancel);

        if (no == DialogResult.Yes)

        {

          Process p = new Process();

          p = new Process();

          p.StartInfo.FileName = m_strPDFURL + strPDF + "nicht wichtig" + "nicht wichtig";

          p.Start();


        }

      }

Funktioniert das. Nun möchte ich aber, dass er, nach dem die Datei 1 mal aufgerufen worden ist, diese automatisch in einen bestimmten Ordner speichert und in eine vorhandene Datenbank hinzufügt.

Wie könnte ich das hinbekommen? Brauche Eure Hilfe!

Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

leider habe ich nicht so ganz verstanden wo Du im Internet suchst...

Aber egal. Du willst die gefundene Datei jedenfalls in einer DB speichern.

Als BLOB oder soll nur Pfad dort abgelegt werden?

Ich rate mal und sage Du willst das ganze als BLOB speichern und somit die Binärdaten direkt in der DB speichern.

Hier ist mal ein Beispielcode aus meinem Blog zur Speicherung eines Files in eine DB (und umgekehrt):


Option Strict On

Option Explicit On 


Imports System.IO

Imports System.Data.SqlClient 


Public Class HandleMyBlob

    'Hoher Timeout notwendig!

   Private m_conn As New SqlConnection("Server=(local);Database=Test;" & _

                                       "Connection Timeout=6000;" & _

                                       "Integrated Security=True") 


   ''' <summary>

    ''' Speichert die angegebene Datei in einem varbinary(MAX)-Datenfeld ab.

    ''' </summary>

    ''' <param name="filePath"></param>

    ''' <remarks></remarks>

   Public Sub SaveFileAsBlob(ByVal filePath As String)

        If My.Computer.FileSystem.GetFileInfo(filePath).Length > 2147483647 Then

            MessageBox.Show("Datei zu groß! Maximal 2 GB erlaubt.")

            Exit Sub

        End If 


    Dim fs As FileStream = New FileStream(filePath, FileMode.Open, FileAccess.Read)

        Dim br As BinaryReader = New BinaryReader(fs)

        'Folgende Konvertierung kann nicht fehlschlagen da eine 

        'Dateilänge > 2147483647(MaxWert Integer) oben aussortiert wird

        Dim fileArr() As Byte = br.ReadBytes(CInt(fs.Length))

        br.Close()

        fs.Close()

        'Unten stehende Objekte 'Nothing' setzen damit sie referenzlos stehen

        br = Nothing

        fs = Nothing 


     Dim comm As New SqlCommand("Insert Into dbo.BigFiles Values(@datei)", m_conn)

        comm.Parameters.Add("@datei", SqlDbType.VarBinary).Value = fileArr

        Try

            m_conn.Open()

            comm.ExecuteNonQuery()

MessageBox.Show("BLOB gespeichert.", "Speichern erfolgreich", MessageBoxButtons.OK)

        Catch ex As Exception

   MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

        Finally

            m_conn.Close()

            'Manuelle GarbageCollection anstoßen um RAM frei zu geben

            'RAM-Last liegt oft bei 98%

            GC.Collect()

        End Try

    End Sub

   ''' <summary>

    ''' Speichert ein BLOB im angegebenen Dateipfad ab

    ''' </summary>

    ''' <param name="filePath"></param>

    ''' <remarks></remarks>

   Public Sub SaveBlobAsFile(ByVal filePath As String)

   Dim commGetBlob As New SqlCommand("Select Top 1 blob from dbo.BigFiles", m_conn)

        Dim fs As FileStream

        Try

            m_conn.Open()

            'Explizite Konvertierung von Object zu Byte()

           Dim arrGetBlob() As Byte = CType(commGetBlob.ExecuteScalar(), Byte())

            fs = New FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write)

            Dim bw As New BinaryWriter(fs)

            bw.Write(arrGetBlob)

            bw.Flush()

            bw.Close()

            arrGetBlob = Nothing

            bw = Nothing

      MessageBox.Show("BLOB in Datei gespeichert.", "Speichern erfolgreich",       

                                  MessageBoxButtons.OK, MessageBoxIcon.Information)

        Catch ex As Exception

   MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

        Finally

            m_conn.Close()

            fs = Nothing

            GC.Collect()

        End Try

    End Sub

End Class

Der Code hatte ich da leider in VB .NET geschrieben aber kann analog auch in C# umgesetzt werden. Ich habe hier einen SQL Server 2005 benutzt. Für ein anderes DBMS musst Du entsprechende Einträge bearbeiten.

Gruß,

Thomas

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke Thomas. Du musst wissen, ich hab am 1.8. meine Ausbildung begonnen und hab noch nicht soo den Durchblick. Von daher versteh ich das Beispiel nicht ganz.

Die PDF Dokumente haben wir von der Firma hochgeladen. Und greifen auf diese zu.

Die anderen PDF`s, die noch in der Datenbank (mit Name, Bezeichnung usw.) stehen, werden durch ein DGV angezeigt. Das andere soll eben bei Klick in die DB eingetragen werden und gespeichert werden.

Als BLOB oder soll nur Pfad dort abgelegt werden?

Was Du damit meinst, kann ich mir überhaupt nicht vorstellen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ach soooo...

Ich wollte erfragen was du damit meinst, dass die PDF´s in der DB gespeichert sind. Also was steht in der DB?

Steht dort nur ein Name und irgendein Primärschlüssel, oder wurde die Datei in eine Bytearray umgewandelt und das komplette Dokument (eben als Binärdaten (BLOB - Binary Large OBject)) in der DB abgelegt? Das würd ebedeuten, dass die Datei nicht mehr in einem Filesystem vorhanden ist.

(Zur Vollständigkeit: Ja auch hier gibt es Ausnahmen bei manchen DBMS.)

Viele speichern nur den physikalischen Pfad (c:\Dokumente\Dok1.pdf) und den Namen zu einem Dokument. Die einzelnen Dokumente liegen dann eben im reellen Filesystem auf dem Server oder irgendwo im Netzwerk und werden dann über die DB-Einträge (Pfadangabe) gefunden.

Also wie sieht die Tabelle aus in die du schreiben möchtest? Welche Daten sollen dort genau gespeichert werden?

Gruß,

Thomas

Link zu diesem Kommentar
Auf anderen Seiten teilen

:)

Also in der Tabelle werden eine Auto-ID festgelegt, der Dateiname, die Beschreibung und andere Infos eingetragen. Glaube ingesamt 5 Spalten.

Da müsste eben einfach nur in die Spalte "FileName" der Dateiname angehängt werden. Die entsprechende Datei soll nach dem Öffnen direkt in einen festgelegten Ordner gespeichert werden. C:\\OrdnerName\\UnterOrdner

War das verständlich? Ich hoffe :):)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

so ich habe mal etwas rumgecodet. Ich habe versucht das alles simpel zu halten und so auch auf jeglichen Ansatz von OOP verzichtet.

Ich habe den Code aus dem Studio (2008) raus kopiert. Falls irgendwelche "using" Direktiven Fehler bereiten sollten einfach auskommentieren.


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Diagnostics;

using System.Data.SqlClient;

using System.IO;


namespace _PDF2

{

public partial class Form1 : Form

{

private string m_strPDFURL = "Hier steht Deine Pfadangabe";

private string strPDF = "Hier steht der Name der PDF-Datei";


public Form1()

{

    InitializeComponent();

}


private void button1_Click(object sender, EventArgs e)

{

    DialogResult no = MessageBox.Show("Dokument wurde nicht gefunden.\n\nMöchten Sie im Internet suchen?", "ProgrammName", MessageBoxButtons.YesNoCancel);

    if (no == DialogResult.Yes)

    {

        Process p = new Process();

        p = new Process();

        p.StartInfo.FileName = m_strPDFURL + strPDF + "nicht wichtig" + "nicht wichtig";

        p.Start();


        //In DB speichern (Ich benutze den SQL Server 2005 daher der Namespace (oben) using System.Data.SqlClient)

        if (SaveToDB(m_strPDFURL, strPDF) == 1)

            MessageBox.Show("Gespeichert");

        else

            MessageBox.Show("Konnte nicht gespeichert werden!");


        //In Ordner speichern (Ich nehme an die Variable m_strPDFURL entspricht dem Ordner wo das PDF gespeichert werden soll

        //using System.IO (siehe oben)

        string zielPfadUndName = "c:\\Dokumente\\" + strPDF; // Fetsre Ordner + gewählter PDF-Name

        File.Copy(m_strPDFURL + "\\" + strPDF, zielPfadUndName);


    }

}

/// <summary>

/// Speichert den Dateipfad und den Dateinamen in der DB

/// </summary>

/// <param name="Filepath"></param>

/// <param name="Filename"></param>

/// <returns></returns>

private int SaveToDB(string Filepath, string Filename)

{

    //DB-Verbindung (Datenbank und Servername müssen angepasst werden)

    SqlConnection conn = new SqlConnection("Server=Servername;Database=DB-Name;Integrated Security=True");

    SqlCommand command = new SqlCommand("INSERT INTO Tabellenname (Filepath, Filename) VALUES (@filepath, @filename)", conn);

    //Parameter für das Commandobjekt

    command.Parameters.Add("@filepath", SqlDbType.NVarChar).Value = Filepath;

    command.Parameters.Add("@filename", SqlDbType.NVarChar).Value = Filename;

    try

    {

        //Datenbankverbindung öffnen

        if (conn.State != ConnectionState.Open)

            conn.Open();

        //ExecuteNonQuery gibt automatisch die Anzahl der betroffenen Datensätze zurück

        if (command.ExecuteNonQuery() == 1)

            return 1;

        else

            return 0;

    }

    catch (Exception ex)

    {

        MessageBox.Show(ex.Message);

        return 0;

    }

    finally

    {

        conn.Close();

    }

}

}

}


Ein paar Zeilenumbrüche müssten wegen den langen Zeilen noch gerichtet werden.

Die Funktion des Speicherns in der DB habe ich in eine Funktion (SaveToDB) ausgelagert. Sieh Dir das mal an und wenn Du noch Fragen hast einfach schreiben.

Gruß,

Thomas

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...