Avatar billede nysted Nybegynder
16. juni 2004 - 20:44 Der er 16 kommentarer og
1 løsning

Gemme richtext i mysql

Er der nogen der ved om man kan gemme indholdet fra en RichTextBox i sit Rtf format i en mysql database, vel og mærket således at den beholder sine formateringer. Og hvis det ikke kan lade sig gøre direkte, om der så er nogen smart måde hvor det kan lade sig gøre alligevel...?
Avatar billede arne_v Ekspert
16. juni 2004 - 21:01 #1
Nu kender jeg ikke meget til GUI programmering.

Men er det ikke bare at hente indholder med feltnavn.Rtf og så gemme det
i et felt af typen TEXT eller MEDIUMTEXT i MySQL helt normalt ?
Avatar billede nysted Nybegynder
17. juni 2004 - 10:13 #2
Jo det havde jeg også troet, men da jeg prøvede det efter fik jeg en SQL fejl pga. de tags der bruges i rtf formatet.
hvis jeg f.eks. skriver hej i et rtf felt og henter det ud som den skriver med tags ser det ud som følger:
{\rtf1\ansi\ansicpg1252\deff0\deflang1030{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}
\viewkind4\uc1\pard\f0\fs17 Test\par
}
når jeg henter det ind i en tekstbox som felt.Rtf.toString()
Avatar billede nysted Nybegynder
17. juni 2004 - 10:15 #3
Men det må jo kunne lade sig gøre at gemme den kode i en database, ikke mindst fordi det jo kan lade sig gøre her på eksperten :)
Avatar billede lifo Nybegynder
17. juni 2004 - 15:40 #4
det har nok ikke noget med hvilket format rtf er i det er jo bare tekst

vil gætte på at det er den måde du sætter ind i databasen
du skal indsætt teksten i et parameter
Avatar billede nysted Nybegynder
17. juni 2004 - 19:33 #5
Nu har jeg prøvet mig noget mere frem og har fundet ud af at jeg ikke kan sætte noget i enden af den streng jeg får ud af richtextboxen, dvs. når jeg laver min insert into tabel values('+ rtfbox.rtf.toString()+"')" streng så går det galt, der hvor den skal sætte +"')" på til sidst, det kommer simpelt hen ikke med, og hvis jeg kunne finde en måde hvor det kunne komme med skulle jeg også få det til at lykkedes at udskifte \ med \\ for at det ikke skal forsvinde når det bliver sat ind i mysql.
øv øv øv. hvis du har nogle forslag ville jeg blive glad.
Avatar billede arne_v Ekspert
17. juni 2004 - 19:50 #6
Ah - du indsætter ved at putte RTF teksten direkte ind i INSERT VALUES.

Prøv og brug en Parameter.
Avatar billede nysted Nybegynder
17. juni 2004 - 19:56 #7
Kan du ikke lige komme med et eksempel på det?
Jeg har lige prøvet noget der hvist virker, men er vildt tumpet og må kunne gøres bedre, Jeg sætter det rtf koden ind i en almindelig textbox og henter den derefter ud igen og sætter slutningen på og det går, men det er jo ikke smart. Så hvis du kunne give et eksempel på det med en parameter ville jeg blive glad.
Avatar billede arne_v Ekspert
17. juni 2004 - 20:01 #8
XxxCommand cmd = new XxxCommand("INSERT INTO tabelnavn VALUES(@RTFTXT)", con);
cmd.Parameters.Add(new XxxParameter("@RTFTXT",  rtfbox.Rtf.ToString()));
Avatar billede nysted Nybegynder
17. juni 2004 - 20:33 #9
Hmmm Jeg får en fejl når jeg bruger dit eksempel, men det kan lige så godt være mig der laver en fejl. Men jeg har fået det hele til at virker ved at bruge en textbox som mellemvej inden jeg sætter tingene ind i databasen , og har endda fundet en måde hvor jeg bytter \ ud med \\ men det må siges at være noget lidt tumbet noget jeg har rodet mig ud i... Desværre
Avatar billede arne_v Ekspert
17. juni 2004 - 20:35 #10
Skal jeg prøve at lave et komplet eksempel ?

Hvis ja så skal jeg lige vide hvilken MySQL driver du bruger ...
Avatar billede nysted Nybegynder
17. juni 2004 - 20:39 #11
Jeg Odbc Og jeg har udskiftet xxx med Odbc, og sprog kompileren giver ikke nogen problemer, men databasen siger der er en fejl i forbindelse med kolonennenavnet "tekst"
Avatar billede nysted Nybegynder
17. juni 2004 - 20:49 #12
Det her har jeg fået til at virke:
string temp = "insert into test values('";
temp += sikkerhed.backslash(rtfhovedfelt.Rtf); //sikkerhed.backslash udskifter "\" med "\\"
textBox1.Text = temp;
textBox1.Text = textBox1.Text +"')";
myconn.run(textBox1.Text ); //myconn.run er en metoder jeg har lavet der kører en streng på min database uden at forvente et svar.
Men hvorfor jeg ikke bare kan sætte en streng i enden af den RTF streng man får fra richtextbox'en kan jeg altså ikke forstå.
Avatar billede nysted Nybegynder
17. juni 2004 - 21:42 #13
Nå men som opdatering så har jeg nu skåret så meget som muligt og prøvet en masse ting men det mest optimerede jeg kan trylle frem er følgende kode der virker:
rtfhovedfelt.Text = sikkerhed.backslash(rtfhovedfelt.Rtf);
myconn.run("insert into test values('"+rtfhovedfelt.Text+"')" );

Og min sikkerhed.backslash er som følger for at det kan gemmes i mysql og sørger for at ' bliver lavet om til '' så der ikke kommer en sql fejl der:
using System.Text.RegularExpressions;
public static string backslash(string streng)
{
    streng = Regex.Replace(streng, Regex.Escape("\\"),"\\\\");
    streng = Regex.Replace(streng, "'", "''");
        return streng;
}
Avatar billede lifo Nybegynder
18. juni 2004 - 11:39 #14
det er en dårlig måde at løse problemet på
det mest optimale er at bruge parametre som jeg og arne_v sagde
den løsning du bruger er ikke 100% sikker 
har du prøvet at indtaste nogle tegn så som . , * " ' &  og måske andre ind i din rtf TekstBox ?
tror næsten at du får en fejl
når du bruger parameters så er det lige meget hvilken tekst du indsætter så fungerer det altid
så jeg vil anbefalle dig at læse lidt om parameters  du får garanteret brug for det senere
Avatar billede nysted Nybegynder
18. juni 2004 - 12:31 #15
Tak for rådet, jeg vil læse op på det og se om jeg kan få det til at virke med parameters :)
Avatar billede arne_v Ekspert
18. juni 2004 - 23:50 #16
Det her eksempel virker:

using System;
using System.Windows.Forms;

using ByteFX.Data.MySqlClient;

namespace DefaultNamespace
{
    /// <summary>
    /// Description of MainForm.   
    /// </summary>
    public class MainForm : System.Windows.Forms.Form
    {
        private MySqlConnection con;
        private System.Windows.Forms.Button btnHent;
        private System.Windows.Forms.RichTextBox rtbHent;
        private System.Windows.Forms.Button btnGem;
        private System.Windows.Forms.RichTextBox rtbGem;
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();
           
            //
            // Establish Database connection.
            //
            con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password=");
            con.Open();
        }
       
        [STAThread]
        public static void Main(string[] args)
        {
            Application.Run(new MainForm());
        }
       
        #region Windows Forms Designer generated code
        /// <summary>
        /// This method is required for Windows Forms designer support.
        /// Do not change the method contents inside the source code editor. The Forms designer might
        /// not be able to load this method if it was changed manually.
        /// </summary>
        private void InitializeComponent() {
            this.rtbGem = new System.Windows.Forms.RichTextBox();
            this.btnGem = new System.Windows.Forms.Button();
            this.rtbHent = new System.Windows.Forms.RichTextBox();
            this.btnHent = new System.Windows.Forms.Button();
            this.SuspendLayout();
            //
            // rtbGem
            //
            this.rtbGem.Location = new System.Drawing.Point(32, 24);
            this.rtbGem.Name = "rtbGem";
            this.rtbGem.TabIndex = 0;
            this.rtbGem.Text = "";
            //
            // btnGem
            //
            this.btnGem.Location = new System.Drawing.Point(176, 32);
            this.btnGem.Name = "btnGem";
            this.btnGem.TabIndex = 2;
            this.btnGem.Text = "Gem i DB";
            this.btnGem.Click += new System.EventHandler(this.BtnGemClick);
            //
            // rtbHent
            //
            this.rtbHent.Location = new System.Drawing.Point(32, 152);
            this.rtbHent.Name = "rtbHent";
            this.rtbHent.TabIndex = 1;
            this.rtbHent.Text = "";
            //
            // btnHent
            //
            this.btnHent.Location = new System.Drawing.Point(176, 152);
            this.btnHent.Name = "btnHent";
            this.btnHent.TabIndex = 3;
            this.btnHent.Text = "Hent fra DB";
            this.btnHent.Click += new System.EventHandler(this.BtnHentClick);
            //
            // MainForm
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.Add(this.btnHent);
            this.Controls.Add(this.btnGem);
            this.Controls.Add(this.rtbHent);
            this.Controls.Add(this.rtbGem);
            this.Name = "MainForm";
            this.Text = "Gem og hent test";
            this.ResumeLayout(false);
        }
        #endregion
        void BtnGemClick(object sender, System.EventArgs e)
        {
            MySqlCommand ins = new MySqlCommand("INSERT INTO rtftest VALUES(1,@RTFTXT)", con);
            ins.Parameters.Add(new MySqlParameter("@RTFTXT",  rtbGem.Rtf.Replace(@"\",@"\\")));
            ins.ExecuteNonQuery();
        }
       
        void BtnHentClick(object sender, System.EventArgs e)
        {
            MySqlCommand sel = new MySqlCommand("SELECT rtf FROM rtftest WHERE id=1", con);
            String res = (String)sel.ExecuteScalar();
            rtbHent.Rtf = res;
        }
       
    }
}
Avatar billede arne_v Ekspert
18. juni 2004 - 23:52 #17
Jeg bruger ByteFX driver, men det bør også virke med ODBC driver.

Parameter håndterer single quote med videre. Men det håndterer tilsyneladende ikke
backslash, så den måtte jeg manuelt replace.

Det er jeg tilbøjelig til at mene er er nfejl i ByteFX driveren.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester