Avatar billede _et Praktikant
12. april 2004 - 18:18 Der er 32 kommentarer og
2 løsninger

mySQL class - hvordan

Er der en der vil lave en class, der udfører en query på en mySQL db?

Jeg er ny i C#, så det må ikke være for svært at implementere i mit program

Jeg havde tænke noget ligende dette:
-------------------------------------------------
public DB(string query)    // Klassen
{
    Kalde op;
    Lave Query;
    Lukke igen;
}

db("Select * from test")  // Kaldet for at udføre query
------------------------------------------------------------

Ps.
Jeg har kigget på nettet, og kan ikke gennemskue det.
Jeg syntes det virker som om jeg skal have installere myODBC på den maskine hvor mit programmet skal køre på.
Kan det passe?? ( myODBC er selvføldig på DB serveren. )
Avatar billede burningice Nybegynder
12. april 2004 - 18:42 #1
jeg har en klasse der gør brug af ByteFX-driveren, bruges på følgende måde:

MySqlDataStore ds = new MySqlDataStore();
ds.Sql = "Select * from test";
IDataReader reader = ds.GetReader();

using System;
using System.Configuration;
using System.Data;
using ByteFX.Data;
using ByteFX.Data.MySqlClient;

namespace MPAConsult.ToolBox.Data
{
    /// <summary>
    /// Summary description for DataStore.
    /// </summary>
    public class MySqlDataStore
    {
        private MySqlConnection conn;
        private string sql;

        public MySqlDataStore()
        {
            string connStr = ConfigurationSettings.AppSettings["db"];
            conn = new MySqlConnection(connStr);
        }

        public string Sql
        {
            get
            {
                return sql;
            }

            set
            {
                sql = value;
            }
        }

        protected void CheckSql()
        {
            if (Sql == null)
            {
                throw new NullReferenceException("Need to supply SQL-query before executing commands");
            }
        }

        public void Close()
        {
            if (conn.State == ConnectionState.Open)
            {
                try
                {
                    conn.Close();
                }
                catch (MySqlException exc)
                {
                    throw new DataStoreException(exc.Message, exc);
                }
            }
        }

        public void Open()
        {
            if (conn.State == ConnectionState.Closed)
            {
                try
                {
                    conn.Open();
                }
                catch (MySqlException exc)
                {
                    throw new DataStoreException(exc.Message, exc);
                }
            }
        }

        public void ExecuteNonQuery()
        {
            ExecuteNonQuery(false);
        }

        public void ExecuteNonQuery(bool keepOpen)
        {
            CheckSql();

            IDbCommand command = GetCommand();
           
            Open();

            try
            {
                command.ExecuteNonQuery();
            }
            catch (MySqlException exc)
            {
                throw new DataStoreException(exc.Message, exc);
            }
            finally
            {
                if (!keepOpen)
                {
                    Close();
                }
            }
        }

        public object ExecuteScalar()
        {
            IDbCommand command = GetCommand();
            object o;

            Open();
           
            try
            {
                o = command.ExecuteScalar();
            }
            catch (MySqlException exc)
            {
                throw new DataStoreException(exc.Message, exc);
            }
            finally
            {
                Close();
            }
           
            return o;
        }

        public IDbCommand GetCommand()
        {
            MySqlCommand command = new MySqlCommand();
            command.Connection = conn;

            if (Sql != null)
            {
                command.CommandText = Sql;
            }

            return command;
        }

        public IDataReader GetReader()
        {
            IDbCommand command = GetCommand();
            IDataReader reader;

            Open();
           
            try
            {
                reader = command.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (MySqlException exc)
            {
                throw new DataStoreException(exc.Message, exc);
            }
           
            return reader;
        }
    }
}
Avatar billede _et Praktikant
12. april 2004 - 18:50 #2
Spiser lige - ligger om 15 min - tak
Avatar billede _et Praktikant
12. april 2004 - 19:07 #3
Jeg kan sku ikke rigtigt gennemskue den - Jeg skal vel have den ByteFX driver??

jeg kan hellerikke se hvor jeg definerer den ip hvor db ligger
Avatar billede arne_v Ekspert
12. april 2004 - 19:09 #4
Den fiskes ud her:
  string connStr = ConfigurationSettings.AppSettings["db"];
Avatar billede _et Praktikant
12. april 2004 - 19:18 #5
Det kan godt være jeg er dum, men jeg er ikke sikker på hvordan jeg skal klistre den ind.

Skal jeg tilføje en ny class fil og rette namespace til det jeg bruger i mit projekt?? og så burde den kunne køre?
Avatar billede burningice Nybegynder
12. april 2004 - 19:23 #6
det er ikke meget galt... :) husk lige at skrive din conn-string enten i web-config'en, ellers vil klassen her ikke kunne åbne din database. Det kan forresten være du lige skulle have koden til DataStoreExcption-klassen, som kun wrapper MySqlException-klassen for at gøre hele mit frameworket mindre afhængigt af hvilken database man bruger.

using System;

namespace MPAConsult.ToolBox.Data
{
    /// <summary>
    /// Summary description for DataStoreException.
    /// </summary>
    public class DataStoreException : System.SystemException
    {
        public DataStoreException(string message, Exception exc) : base(message, exc)
        {
        }

        public DataStoreException(string message) : base(message)
        {
        }

        public DataStoreException() : base()
        {
        }
    }
}
Avatar billede _et Praktikant
12. april 2004 - 19:39 #7
Jeg kan ikke styre dette. Det er for indviklet/"Jeg er ny" til at det duer.

Hvis du vil sætte det sammen, så jeg bare kan paste det ind, så kan det være jeg kan få det til at du.
Avatar billede burningice Nybegynder
12. april 2004 - 20:26 #8
det er lige til at paste ind... det skal ind i hver sin .cs-fil... og så skulle det gerne bare funke
Avatar billede _et Praktikant
12. april 2004 - 21:15 #9
ok, det prøver jeg
Avatar billede _et Praktikant
12. april 2004 - 21:20 #10
Hvor skal disse 3 linjer være??
Compileren laver fejl. :
"A namespace does not directly contain members such as fields or methods"


MySqlDataStore ds = new MySqlDataStore();
ds.Sql = "Select * from test";
IDataReader reader = ds.GetReader();
Avatar billede _et Praktikant
12. april 2004 - 21:22 #11
Er det til et windows program? Jeg syntes at der mangler en main()
Avatar billede burningice Nybegynder
12. april 2004 - 21:59 #12
må jeg se hvordan du har fået sat koden ind? lader til at der er gået rod i dine namespaces/klasse-navne
Avatar billede _et Praktikant
12. april 2004 - 22:46 #13
Det er alt for avanceret dette, er jeg bange for.

Jeg har kigget meget på nettet, og på det du har lavet til mig, og har lige installeret ODBC.NET, men jeg kan ikke finde hovede/hale i det

Jeg er slet ikke så langt fremme med C# at jeg kan lave klippe/klistre, løse problemer der er mere end en en manglende ";"    - ha ha

Kunne du ikke lave dit eksempel projekt, som en zip, og så maile mig den?
Det behøver ikke være noget særligt, bare der er en kommentar, der hvor jeg skal skrive ip'en på DB serveren, og db navn.

Jeg er nød til at have noget der virker, mens jeg får mit eget projekt til at virke
Jeg vil gerne give 40 point oveni hvis..
Avatar billede burningice Nybegynder
14. april 2004 - 11:51 #14
jeg uploader et projekt lidt senere på dagen, ok?
Avatar billede _et Praktikant
14. april 2004 - 13:47 #15
Det er fedt.

Det er nemmere at se sammenhængen i et helt projekt. :-)
Avatar billede _et Praktikant
15. april 2004 - 19:02 #16
Ikke for at presse.

Har du glemt mig, eller fortrudt
Avatar billede arne_v Ekspert
15. april 2004 - 20:50 #17
Her er et super simpelt eksempel.

Tabel oprettet med:

CREATE TABLE T1 (
  F1 INTEGER,
  F2 VARCHAR(50)
);

Kode til at læse og vise alle records:

using System;
using System.Data;
using ByteFX.Data.MySqlClient;

class MainClass
{
    public static void Main(string[] args)
    {
        // server=localhost
        // database=Test
        // intet brugernavn og password
        MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password=");
        con.Open();
        MySqlCommand sel = new MySqlCommand("SELECT * FROM T1", con);
        MySqlDataReader rdr = sel.ExecuteReader();
        while(rdr.Read()) {
            Console.WriteLine(rdr[0] + " " + rdr[1]);
        }
        rdr.Close();
        con.Close();
    }
}
Avatar billede burningice Nybegynder
16. april 2004 - 10:36 #18
Avatar billede _et Praktikant
16. april 2004 - 17:23 #19
Nu hiver i nok håret af jer selv. :-)

Jeg har hentet ByteFX fra deres hjemmeside, og installeret det. alt ok.

Men hvordan importerer jeg namespacet/dll'en i c#.
Når jeg kører arne_v's eksempel, findes namespacet ikke.
Jeg har set et eller andet sted, at man skal "linke" nye .dll'er for de kan bruges, men jeg kan ikke finde det igen

Og cyberfessor - Dit eksempel, kan jeg først prøve mandag. Jeg kan ikke køre dit eksempel, da min C# er en ver. 2002 beta, ikke vil læse det. :-(
Men jeg har bestilt en ver. 2003 , som kommer mandag. :-)
Avatar billede arne_v Ekspert
16. april 2004 - 17:41 #20
Du skal have tilføjet en referance til:
  ByteFX.MySqlClient.dll
til dit projekt.
Avatar billede _et Praktikant
16. april 2004 - 17:46 #21
hvordan gør jeg det??

csc.exe /r:ByteFX.MySqlClient.dll

Jeg har set at man gør noget ligende, hvis man compiler i dos, men hvordan gør jeg når jeg bare trykker på min play knap i C#'s GUI.
Avatar billede _et Praktikant
16. april 2004 - 17:49 #22
Kan man ikke importerer den .dll, så namespacet altid findes, ligesom "System" gør
Avatar billede arne_v Ekspert
16. april 2004 - 17:52 #23
Jeg kender ikke VS.NET men jeg vil tro at du vælger project properties/settings
og tilføjer en reference til DLL'en.

/r er korrekt i command line compile.
Avatar billede _et Praktikant
16. april 2004 - 18:00 #24
Det var så simpelt - præcis som du skrev
Avatar billede _et Praktikant
16. april 2004 - 18:50 #25
Der er et problem.

Jeg får denne execption:

An unhandled exception of type 'ByteFX.Data.MySqlClient.MySqlException' occurred in bytefx.mysqlclient.dll

Additional information: Unable to connect to any of the specified MySQL hosts


Databasen virker!!.

Jeg kan connecte med en mySQL frontend og se databasen - Jeg bruger de samme connection properties i C#, men der fejlen så
Jeg har endda prøvet at installere mySQL på denne maskine, så den var lokalt, men det gav samme resultat.

    using System;
    using System.Data;
    using ByteFX.Data.MySqlClient;

    class MainClass
    {
        public static void Main(string[] args)
        {
            string myConnectionString = "Database=test;Data Source=192.168.1.25;User Id=root;";

            MySqlConnection con = new MySqlConnection(myConnectionString);
            con.Open();
( Program stop her -> )    MySqlCommand sel = new MySqlCommand("SELECT * FROM T1", con);
            MySqlDataReader rdr = sel.ExecuteReader();
            while(rdr.Read())
            {
                Console.WriteLine(rdr[0] + " " + rdr[1]);
            }
            rdr.Close();
            con.Close();
        }
    }

Har du et bud på hvorfor, denne fejl?
Jeg er sikker på at databasen virker.
Avatar billede _et Praktikant
16. april 2004 - 19:01 #26
Jeg kan selvføldig selv læse hvad den skriver ( kan ikke kontakte DB ) men hvorfor, og hvad der kan være i vejen, har jeg intet bud på.

Hvis jeg skriver til databasen fra ASP eller VB, virker den fint??
Avatar billede arne_v Ekspert
16. april 2004 - 19:14 #27
Prøv lige og tilføj en Password= i connection string.
Avatar billede _et Praktikant
16. april 2004 - 19:48 #28
Det har jeg prøvet.

Jeg syntes det er underligt - Jeg tror problemet er i C området.

ODBC admin kan også få fat i DB.
Avatar billede arne_v Ekspert
16. april 2004 - 19:51 #29
Har du prøvet at connecte med navn fremfor nummer ?
Avatar billede _et Praktikant
16. april 2004 - 20:19 #30
tænker du på ip - så ja.

Har lige prøvet at skrive eksemplet lidt om, men det giver samme fejl.

    using System;
    using System.Data;
    using ByteFX.Data.MySqlClient;

    class MainClass
    {
        public static void Main(string[] args)
        {
            string myConnectionString = "Database=test;DataSource=192.168.1.25;UserId=web;Password=teddy;";

            MySqlConnection connnection = new MySqlConnection(myConnectionString);
            MySqlCommand indset = new MySqlCommand("INSERT INTO t1 (f1, f2) Values(9,10)");
            indset.Connection = connnection;
            connnection.Open();
( Fejl )        indset.ExecuteNonQuery();
                indset.Connection.Close();
            connnection.Close();
        }
    }

Hvis du ikke har flere gode ideer lige nu, så tror jeg jeg vil prøve dit og cyberfessors eksempel på VS.NET 2003 mandag, og hvis det ikke virker der, må jeg jo prøve med DSN/ODBC.NET
Avatar billede _et Praktikant
16. april 2004 - 23:14 #31
Hej igen.

Jeg har fundet et godt eksempel, som virker - ODBC.NET
http://dev.mysql.com/doc/connector/odbc/en/manual.html

Men jeg syntes at i skal dele point'ne for det efterhånden store arbejde.

Jeg syntes det er underligt at ByteFX ikke vil virke her..
Avatar billede burningice Nybegynder
16. april 2004 - 23:22 #32
hmm.. ja, meget meget underligt :/ jeg har aldrig haft problemer med det
Avatar billede arne_v Ekspert
16. april 2004 - 23:40 #33
Virkede i første forsøg hos mig ...
Avatar billede _et Praktikant
17. april 2004 - 10:04 #34
Jeg vil prøve det igen, når jeg er blevet lidt mere fortrolig med C#

Tak for forsøget.
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