Avatar billede mnoer Nybegynder
28. januar 2004 - 16:44 Der er 16 kommentarer og
2 løsninger

MySQL og ASP.NET

Jeg kæmper en lidt, ok meget, med at få asp.net til at connecte til en MySQL database. Jeg har installeret myodbc-3.51 og odbc_net.msi.
Jeg har oprettet en test-db i mysql, og oprettet en DNS (ved navn test)

Er der en der kan komme med et kodeeksempel? (helst VB.NET)
Avatar billede nielsbrinch Nybegynder
28. januar 2004 - 18:35 #1
Jeg kan varmt anbefale ByteFX til at forbinde til MySQL med ASP.NET.
Avatar billede repsak Nybegynder
28. januar 2004 - 19:10 #2
Jeg bruger DNSless som virker
upåklageligt
odbcConnection = new OdbcConnection(CONNECTION_STRING);
odbcConnection.Open();
dbCommand = new OdbcCommand();
dbCommand.CommandText = "SELECT ...";
dbCommand.Connection = odbcConnection;
Avatar billede burningice Nybegynder
28. januar 2004 - 19:56 #3
ByteFX sammen med denne MySqlDataStore... så er man godt kørende :)

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 mnoer Nybegynder
28. januar 2004 - 21:38 #4
når der står følgende:

<%
odbcConnection = new OdbcConnection("DSN=test");
odbcConnection.Open();
dbCommand = new OdbcCommand();
%>

får jeg denne fejl:
Compiler Error Message: BC30451: Name 'odbcConnection' is not declared.

Jeg kommer fra "Clasic ASP" og er total ny til det her.. hvad mangler jeg?
Avatar billede nielsbrinch Nybegynder
28. januar 2004 - 22:06 #5
Jeg har lavet denne klasse som jeg bruger med ByteFX:

using System;
using System.Collections;
using System.Data;
using System.Data.Common;
using System.Data.Odbc;
using System.Threading;
using ByteFX.Data.MySqlClient;

namespace vlife
{
    public class Database
    {
        private static ArrayList conList = new ArrayList();

        public static void Initialize(int amount, string strCon) {
            for (int i = 0; i < amount; i++) {
                conList.Add(new MySqlConnection(strCon));
            }
        }

        public static MySqlConnection GetConnection() {
            lock (conList) {
                int sleepTimes = 0;
                MySqlConnection con = (MySqlConnection)conList[0];
                while (con.State != System.Data.ConnectionState.Open) {
                    if (con.State == System.Data.ConnectionState.Closed) {
                        con.Open();
                    }
                    if (con.State == System.Data.ConnectionState.Broken) {
                        con.Close();
                        con.Open();
                    }
                    if (sleepTimes > 10) {
                        return null;
                    }
                    else {
                        Thread.Sleep(500);
                        sleepTimes++;
                    }
                }
                conList.RemoveAt(0);
                conList.Add(con);
                return con;
            }
        }

        public static void Close() {
            foreach(MySqlConnection con in conList) {
                con.Close();
            }
        }

        public static void Open(MySqlConnection con) {
            try {
                if (con.State == System.Data.ConnectionState.Open) {
                    return;
                }
            }
            catch (NullReferenceException) {
            }
            DBInfo info = new DBInfo();
            string strCon = "DATABASE="+info.Database+";Driver=mysql;SERVER="+info.Server+";UID="+info.Userid+";PWD="+info.Password+";";
            con = new MySqlConnection(strCon);
            con.Open();
        }
    }
}
Avatar billede nielsbrinch Nybegynder
28. januar 2004 - 22:09 #6
Hov, den hænger sguda ikke sammen :) Det er en hybrid mellem to versioner jeg kom til at paste der. Sorry - men den virker helt fint alligevel. Jeg bruger disse 2 metoder til at tilgå den:

private int Update(string sql) {
            con = Database.GetConnection();
            cmd = new MySqlCommand(sql, con);
            return cmd.ExecuteNonQuery();
        }

        private MySqlDataReader Query(string sql) {
            con = Database.GetConnection();
            cmd = new MySqlCommand(sql, con);
            for (int i = 0; i < 10; i++) {
                try {
                    return cmd.ExecuteReader();
                } catch (InvalidOperationException) {
                    con.Close();
                    con.Open();
                }
            }
            return null;
        }
Avatar billede mnoer Nybegynder
28. januar 2004 - 22:37 #7
jeg er desværre ikke med.. skal filen hedde noget specielt? skal det ligge i den samme fil det du CP'ede? skal der nogle <% %> ind før og efter koden?
jeg har prøvet mig lidt frem, men har ikke fået det til at virke :(
Avatar billede niemeyer Nybegynder
29. januar 2004 - 19:18 #8
Du spurgte efter et kode eksempel: http://www.wedonet.com. De har en Ibuyspy portal applikation til download, komplet med kode i såvel VB.NET og C#.

Håber det hjælper dig,
Niels
Avatar billede niemeyer Nybegynder
29. januar 2004 - 19:24 #9
For fuldstændighedens skyld skal jeg lige nævne at der er tale om Ibuyspy Store og ikke ikke Ibuyspy Portal (men eksemplet er godt nok).
Niels
Avatar billede mnoer Nybegynder
29. januar 2004 - 20:22 #10
har stadig ikke fattet det... jeg læser lidt mere om det, det er nok hele min forståelse det er galt med.
I deler points, håber i er tilfredse med det.
Mange tak for hjælpen.
Avatar billede niemeyer Nybegynder
29. januar 2004 - 20:39 #11
MySql forummet på Microsofts Asp.net portal (http://www.asp.net/Forums/ShowForum.aspx?tabindex=1&ForumID=56) er et godt sted at hente inspiration og hjælp.
Prøv også at søge efter "mysql" på http://www.dotnet247.com/ - en glimrende site der samler meget op fra nyhedsgrupperne.

// Niels
Avatar billede burningice Nybegynder
29. januar 2004 - 20:55 #12
nielsbrinch>> kan være det er mig der tager fejl.. men det ser ud til at du har prøvet at implementere en connection-pool ?! hvorfor er det lige du ulejliget dig med det, når det allerede er med i driveren fra ByteFX ?
Avatar billede mnoer Nybegynder
29. januar 2004 - 21:01 #13
niemeyer >> tak, jeg kigger på det
Avatar billede nielsbrinch Nybegynder
29. januar 2004 - 22:58 #14
cyberfessor, jeg troede ikke der var connection pool i ByteFX, kun i den databasetilgang der hører til .NET
Avatar billede burningice Nybegynder
29. januar 2004 - 23:07 #15
ork jo.. og med den nye version 0.75 er pooling'en blevet endnu bedre
Avatar billede nielsbrinch Nybegynder
29. januar 2004 - 23:09 #16
Hvordan virker det egentligt inde bagved? Det har jeg ingen kontrol over, vel? Hvor længe forbliver forbindelserne på databasen?
Avatar billede burningice Nybegynder
29. januar 2004 - 23:24 #17
jeg ved det faktisk ikke, men det kan du vel finde i dokumentationen... og hvis det ikke står her, kan du hente sourcekoden og implementere en property så du kan få kontrol over det.
Avatar billede nielsbrinch Nybegynder
03. februar 2004 - 23:43 #18
Jeg har supplerende spørgsmål til MySqlDataStore her: http://www.eksperten.dk/spm/460819
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