ickebins1989 Geschrieben 2. September 2009 Teilen Geschrieben 2. September 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
.NETter Geschrieben 2. September 2009 Teilen Geschrieben 2. September 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ickebins1989 Geschrieben 2. September 2009 Autor Teilen Geschrieben 2. September 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
.NETter Geschrieben 2. September 2009 Teilen Geschrieben 2. September 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ickebins1989 Geschrieben 2. September 2009 Autor Teilen Geschrieben 2. September 2009 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 :) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
.NETter Geschrieben 2. September 2009 Teilen Geschrieben 2. September 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ickebins1989 Geschrieben 2. September 2009 Autor Teilen Geschrieben 2. September 2009 Ich danke Dir. Ein paar Denkanstöße hätten genügt. Aber vielen Dank. Ich lese mich erstmal ein. Ist schon ein kleiner "Batzen" zum Anfang Danke nochmals. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
.NETter Geschrieben 2. September 2009 Teilen Geschrieben 2. September 2009 Hallo, das ist garnicht so wild. Das interessante ist für die die Funktion SaveToDB und File.Copy. Falls Du zum Thema DB-Programmierung etwas lesen möchtest suche mal nach dem Thema "ADO .NET". Viel Erfolg! Ansonsten kannst du auch gerne schreiben wenn Du Fragen hast! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ickebins1989 Geschrieben 2. September 2009 Autor Teilen Geschrieben 2. September 2009 Dankeschön! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.