none
RICHTEXT A MYSQL RRS feed

  • Pregunta

  • Estimados los saludo.

    Les consulto como hago para guardar el texto de un richtext a una tabla en msqy(que tipo de campo deberia definir)?

    Necesito respetar el formato de los espacios y por ejemplo los salto en linea y luego recuperarlo de la misma forma que el archivos se guardo...

    Saludos

    lunes, 21 de septiembre de 2020 12:37

Respuestas

  • hola

    Ayuda Como Guarda Un RichTextBox Con Texto Enriquecido En Mysql

    Lo que recuperas de la db asignalo a la propiedad .Rtf del RichTextBox y no al .Text

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta David Sigampa sábado, 3 de octubre de 2020 14:38
    lunes, 28 de septiembre de 2020 3:17
  • Vale, ya está. El problema viene de que estás concatenando el texto en la sentencia SQL, en lugar de parametrizar la sentencia y asignar el texto al parámetro. Esta mala práctica, aparte de los problemas de seguridad (inyección de SQL) y de rendimiento que esto ocasiona, tiene un problema adicional que es el que te está fastidiando en este caso: Cualquier carácter que exista en el texto y que sea interpretable en SQL es interpretado por el motor de base de datos en lugar de grabarse. Un caso muy típico de esto es el de la comilla simple, que en caso de existir dentro del texto ocasionaría un error. Y en el caso de MySql, otro carácter que lo fastidia todo es la contrabarra, que se interpreta como un carácter de escape a no ser que tengas activada la opción NO_BACKSLASH_ESCAPES. Este es el problema que te está pasando en este caso concreto (aunque cualquier otro, como la comilla, también podría ocasionar un error en cualquier momento si el usuario la teclease en el richtextbox).

    La solución buena, eficiente y elegante, sería parametrizar la sentencia.

    Si por alguna razón no quieres parametrizarla, la alternativa es usar pTexto.mTexto.Replace("\", "\\") para duplicar todas las contrabarras antes de mandarlas a grabar. Esto funcionará, pero es una "chapuza" horrible y no resuelve los otros problemas tales como la comilla o la inyección de SQL.

    • Marcado como respuesta David Sigampa sábado, 3 de octubre de 2020 14:37
    martes, 29 de septiembre de 2020 6:53
    Moderador
  • hola

    No se programa de esa forma, tienes que usar prametros, algo como esto

    public bool CargarTextoParaGuardado(TextoTraducido pTexto)
    {
    	bool resultado = false;
    	
    	try
    	{
    		using(var vCon = new MySqlConnection(bd.ValidarConexion())
    		{
    			vCon.Open();
    			
    			string query = "INSERT INTO textoguardado(texto,nombre_archivo) values (?texto , ?nombre)";
    			var vComando = new MySqlCommand(query, vCon);
    			vComando.Parameters.AddWithValue("?texto", pTexto.mTexto);
    			vComando.Parameters.AddWithValue("?nombre", pTexto.mNombreTexto)
    			
    			vComando.ExecuteNonQuery();
    		}
    		
    		resultado = true;
    		
    	}
    	catch (Exception ex)
    	{
    		Console.WriteLine("Error", ex.ToString());
    	}
    
    	
    	return resultado;
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta David Sigampa sábado, 3 de octubre de 2020 14:37
    martes, 29 de septiembre de 2020 14:35

Todas las respuestas

  • Text debería funcionarte bien (hasta 65.000 caracteres) si es mucho texto cambia a MediumText
    lunes, 21 de septiembre de 2020 13:42
  • El truco para guardar el contenido del RichTextBox y luego recuperarlo correctamente es que tienes que usar su propiedad .Rtf (y no la propiedad .Text), tanto al salvarlo como al recuperarlo. Esto te devuelve el contenido en formato "Rich Text Format", que preserva todo el formato y estilos que haya en el RichTextBox (los cuales se pierden si usas el .Text). El Rich Text Format es un simple string, no contiene nada "binario", por lo que lo puedes salvar en base de datos en un campo de texto normal y corriente.

    lunes, 21 de septiembre de 2020 15:20
    Moderador
  • Perfecto tendrias algun ejemplo para manejar archivos .Rtf?
    lunes, 21 de septiembre de 2020 20:14
  • Perfecto tendrias algun ejemplo para manejar archivos .Rtf?

    No, los archivos .rtf no se "manejan". Por dentro son puro texto, simplemente el texto tiene embebidos una serie de códigos entre {} para indicar los formatos. No hay que hacer nada con ese texto, cuando lo lees desde la propiedad .rtf o lo asignas a la propiedad .rtf, automáticamente lee o asigna los formatos correspondientes. Para ti es transparente, no hay que hacer ningún "manejo" con él.

    Si está en un archivo, puedes abrirlo con cualquier programa que entienda el .rtf, como por ejemplo Word o Wordpad. Pero a los efectos de la pregunta que nos ocupa, en la que querías almacenarlo en base de datos, lo del archivo es irrelevante, porque en ningún momento tienes que utilizar ningún archivo.

    martes, 22 de septiembre de 2020 8:04
    Moderador
  • Haciendo pruebas y definiendo un tipo de dato "cadena" en el moto de base de datos, la cadena se guarda entre {} como lo mencionas, ahora cuando recupero el texto y lo asigno al richtext.rtf=string me tira error....

    Aclaro que cuando lo recupero del moto la consulta busca una "cadena" en ese campo...

    richtext.rtf=string....y me tira error.

    Me podrias dar un ejemplo de como recuperar el texto guardado?

    martes, 22 de septiembre de 2020 12:59
  • Me podrias dar un ejemplo de como recuperar el texto guardado?

    Te doy la vuelta a la pregunta: dame tú el ejemplo de cómo guardas y recuperas un texto corriente (que no sea rtf), por ejemplo, el .Text de un textbox. Me imagino que esto lo tendrás ya controlado y lo habrás hecho muchas veces. Sobre ese ejemplo te pongo los cambios que habría que hacer en caso de que en lugar del TextBox tengas un RichTextBox y quieras salvar el .Rtf en lugar del .Text.

    Es importante partir de un ejemplo que tengas porque existen muchas tecnologías diferentes para acceso a datos (con ADO.NET, con DataSet o DataReader, con algún ORM, etc.). Sabiendo cómo haces normalmente las cosas, sobre ese ejemplo podemos hacer los cambios para el Rtf, de manera que siga usando la misma tecnología que ya tienes en tu programa.

    martes, 22 de septiembre de 2020 19:46
    Moderador
  • Hola David Sigampa, 

      

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las  respuestas proporcionadas?  

    Espero su respuesta.  

    Gracias por usar los foros de MSDN.  

    Andres Aguilar 

    ____________________________  

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    miércoles, 23 de septiembre de 2020 15:11
    Moderador
  • Lo que hago es pasar un .text a un string y lo guardo en una tabla, para recuperarlo utilizo MySqlDataReader y armo el objeto segun los datos que necesito, que en su mayoria son string por ejemplo, luego devuelvo ese objeto y muestro algun campo en un textbox.text....

    Con el  .rtf

    Bien, lo que hago es pasar el.rtf del richtextbox a un método que recibe un string y lo guarda el motor mysql, efectivamente el campo se guarda con el formato especificado anteriormente.

    Ahora para recuperar el mismo texto utilizo MySqlDataReader y lo que busco es reader.string para hacer referencia al texto guardado, eso al mostrarlo en la propiedad richtext.rtf me tira el erro que te mencione, la segunda prueba que hice fue mostrarlo en la propiedad richtext.text, en la cual lo muestra por no como se ingreso el texto al momento de guardar sino como esta guardado en la base de datos (con los símbolos).

    Este es el texto Recuperado y asignado en la propiedad .text del rich:

    {
    tf1ansiansicpg1252deff0deflang3082{fonttbl{f0fnilfcharset0 Times New Roman;}}
    viewkind4uc1pardf0fs23 Hola buenos par
    dias!par
    chicossspar
    ...par
    ...par
    ...par
    }


    lunes, 28 de septiembre de 2020 2:05
  • hola

    Ayuda Como Guarda Un RichTextBox Con Texto Enriquecido En Mysql

    Lo que recuperas de la db asignalo a la propiedad .Rtf del RichTextBox y no al .Text

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta David Sigampa sábado, 3 de octubre de 2020 14:38
    lunes, 28 de septiembre de 2020 3:17
  • Este es el texto Recuperado y asignado en la propiedad .text del rich:[...]

    Algo ha fallado. Parece como si se hubieran perdido todas las contrabarras del rtf. Por ejemplo, donde pones par debería ser \par. No sé si además fata alguna otra cosa. Habría que revisar el código con el que grabas y el que usas para leer, a ver dónde se puede estar perdiendo ese carácter.
    lunes, 28 de septiembre de 2020 7:03
    Moderador
  • Adjunto el procedimiento completo:

    Paso 1

               

    private void botonGuardar_Click(object sender, EventArgs e)
            {
                if (vGestionadorTraducir.RecibirTextoPlanificadoParatraducir(richText.Rtf, txtNombre.Text))
                {
                    MensajesControl.Mensajes.GuardadoCorrecto();
                }

            }

    Recibe una clase y armo un constructor del tipo objeto

       public bool RecibirTextoPlanificadoParatraducir(string pTexto,string pNombre)
            {
                vTextoTraducido = new TextoTraducido(pTexto,pNombre);
                return (bdSeñas.CargarTextoParaGuardado(vTextoTraducido));
            }

    Paso 3 en la clase bdSeñas

           public bool CargarTextoParaGuardado(TextoTraducido pTexto)
            {
                bool resultado;
                MySqlConnection vCon = new MySqlConnection(bd.ValidarConexion());
                MySqlCommand vComando = new MySqlCommand("INSERT INTO textoguardado(texto,nombre_archivo) values ('"+pTexto.mTexto+"','"+pTexto.mNombreTexto+"');", vCon);
                try
                {
                    vCon.Open();
                    MySqlTransaction transaccion = vCon.BeginTransaction();
                    vComando.Transaction = transaccion;
                    resultado = System.Convert.ToBoolean(vComando.ExecuteNonQuery());
                    transaccion.Commit();
                    transaccion.Dispose();
                    vCon.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error", ex.ToString());
                    return false;
                }
                finally
                {
                    if (vCon.State == ConnectionState.Open)
                        vCon.Close();
                }
                return (resultado);
            }

    Texto Original

    Hola buenos dias a todos

    Como estan?

    Saludos

    Texto obtenido en el debug antes de ejecutar el "insert en la bd"

    "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang3082{\\fonttbl{\\f0\\fnil\\fcharset0 Times New Roman;}}\r\n\\viewkind4\\uc1\\pard\\f0\\fs23 Hola buenos dias a todos\\par\r\nComo estan?\\par\r\nSaludos...\\par\r\n}\r\n"

    Texto Guardado en la base de datos mysql

    {
    tf1ansiansicpg1252deff0deflang3082{fonttbl{f0fnilfcharset0 Times New Roman;}}
    viewkind4uc1pardf0fs23 Hola buenos dias a todospar
    Como estan?par
    Saludos...par
    }

    El texto por alguna razon se modifica en el ultimo metodo antes de hacer el insert en la base de datos...

    martes, 29 de septiembre de 2020 0:58
  • Adjunto procedimiento de recuperacion

    Paso 1

          public ArrayList RecuperarTextosGuardados()
            {
                ArrayList vColeccion = new ArrayList();
                TextoTraducido vTextoGuardado;
                MySqlConnection vCon = new MySqlConnection(bd.ValidarConexion());
                MySqlCommand vComando = new MySqlCommand("select id_texto,fecha,profesor.nombre,carrera.nombre,asignaturas.nombre,textoguardado.nombre_archivo,textoguardado.texto from textoguardado inner join carrera using(id_carrera) inner join profesor using(id_profesor) inner join asignaturas using(id_asignatura)", vCon);
                vCon.Open();
                MySqlDataReader vReader = vComando.ExecuteReader();
                if (vReader.HasRows)
                {
                    while (vReader.Read())
                    {
                        vTextoGuardado = new TextoTraducido(vReader.GetInt16(0), vReader.GetDateTime(1), vReader.GetString(2), vReader.GetString(3), vReader.GetString(4), vReader.GetString(5),vReader.GetString(6));
                        vColeccion.Add(vTextoGuardado);
                    }
                }
                vCon.Close();
                return (vColeccion);
            }

    Recupero y armo un obtejo, devuelvo el objeto y si asigno el campo "texto" al .rtf me tira error

    martes, 29 de septiembre de 2020 0:59
  • Vale, ya está. El problema viene de que estás concatenando el texto en la sentencia SQL, en lugar de parametrizar la sentencia y asignar el texto al parámetro. Esta mala práctica, aparte de los problemas de seguridad (inyección de SQL) y de rendimiento que esto ocasiona, tiene un problema adicional que es el que te está fastidiando en este caso: Cualquier carácter que exista en el texto y que sea interpretable en SQL es interpretado por el motor de base de datos en lugar de grabarse. Un caso muy típico de esto es el de la comilla simple, que en caso de existir dentro del texto ocasionaría un error. Y en el caso de MySql, otro carácter que lo fastidia todo es la contrabarra, que se interpreta como un carácter de escape a no ser que tengas activada la opción NO_BACKSLASH_ESCAPES. Este es el problema que te está pasando en este caso concreto (aunque cualquier otro, como la comilla, también podría ocasionar un error en cualquier momento si el usuario la teclease en el richtextbox).

    La solución buena, eficiente y elegante, sería parametrizar la sentencia.

    Si por alguna razón no quieres parametrizarla, la alternativa es usar pTexto.mTexto.Replace("\", "\\") para duplicar todas las contrabarras antes de mandarlas a grabar. Esto funcionará, pero es una "chapuza" horrible y no resuelve los otros problemas tales como la comilla o la inyección de SQL.

    • Marcado como respuesta David Sigampa sábado, 3 de octubre de 2020 14:37
    martes, 29 de septiembre de 2020 6:53
    Moderador
  • hola

    No se programa de esa forma, tienes que usar prametros, algo como esto

    public bool CargarTextoParaGuardado(TextoTraducido pTexto)
    {
    	bool resultado = false;
    	
    	try
    	{
    		using(var vCon = new MySqlConnection(bd.ValidarConexion())
    		{
    			vCon.Open();
    			
    			string query = "INSERT INTO textoguardado(texto,nombre_archivo) values (?texto , ?nombre)";
    			var vComando = new MySqlCommand(query, vCon);
    			vComando.Parameters.AddWithValue("?texto", pTexto.mTexto);
    			vComando.Parameters.AddWithValue("?nombre", pTexto.mNombreTexto)
    			
    			vComando.ExecuteNonQuery();
    		}
    		
    		resultado = true;
    		
    	}
    	catch (Exception ex)
    	{
    		Console.WriteLine("Error", ex.ToString());
    	}
    
    	
    	return resultado;
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta David Sigampa sábado, 3 de octubre de 2020 14:37
    martes, 29 de septiembre de 2020 14:35
  • Estimado solucionado, el error estaba al guardar el archivo:

    solución al Guardar:

    string query = "INSERT INTO textoguardado(texto,nombre_archivo) values (?texto , ?nombre)";
    var vComando = new MySqlCommand(query, vCon);
    vComando.Parameters.AddWithValue("?texto", pTexto.mTexto);
    vComando.Parameters.AddWithValue("?nombre", pTexto.mNombreTexto)

    vComando.ExecuteNonQuery();

    Solución para mostrar

    richtext.rtf=cadena de texto;

    sábado, 3 de octubre de 2020 14:37