Avatar billede Klaus_S Praktikant
13. februar 2010 - 16:03 Der er 13 kommentarer og
1 løsning

Gemme filnavn i mysql database felt

Hej Eksperter.

Jeg har en textbox i en winform der indeholder c:\test\test.jpg.

Gemmer jeg det i en mysql tabel forsvinder mine "\"

har prøvet at lave en string.replace(@"\","\\") på indholdet af textboksen og kan under debug se at string indeholder 2 \\ men i databasen er de forvundet.

Database feltet er af typen VARCHAR(255)


Plz help
Avatar billede windcape Praktikant
13. februar 2010 - 16:18 #1
Dit problem er at du ikke koder ordenligt!

Hvis du bruger prepared statements, så sørger ADO.NET driveren for automatisk at escape dine \ så de bliver til \\ (as intended).

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare.aspx

http://msdn.microsoft.com/en-us/library/ms254953.aspx
Avatar billede arne_v Ekspert
13. februar 2010 - 16:36 #2
Eller min gamle artikel:

http://www.eksperten.dk/guide/831
Avatar billede Klaus_S Praktikant
14. februar 2010 - 13:42 #3
Tak for råd og fin artikel arne.

Jeg har ellers gjort som i sagde og det virker fint i min INSERT funktion men ikke på update.

her er koden. Kan i se hvad der er galt

MySqlConnection myConn = new MySqlConnection(Properties.Settings.Default.MySqlConnection);
            MySqlCommand cmd = new MySqlCommand("UPDATE ithemtable SET PicturePath='" + @strPicturePath + "' WHERE ID = '" + ID + "'", myConn);
            MySqlDataAdapter myDA = new MySqlDataAdapter(cmd);
            myConn.Open();
            cmd.Parameters.Add("@PicturePath", MySqlDbType.VarChar);
            cmd.Parameters["@PicturePath"].Value = strPicturePath;
            cmd.ExecuteNonQuery();
            myConn.Close();
Avatar billede arne_v Ekspert
14. februar 2010 - 14:26 #4
Der skal ikke '' omkring parametre
Avatar billede Klaus_S Praktikant
14. februar 2010 - 14:42 #5
DEt forstår jeg ikke. DEt har du da selv i din artikel. Eller misforstår jeg noget!

Er det i denne linje du mener?

cmd.Parameters.Add("@PicturePath", MySqlDbType.VarChar);
Avatar billede arne_v Ekspert
14. februar 2010 - 14:48 #6
Nej.

MySqlCommand cmd = new MySqlCommand("UPDATE ithemtable SET PicturePath='" + @strPicturePath + "' WHERE ID = '" + ID + "'", myConn);

->

MySqlCommand cmd = new MySqlCommand("UPDATE ithemtable SET PicturePath=@strPicturePath WHERE ID = '" + ID + "'", myConn);
Avatar billede arne_v Ekspert
14. februar 2010 - 14:48 #7
Du må iøvrigt også gerne bruge parameters for ID !
Avatar billede Klaus_S Praktikant
14. februar 2010 - 16:14 #8
Har nu ændret koden til nedenstående uden resultat. Mine "\" forsvinder stadig når jeg bruger UPDATE. ikke ved INSERT


MySqlCommand cmd = new MySqlCommand("UPDATE ithemtable SET PicturePath=@strPicturePath WHERE ID = '" + IthemID +"'", myConn);
                    MySqlDataAdapter myDA = new MySqlDataAdapter(cmd);
                    cmd.Parameters.Add("@PicturePath", MySqlDbType.VarChar);
                    cmd.Parameters["@PicturePath"].Value = strPicturePath;
                    myConn.Open();
                    cmd.ExecuteNonQuery();
                    myConn.Close();
Avatar billede janus_007 Nybegynder
14. februar 2010 - 21:38 #9
Læs forklaring her om MySql og backslash: http://dev.mysql.com/doc/refman/5.0/en/string-syntax.html
Avatar billede arne_v Ekspert
15. februar 2010 - 00:25 #10
Parameters skal haandtere alt med backslash.
Avatar billede arne_v Ekspert
15. februar 2010 - 00:26 #11
using System;
using System.Data;
using MySql.Data.MySqlClient;

namespace E
{
    public class Test
    {
        public static void Main(string[] args)
        {
            using(MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password="))
            {
                con.Open();
                MySqlCommand cre = new MySqlCommand("CREATE TABLE tesc (f1 INTEGER NOT NULL PRIMARY KEY, f2 VARCHAR(50))", con);
                cre.ExecuteNonQuery();
                MySqlCommand ins = new MySqlCommand("INSERT INTO tesc VALUES (?f1,?f2)", con);
                ins.Parameters.Add("?f1", MySqlDbType.Int32);
                ins.Parameters.Add("?f2", MySqlDbType.VarChar, 50);
                ins.Parameters["?f1"].Value = 123;
                ins.Parameters["?f2"].Value = @"A\B\C";
                ins.ExecuteNonQuery();
                MySqlCommand sel = new MySqlCommand("SELECT f2 FROM tesc WHERE f1=?f1", con);
                sel.Parameters.Add("?f1", MySqlDbType.Int32);
                sel.Parameters["?f1"].Value = 123;
                Console.WriteLine((string)sel.ExecuteScalar());
                MySqlCommand upd = new MySqlCommand("UPDATE tesc SET f2=?f2 WHERE f1=?f1", con);
                upd.Parameters.Add("?f1", MySqlDbType.Int32);
                upd.Parameters.Add("?f2", MySqlDbType.VarChar, 50);
                upd.Parameters["?f1"].Value = 123;
                upd.Parameters["?f2"].Value = @"A\B\C\D";
                upd.ExecuteNonQuery();
                Console.WriteLine((string)sel.ExecuteScalar());
                MySqlCommand drp = new MySqlCommand("DROP TABLE tesc", con);
                drp.ExecuteNonQuery();
                Console.ReadKey();
            }
        }
    }
}

udskriver f.eks. korrekt:

A\B\C
A\B\C\D

hos mig.
Avatar billede arne_v Ekspert
01. marts 2010 - 00:59 #12
Klaus?
Avatar billede Klaus_S Praktikant
01. marts 2010 - 08:00 #13
Ja sorry Arne.
Fik det aldrig til at virke. Brugte et gammelt trick jeg plejer at bruge til robotter der heller ikke accepterer "\". Lavede replace med 2 * _ _. Ikke kønt men det virker.
Tak for hjælpen.
nu skal jeg bare finde ud af hvordan jeg lukker og tildeler dig dine point GGG

Hilsen Klaus
Avatar billede arne_v Ekspert
02. marts 2010 - 02:36 #14
jeg skal først smide et rigtigt svar
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

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