none
Almacenar en tabla de SQL Sever 2005 archivos PDF

    Question

  • Necesito almacenar en una tabla de SQL Sever 2005 archivos PDF; y estoy utilizando Visual Basic 2008

    Ya almaceno archivos de imagenes y me va bien.. pero ahora tengo la necesidad de almacenar nuevos tipos de archivos..

    Les agradeceria mucho si me dan una mano con esto..

    Mil Gracias

     

    Wednesday, March 26, 2008 8:03 PM

Answers

  • Yo utilizo una función que me devuelva el parámetro de SQL Server 2005 listo para usarlo con bytes:

    Code Snippet

    Private Function parametro_archivo() As SqlParameter

    Dim param_archivo As New SqlParameter("@param_archivo", SqlDbType.VarBinary, -1)

    If txtArchivo.Text.Length > 0 And lblTipo_Archivo.Text.Length > 1 Then

    Try

    Dim fotos As String

    fotos = OpenFileDialog1.FileName

    txtArchivo.Text = fotos

    Dim fsFoto As FileStream

    fsFoto = New FileStream(fotos, FileMode.Open)

    Dim fiFoto As FileInfo = New FileInfo(fotos)

    Dim temp As Long = fiFoto.Length

    Dim lung As Long = Convert.ToInt32(temp)

    'En la base de datos almacenamos picture

    Dim picture(lung) As Byte

    fsFoto.Read(picture, 0, lung)

    fsFoto.Close()

    param_archivo.Value = picture

    Catch ex As Exception

    Dim bits_aux(1) As Byte

    bits_aux(0) = Byte.MinValue

    param_archivo.Value = bits_aux

    End Try

    Else

    Dim bits_aux(1) As Byte

    bits_aux(0) = Byte.MinValue

    param_archivo.Value = bits_aux

    End If

    Return param_archivo

    End Function

     

     

    Para quedarte con el tipo de archivo sólo tienes que recoger el nombre del archivo que nos da el usuario al elegirlo con el control SaveFileDialog, ya sabes buscas el último punto del nombre y lo que siga será la extensión:

     

    Code Snippet

    Private Function tipo_archivo() As String

    Dim tipo As String

    If txtArchivo.Text.Length > 0 Then

    Dim i As Integer = txtArchivo.Text.Length - 1

    Dim aux As String = txtArchivo.Text

    While i > 0 And aux(i) <> "."

    i = i - 1

    End While

    tipo = Mid(aux, i + 1)

    Else

    'Si el usuario no selecciona ningún fichero para almacenar, guardamos

    'un espacion en blanco en la extensión. Para la hora de cargar este

    'documento saber si incluye documento adjunto o no .

    tipo = " "

    End If

    Return tipo

    End Function

     

     

    Y por último, para mostrar el archivo al usuario cuando lo lee podemos hacerlo con otro control FileSaveDialog, al que yo he llamado explorador para que seleccione donde quiere guardar el archivo adjunto que está descargando:

     

    Code Snippet

    If explorador.ShowDialog = Windows.Forms.DialogResult.OK Then

    ruta = Explorador.FileName

    Dim fs As New FileStream(ruta, FileMode.Create)

    fs.Write(bits, 0, Convert.ToInt32(bits.Length))

    fs.Close()

    Shell("rundll32.exe url.dll,FileProtocolHandler " & (ruta))

    End If

     

     

    Este último código estaría vinculado a un botón para mostrar el archivo una vez leido el registro de la tabla.

     

    Espero haberte ayudado algo.

    Un saludo.

    Javi.

    Thursday, March 27, 2008 3:27 PM

All replies

  • Hola Jorge,

     

    Yo para guardar documentos, hago la misma operación que con las imágenes lo paso a bytes y los guardo, pero además almaceno la extensión del archivo para que cuando quiera recogerlos y mostrarlos, sepa que extensión añadir y con qué programa debe abrirse.

     

    Espero que te ayude.

     

    Javi.

     

    Thursday, March 27, 2008 2:58 PM
  • Ok.. pero como almaceno la extension del archivo... eso es nuevo para mi.. tienes un codigo de ejemplo?.. para transformarlo en Byte y guardar.. y el paso contrario

    Thursday, March 27, 2008 3:04 PM
  • Esta es mi funcion para transformar una imagen en byte

     

    Public Function func_image_to_bytes(ByVal LWPimage As Image) As Byte()

    'CONVERT A IMAGEN FILE TO BYTES - TO SAVE IN SQL SERVER

    'RETURN THE FILE CONVERT

    On Error GoTo Errfunc_image_to_bytes

    If LWPimage Is Nothing Or LWPimage Is DBNull.Value Then Return Nothing

    Dim LWStemp As String = IO.Path.GetTempFileName()

    Dim LWFfile As New IO.FileStream(LWStemp, IO.FileMode.OpenOrCreate, IO.FileAccess.ReadWrite)

    LWPimage.Save(LWFfile, System.Drawing.Imaging.ImageFormat.Png)

    LWFfile.Position = 0

    Dim LWIlength As Integer = CInt(LWFfile.Length)

    Dim LWIbytes(0 To LWIlength - 1) As Byte

    LWFfile.Read(LWIbytes, 0, LWIlength)

    LWFfile.Close()

    Return LWIbytes

    Errfunc_image_to_bytes:

    MsgBox(Err.Number & ": " & Err.Description & " - LICBDBCX.func_image_to_bytes", MsgBoxStyle.Critical, systemname)

    Err.Clear()

    On Error GoTo 0

    Exit Function

    End Function

     

    y esta es para transformar d byte a imgen

     

    Public Function func_bytes_to_image(ByVal LWIbytes() As Byte) As Image

    'CONVERT BYTES IN IMAGEN FILE - TO SEE IN A CONTROL IMAGEN

    'RETURN THE FILE CONVERT

    If LWIbytes Is Nothing Or LWIbytes Is DBNull.Value Then Return Nothing

    Dim LWFmemory As New IO.MemoryStream(LWIbytes)

    Dim LWFbitmap As Bitmap = Nothing

    Try

    LWFbitmap = New Bitmap(LWFmemory, True)

    func_bytes_to_image = LWFbitmap.Clone

    LWFmemory.Dispose()

    LWFbitmap.Dispose()

    Catch ex As Exception

    System.Diagnostics.Debug.WriteLine(ex.Message)

    End Try

    End Function

     

     

    Qu cambios le harias pra que la rutina sea mas general y almacene cualquier tipo de archivo.. o por lo menos como lamacena PDF.

     

    Muchas Gracias

    Thursday, March 27, 2008 3:08 PM
  • Yo utilizo una función que me devuelva el parámetro de SQL Server 2005 listo para usarlo con bytes:

    Code Snippet

    Private Function parametro_archivo() As SqlParameter

    Dim param_archivo As New SqlParameter("@param_archivo", SqlDbType.VarBinary, -1)

    If txtArchivo.Text.Length > 0 And lblTipo_Archivo.Text.Length > 1 Then

    Try

    Dim fotos As String

    fotos = OpenFileDialog1.FileName

    txtArchivo.Text = fotos

    Dim fsFoto As FileStream

    fsFoto = New FileStream(fotos, FileMode.Open)

    Dim fiFoto As FileInfo = New FileInfo(fotos)

    Dim temp As Long = fiFoto.Length

    Dim lung As Long = Convert.ToInt32(temp)

    'En la base de datos almacenamos picture

    Dim picture(lung) As Byte

    fsFoto.Read(picture, 0, lung)

    fsFoto.Close()

    param_archivo.Value = picture

    Catch ex As Exception

    Dim bits_aux(1) As Byte

    bits_aux(0) = Byte.MinValue

    param_archivo.Value = bits_aux

    End Try

    Else

    Dim bits_aux(1) As Byte

    bits_aux(0) = Byte.MinValue

    param_archivo.Value = bits_aux

    End If

    Return param_archivo

    End Function

     

     

    Para quedarte con el tipo de archivo sólo tienes que recoger el nombre del archivo que nos da el usuario al elegirlo con el control SaveFileDialog, ya sabes buscas el último punto del nombre y lo que siga será la extensión:

     

    Code Snippet

    Private Function tipo_archivo() As String

    Dim tipo As String

    If txtArchivo.Text.Length > 0 Then

    Dim i As Integer = txtArchivo.Text.Length - 1

    Dim aux As String = txtArchivo.Text

    While i > 0 And aux(i) <> "."

    i = i - 1

    End While

    tipo = Mid(aux, i + 1)

    Else

    'Si el usuario no selecciona ningún fichero para almacenar, guardamos

    'un espacion en blanco en la extensión. Para la hora de cargar este

    'documento saber si incluye documento adjunto o no .

    tipo = " "

    End If

    Return tipo

    End Function

     

     

    Y por último, para mostrar el archivo al usuario cuando lo lee podemos hacerlo con otro control FileSaveDialog, al que yo he llamado explorador para que seleccione donde quiere guardar el archivo adjunto que está descargando:

     

    Code Snippet

    If explorador.ShowDialog = Windows.Forms.DialogResult.OK Then

    ruta = Explorador.FileName

    Dim fs As New FileStream(ruta, FileMode.Create)

    fs.Write(bits, 0, Convert.ToInt32(bits.Length))

    fs.Close()

    Shell("rundll32.exe url.dll,FileProtocolHandler " & (ruta))

    End If

     

     

    Este último código estaría vinculado a un botón para mostrar el archivo una vez leido el registro de la tabla.

     

    Espero haberte ayudado algo.

    Un saludo.

    Javi.

    Thursday, March 27, 2008 3:27 PM
  • Ahora mismo lo reviso y te coemnto..

    Muchas gracias por tu ayuda

    Thursday, March 27, 2008 3:32 PM