Guardar documentos PDF desde Visual Basic . Net

Bueno quisiera saber como puedo almacenar documentos como PDF, DOCX, XLS, ETC. En una carpeta o motor de Base de Datos desde Visual Studio .net, Teniendo en cuenta que debo de almacenar el documento, nombre del documento y una pequeña descripción y luego leerlos por su nombre.
Espero que me puedan ayudar en esta materia, ya que me encuentro estancado.

1 respuesta

Respuesta
1
Lo que buscas es guardar cualquier tipo de archivo en un BD, ¿por ejemplo guardar un excel en un campo del tipo image en SQL Server(el campo image permite guardar una serie de datos binarios) y entonces el proceso seria serializar el archivo a bytes en un ruta especifica y enviarlo a la BD y cuando quieras acceder a ese archivo convertir los datos binarios a archivo y abrirlo?, me gustaría que confirmaras si esta es la idea que quieres plasmar, para saber si te puedo ayudar en algo.
Bueno si, por ahí va mi idea (en una bd, que me guarde el nombre, el documento y su detalle), luego leerlos
Ok, pues mira tengo estas funciones en VB.NET, espero te sirvan te explico.
La primera te convierte un archivo a bytes, pasándole el path del archivo.
Private Function ArchivoABytes(ByVal pth As String) As Byte()
        Try
            Dim fs As New FileStream(pth, FileMode.Open)
            fs.Position = 0
            Dim bytes(0 To fs.Length - 1) As Byte
            fs.Read(bytes, 0, fs.Length)
            fs.Close()
            '            File.Delete(pth)
            Return bytes
        Catch ex As Exception
            Throw New Exception(ex.Message, ex)
        End Try
    End Function
Esta te convierte bytes a un archivo, pasándole el path del archivo incluyendo nombre y extensión.
Private Sub BytesAArchivo(ByVal bytes() As Byte, ByVal Path As String)
        Dim K As Long
        If bytes Is Nothing Then Exit Sub
        Try
            K = UBound(bytes)
            Dim fs As New FileStream(Path, FileMode.OpenOrCreate, FileAccess.Write)
            fs.Write(bytes, 0, K)
            fs.Close()
        Catch ex As Exception
            Throw New Exception(ex.Message, ex)
        End Try
    End Sub
Después para almacenarlo en la BD, debemos tener un campo Image y la consulta seria algo similar a esto
 Sub GuardaImagenDocumento(ByVal prmparametro As SqlParameter)
        'Dim strFecha As String = ""
        'strFecha = "'" & String.Format("{0:yyyyMMdd}", Convert.ToDateTime(Me.DateTimePicker4.Value)) & "'"
        Try
            Dim sqlCommand As New SqlCommand
            Dim strConsulta As String = ""
            With sqlCommand
                .Connection = gfConectar()
                .Connection.Open()
                .CommandType = CommandType.Text
                .CommandText = "INSERT INTO Ipo.DocumentosInv (InvestigacionID,NombreDoc,FechaDoc,CTDocumentoID,Documento" & _
                             ",TipoArchivo,FAlta,UsrAlta,FModif,UsrModif,SitReg)VALUES("
                .CommandText += Me.txtFolioCE.Text & ",'" & Me.txtNomDoc.Text & "',GETDATE()," & Me.cmbTipoDoc.SelectedValue & ","
                .CommandText += prmparametro.ParameterName & ",'" & sExtension & "',GETDATE(),'" & frmLogin.objUsuario.pcveUsr & "',GETDATE(),'" & frmLogin.objUsuario.pcveUsr & "','A')"
                .Parameters.Add(prmparametro.ParameterName, prmparametro.SqlDbType)
                .Parameters(prmparametro.ParameterName).Value = prmparametro.Value
                .ExecuteNonQuery()
                .Connection.Close()
            End With
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
y para utilizar el procedimiento anterior tienes que crear un SQL Parameter:
Dim ParametroRec As New SqlParameter("@Documento", SqlDbType.Image)
y asignarle el valor de la funcion ArchivoABytes
ParametroRec.Value =ArchivoABytes("C:\TuArchivo.doc")
La extensión no importa puedes almacenar lo que sea, por lo tanto si vas a tener un campo que te guarda el path, también tienes la extensión porque para convertirlo necesitas pasarle ese path a la función.
para recuperar el archivo yo hago lo siguiente:
Public Function ObtenCampoPorNombre(ByVal aNombreCampo As String,sqlDataRow as DataRow) As Object
        Try
            ObtenCampoPorNombre = Nothing
            If sqlDataRow Is Nothing Then
                Exit Function
            End If
            If IsDBNull(sqlDataRow.Item(aNombreCampo)) Then
                Exit Function
            End If
            ObtenCampoPorNombre = sqlDataRow.Item(aNombreCampo)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Function
Esta función te devuelve on tipo object, pidiendo como parámetro la fila de un DataGridView donde se esta el dato binario del campo image, y te pide el nombre del cambo.
esta funcion la mando a llamar asi
Dim bytes() as Byte
bytes=ObtenerCampoPorNombre("Documento",Fila)
BytesAArchivo(bytes,"C:\temp.doc")
y despues mando a llamar la siguiente funcion:
AbrirDocumento("C:\temp.doc");
esa funcion es la siguiente:
Private Sub AbrirDocumento(ByVal vFilename As String)
        Dim pr As System.Diagnostics.Process
        pr = New System.Diagnostics.Process
        Try
            pr.StartInfo.FileName = vFilename
            pr.StartInfo.WindowStyle = ProcessWindowStyle.Normal
            Pr. Start()
            'Espera el proceso para que lo termine y continuar
            Pr. WaitForExit()
            'Liberar
            Pr. Close()
            My. Computer. FileSystem. DeleteFile(vFilename)
        Catch ex As Exception
            MessageBox.Show(ex.Message + " No se puede abrir el documento " & vFilename, "Error")
        End Try
    End Sub
Y pues creo que es todo, cualquier duda deja realiza tu pregunta y espero poder ayudarte lo más pronto posible
Hola Dark, aquí molestando de nuevo. El matarial que me enviasta esta excelente, el problemas es que no puedo hacer funcionar.
Estoy trabajando con una ventana que tiene lo siguiente.
1. 01 textbox + 01 dataGridView que me sirven para buscar un documento o expediente, la cual al pinchar sobre el expediente que yo deseo me carga el código del expediente
2. Más abajo tengo 01 comboBox + 01 DataTimePicker + 01 TextBox. Donde pieso primero seleccionar el formato el cual debo de adjuntar, luego ingresar la fecha en la cual estoy ingresando + una pequeña descripción.
3. La tabla que estoy utilizando de llama DocFIsico y contiene los siguientes campos Cod_RegDoc tipo varchar, Documento tipo Image, Fecha tipo datetime, Descripción tipo nVarchar
Mi problema es que no se como y donde se almacena el path para poder tomarlo y grabarlo. Ahora com o lo creo el Parameter.
Te suplico que me detalles as profundamente este pedazo de código con relación a la tabla y los campos que estoy utilizando. Y dejame tu mail para enviarte los prints de mi ventana y los errores que me arroja..
Sub GuardaImagenDocumento(ByVal prmparametro As SqlParameter)
        'Dim strFecha As String = ""
        'strFecha = "'" & String.Format("{0:yyyyMMdd}", Convert.ToDateTime(Me.DateTimePicker4.Value)) & "'"
        Try
            Dim sqlCommand As New SqlCommand
            Dim strConsulta As String = ""
            With sqlCommand
                .Connection = gfConectar()
                .Connection.Open()
                .CommandType = CommandType.Text
                .CommandText = "INSERT INTO Ipo.DocumentosInv (InvestigacionID,NombreDoc,FechaDoc,CTDocumentoID,Documento" & _
                             ",TipoArchivo,FAlta,UsrAlta,FModif,UsrModif,SitReg)VALUES("
                .CommandText += Me.txtFolioCE.Text & ",'" & Me.txtNomDoc.Text & "',GETDATE()," & Me.cmbTipoDoc.SelectedValue & ","
                .CommandText += prmparametro.ParameterName & ",'" & sExtension & "',GETDATE(),'" & frmLogin.objUsuario.pcveUsr & "',GETDATE(),'" & frmLogin.objUsuario.pcveUsr & "','A')"
                .Parameters.Add(prmparametro.ParameterName, prmparametro.SqlDbType)
                .Parameters(prmparametro.ParameterName).Value = prmparametro.Value
                .ExecuteNonQuery()
                .Connection.Close()
            End With
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
***** Pasame tu correo por favor para poder enviarte los prints o la fuente de mi programacion..
El mio es: [email protected]
A y tengo el skype, no se si tu lo utilizas, y la cuenta es Robregon1017
muchas gracias por la información brindada
Creo que ya resolví tu duda, cierra la pregunta para que quede finalizada por favor :-D

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas