none
Leer Rtf en RichTextBox desde Mysql en VB.Net RRS feed

  • Pregunta

  • Hola pues llevo todo el día buscando y haciendo pruebas y nada de nada.

    Quisiera guardar el texto de un RichTextBox con formato (supongo que como si fuera un rtf) en una base de datos con MySql desde un formulario, para después leerlo en otro formulario de la aplicación.

    La parte de guardar el rtf creo que la he logrado y e intentado con 2 metodos:

    1. Guardarlo en una columna con formato Text, desde la propiedad Rtf del RichTextBox. (Este me funciono) y me genera algo parecido a esto:

    {
    tf1ansiansicpg1252deff0deflang2058{fonttbl{f0fnilfcharset0 Microsoft Sans Serif;}}
    {colortbl ;
    ed40green40lue40;}
    viewkind4uc1pardcf1f0fs17 Pruebapar
    }
    

    2. Generando un Array de Bytes y guardarlo en un campo Blop. (Este no pude lograrlo).

    Pero he aquí el problema a la hora de leer los datos desde la DB me marca un error de incompatibilidad que dice: "El formato de archivo no es valido"

    Les dejo mi código por si alguien me puede ayudar, Gracias! :)

    Imports MySql.Data.MySqlClient
    Public Class VerInformeInterno
        Sub LlenaTxt()
            Dim deudor As DataTable = New DataTable
            Try
                ConectaDB()
                deudor = MuestraDB("SELECT NoSocio,Nombre,TipoCredito,Expediente,Juzgado,EstadoActual,Gestor FROM deudor WHERE IdDeudor=" & BuscarInformeInterno.IdDeudor)
                TxtNoSocioYFecha.Text = deudor.Rows(0).Item(0).ToString
                TxtDeudorPrincipal.Text = deudor.Rows(0).Item(1).ToString
                TxtTipoCredito.Text = deudor.Rows(0).Item(2).ToString
                TxtExpediente.Text = deudor.Rows(0).Item(3).ToString
                TxtJuzgado.Text = deudor.Rows(0).Item(4).ToString
                TxtEstadoActual.Rtf = deudor.Rows(0).Item(5).ToString 'Aquí me marca el error!
                TxtGestor.Text = deudor.Rows(0).Item(6).ToString
                deudor = MuestraDB("SELECT Nombre FROM Aval1 WHERE IdAval1=" & BuscarInformeInterno.IdAval1)
                TxtAval1.Text = deudor.Rows(0).Item(0).ToString
                If BuscarInformeInterno.IdAval2 = 0 Then
                    TxtAval2.Text = ""
                Else
                    deudor = MuestraDB("SELECT Nombre FROM Aval2 WHERE IdAval2=" & BuscarInformeInterno.IdAval2)
                    TxtAval2.Text = deudor.Rows(0).Item(0).ToString
                End If
            Catch ex As Exception
                MsgBox("Error al leer la Base de Datos" & vbCrLf & ex.Message, MsgBoxStyle.Critical, "¡ERROR!")
            End Try
        End Sub
        Sub ModificaEstadoActual()
            Try
                ConectaDB()
                Dim cmd As MySqlCommand
                cmd = New MySqlCommand("UPDATE Deudor SET EstadoActual='" & TxtEstadoActual.Rtf & "' WHERE IdDeudor=" & BuscarInformeInterno.IdDeudor, conexion)
                cmd.ExecuteNonQuery()
                MsgBox("Guardado con exito", MsgBoxStyle.Information, "Exito!")
            Catch ex As Exception
                MsgBox("Error al leer la Base de Datos" & vbCrLf & ex.Message, MsgBoxStyle.Critical, "¡ERROR!")
            End Try
        End Sub
    
        Private Sub BtnEditar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEditar.Click
            If BtnEditar.Text = "Editar" Then
                TxtEstadoActual.ReadOnly = False
                BtnEditar.Text = "Guardar"
                BtnSalir.Text = "Cancelar"
            Else
                TxtEstadoActual.ReadOnly = True
                BtnEditar.Text = "Editar"
                BtnSalir.Text = "Salir"
                ModificaEstadoActual()
            End If
        End Sub
    
        Private Sub BtnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSalir.Click
            If BtnSalir.Text = "Salir" Then
                Informes.BtnInterno.PerformClick()
            Else
                Dim tabla As DataTable = MuestraDB("SELECT EstadoActual FROM Deudor WHERE IdDeudor=" & BuscarInformeInterno.IdDeudor)
                TxtEstadoActual.Rtf = tabla.Rows(0).Item(0)
                TxtEstadoActual.ReadOnly = True
                BtnSalir.Text = "Salir"
                BtnEditar.Text = "Editar"
            End If
        End Sub
    End Class

    Fuentes de donde he buscado: http://social.msdn.microsoft.com/Forums/es-MX/winformses/thread/6ff82dc9-dd33-4d47-95da-cdb2165e0715

    http://www.canalvisualbasic.net/foro/visual-basic-6-0/richtextbox-en-bd-1203/

    Había leído uno en el cual mencionaban que se guardara la propiedad Rtf del Richtextbox en un campo nvarchar en SqlServer pero no encontré su equivalente en MySql y lo guarde en un campo Text pero sigo sin poder recibir los datos desde el servidor para mostrarlos. 

    Gracias y Saludos desde México

    lunes, 3 de septiembre de 2012 15:48

Todas las respuestas

  • Como veo que están un poco ocupados, me han ayudado en otro foro.

    Dejo la respuesta por si a alguien le sirve :D

    Se importa System.IO y Mysql.Data,MySqlClient

    Imports MySql.Data.MySqlClient
    Imports System.IO

    El codigo para generar el codigo binario y mandarlo a la base de datos.

    Try
                'Generar archivo temporal
                TxtEstadoActual.SaveFile("Temp\temporal.rtf", RichTextBoxStreamType.RichNoOleObjs)
                'Convertirlo a un arreglo de bytes
                Dim mi_archivo As FileStream = New FileStream(("Temp\temporal.rtf"), FileMode.OpenOrCreate, FileAccess.ReadWrite)
                Dim arrFile() As Byte = New Byte((mi_archivo.Length) - 1) {}
                Dim reader As BinaryReader = New BinaryReader(mi_archivo)
                arrFile = reader.ReadBytes(Convert.ToInt32(mi_archivo.Length))
                reader.Close()
                'Guardarlo en DB
                ConectaDB("Intranet") 'Se abre la conexión.
                Dim cmd As New MySqlCommand
                cmd.Connection = conexion 'Cadena de conexión.
                cmd.CommandText = "UPDATE Deudor SET EstadoActual = ?estado WHERE IdDeudor = ?id"
                cmd.Parameters.AddWithValue("?estado", arrFile)
                cmd.Parameters.AddWithValue("?id", BuscarInformeInterno.IdDeudor)
                cmd.ExecuteNonQuery()
                'Mensaje de Confirmacion
                MsgBox("Guardado con exito", MsgBoxStyle.Information, "Exito!")
            Catch ex As Exception
                MsgBox("Error al leer la Base de Datos" & vbCrLf & ex.Message, MsgBoxStyle.Critical, "¡ERROR!")
            End Try
     

    Y el código para recibir los datos de la DB, guardarlos en un archivo temporal y ponerlo en el RichTextBox

    Try
                ConectaDB("Intranet")
                Dim tabla As DataTable = MuestraDB("SELECT EstadoActual FROM Deudor WHERE IdDeudor=" & BuscarInformeInterno.IdDeudor)
                If tabla.Rows.Count <> 0 Then
                    'Creo mi arreglo que almacenara los bytes del archivo
                    Dim barrFile() As Byte = CType(tabla.Rows(0)(0), Byte())
                    'Creo el archivo apartir de los bytes
                    Using newFile As New FileStream(("Temp\temporal1.rtf"), FileMode.Create, FileAccess.Write)
                        newFile.Write(barrFile, 0, barrFile.Length)
                        newFile.Flush()
                        newFile.Close()
                    End Using
                    'Abro el archivo temporal en el RichTextBox
                    TxtEstadoActual.LoadFile("Temp\temporal1.rtf")
                End If
            Catch ex As Exception
                MsgBox("Error al leer la Base de Datos" & vbCrLf & ex.Message, MsgBoxStyle.Critical, "¡ERROR!")
            End Try

    Espero que les sirva :)

    Fuente: http://www.forosdelweb.com/f29/leer-rtf-richtextbox-desde-mysql-vb-net-1011290/#post4263747

    martes, 4 de septiembre de 2012 16:37