Avatar billede weis Nybegynder
15. december 2007 - 17:50 Der er 13 kommentarer og
1 løsning

odbc forbindelse til MySQL og brug af parameters

jeg har nu forsøgt mig med at bruge paramereters i min odbc forbindelse til min MySQL database, men jeg kan ikke få det til at virke, er der nogle som ligger inde med et eksempel på dette???
Avatar billede nielle Nybegynder
15. december 2007 - 18:04 #1
Jeg har endnu ikke fået MySQL til at acceptere navngivne parametre. I stedet acceptere den kun ?-tegn for parametrene, og så er det (vist?) rækkefølgen som de Add'es i der betemmer hvilken parameter der bindes imod:

        using (OdbcConnection conn = new OdbcConnection(connStr))
        {
            string sql =
@"DELETE
FROM guestbook
WHERE visible = 0 AND ip = ?";

            OdbcCommand cmd = new OdbcCommand(sql, conn);

            cmd.Parameters.Add("?ip", OdbcType.VarChar, 15);
            cmd.Parameters["?ip"].Value = ip;

            conn.Open();
            cmd.ExecuteNonQuery();
        }
Avatar billede weis Nybegynder
15. december 2007 - 18:17 #2
hmm... hvordan kan jeg så gøre den dynamisk
Avatar billede nielle Nybegynder
15. december 2007 - 18:30 #3
Dynamisk?
Avatar billede weis Nybegynder
15. december 2007 - 18:41 #4
ja... det er jo ikke altid at jeg kun vil indsætte ip i min database, nogle gange skal den jo gemme fx. indholdet af fire textboxe og jeg bruger en metode (fra en dll) til at udføre min sql kald...
Avatar billede nielle Nybegynder
15. december 2007 - 18:46 #5
Den problemstilling er vel ikke anderledes end hvis MySQL rent faktisk havde accepteret sådan noget som:

... ip = @ip ...

i stedet for kun

... ip = ? ...

?
Avatar billede arne_v Ekspert
15. december 2007 - 18:50 #6
ODBC bruger kun positionel parameter (? uden navn).

Men MySQL Connector for .NET accepterer navngivne parametre.

        MySqlCommand ins = new MySqlCommand("INSERT INTO temptest VALUES (?id)", con);
        ins.Parameters.Add("?id", MySqlDbType.VarChar, 20);
        ins.Parameters["?id"].Value = "Dette er en test";
Avatar billede nielle Nybegynder
15. december 2007 - 19:03 #7
Ahh, så blev jeg da lidt klogere på den sag. :^)
Avatar billede weis Nybegynder
15. december 2007 - 19:07 #8
men kan man så lave en "dynamisk" metode som kan modtage en sql sætning med x antal ? tegn og så et array "params string[]" med samme antal textboxes indhold... og så via en løkke bearbejde inputet til at blive gemt i min database???
Avatar billede nielle Nybegynder
15. december 2007 - 19:35 #9
Totalt uafprøvet:

        static void Main(string[] args)
        {
            Dictionary<string, string> toInsert = new Dictionary<string, string>();
            toInsert["ditFelt1"] = "aaaa";
            toInsert["ditFelt2"] = "bbbb";
            toInsert["ditFelt3"] = "cccc";

            Insert("dinTabel", toInsert);
        }

        static void Insert(string tableName, Dictionary<string, string> toInsert)
        {
            using (OdbcConnection conn = new OdbcConnection(connStr))
            {
                OdbcCommand cmd = new OdbcCommand();

                List<string> nameArr = new List<string>();
                List<string> valueArr = new List<string>();

                foreach (KeyValuePair<string,string> kv in toInsert)
                {
                    nameArr.Add(kv.Key);
                    valueArr.Add("?");

                    string parameterName = "?" + kv.Key;
                    cmd.Parameters.Add(parameterName, OdbcType.VarChar, 50);
                    cmd.Parameters[parameterName].Value = kv.Value;
                }

                string sql = string.Format("INSERT INTO {0} {1} VALUES ({2})",
                    tableName,
                    string.Join(", ", nameArr.ToArray()),
                    string.Join(", ", valueArr.ToArray())
                    );

                cmd.CommandText = sql;
                cmd.Connection = conn;

                cmd.ExecuteNonQuery();
            }
        }
Avatar billede nielle Nybegynder
15. december 2007 - 19:36 #10
...

                string sql = string.Format("INSERT INTO {0} ({1}) VALUES ({2})",
                    tableName,
                    string.Join(", ", nameArr.ToArray()),
                    string.Join(", ", valueArr.ToArray())
                    );

...
Avatar billede weis Nybegynder
16. december 2007 - 14:56 #11
Det er virker jo super, men nu har jeg så fået et problem med at update, for jeg brugte den samme metode til dette, kan man skrive stringen "INSERT INTO {0} ({1}) VALUES ({2}) om til en update???
Avatar billede nielle Nybegynder
16. december 2007 - 15:45 #12
Ja da, princippet ville være akkurat det sammen:

        static void Update(string tableName, Dictionary<string, string> toSet, int id)
        {
            using (OdbcConnection conn = new OdbcConnection(connStr))
            {
                OdbcCommand cmd = new OdbcCommand();

                List<string> setArr = new List<string>();
                List<string> valueArr = new List<string>();

                foreach (KeyValuePair<string, string> kv in toSet)
                {
                    setArr.Add(kv.Key + " = ?");

                    string parameterName = "?" + kv.Key;
                    cmd.Parameters.Add(parameterName, OdbcType.VarChar, 50);
                    cmd.Parameters[parameterName].Value = kv.Value;
                }

                cmd.Parameters.Add("?id", OdbcType.Int);
                cmd.Parameters["?id"].Value = id;


                string sql = string.Format("UPDATE {0} SET {1} WHERE id = ?",
                    tableName,
                    string.Join(", ", setArr.ToArray())
                    );

                conn.Open();

                cmd.CommandText = sql;
                cmd.Connection = conn;
                cmd.ExecuteNonQuery();

                conn.Close();
            }
        }
Avatar billede weis Nybegynder
16. december 2007 - 20:55 #13
super, det virker som det skal, kom med et svar :)
Avatar billede nielle Nybegynder
17. december 2007 - 07:09 #14
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
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