16. juni 2004 - 20:44Der 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...?
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()
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.
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.
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
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"
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å.
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; }
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
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; }
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.
Synes godt om
Ny brugerNybegynder
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.