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.
Espero que me puedan ayudar en esta materia, ya que me encuentro estancado.
1 respuesta
Respuesta de darkastaroth
1
1
darkastaroth, tengo lo basico en desarrollo de sistemas informaticos en VB y CSharp
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
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
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
- Compartir respuesta
- Anónimo
ahora mismo