Kom igång med MySQL i ASP.NET

25 12 2009

Att jobba med MySQL i ASP.NET är inte något som funkar från start. I alla fall inte med Visual Web Developer 2005, ett program man bör använda då man utvecklar även om det är oerhört segt och jobbigt ibland. Här får jag igång dig med ASP.NET + C# + MySQL.

Det absolut första du ska göra är att ladda ner dotnet-Connectors för MySQL, det är en zip med lite dll:er. Ladda ner zip-filen utan installerare. I den finner du filen ”mysql.data.dll” som är den du främst ska använda. Ta och lägg den i ditt projekts bin-mapp så är du på väg att komma igång.

Värt att notera: I zip-filen låg också en chm-fil, det är en komplett referensfil över dll:en. Den innehåller inte bara en komplett referens, utan även en mängd kodexempel och olika tillämpningsområden. Kika gärna lite i den, speciellt om du kör helt fast.

Med dll:en på plats så kan du börja koda. Skapa en ny ASP.NET-fil och lägg till följande using-direktiv i din .cs-fil:

using MySql.Data.MySqlClient;

Nu kan du i din CodeBehind-fil jobba med MySQL på ett mycket smidigt sätt.

Jag sätter alltid upp en class-fil med alla mina databasjobb. Den instansierar jag sen i varje fil som ska använda den.

Såhär sätter du upp koden i din databas-klass. Döp den förslagsvis till database.cs och lägg den i din App_Code-mapp i ditt projekt.

namespace funcs
{
    public class database
    {
        string strConn = ((NameValueCollection)ConfigurationSettings.GetConfig("altDB"))["DbConn"];

        public database()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        private DataSet db(string query)
        {
            DataSet data = new DataSet();
            MySqlDataAdapter da = new MySqlDataAdapter(query, strConn);
            MySqlCommandBuilder cb = new MySqlCommandBuilder(da);
            da.Fill(data);
            return data;
        }

        public DataSet db_getCountries()
        {
            return db("SELECT id, name FROM country ORDER BY name ASC;");
        }
    }
}

Du kan ange valfritt namespace, jag döper det till funcs bara för att jag även har en fil som heter functions i min App_Code-mapp som innehåller en class full med användbara funktioner för mitt projekt. Så för att komma åt dessa båda classer skriver jag bara in detta using-direktiv på de CodeBehind-filer som behöver komma åt dem:

using funcs;

Med det får jag tillgång till både mina funktioner och allt som hör min databas till.

Men, åter till database.cs en snabbis. Som ni ser har jag ingen kod i konstruktorn. Jag har dock två små metoder där. Den första heter db och tar in en SQL-sträng. Den har jag skapat enbart för att slippa så mycket kodupprepning. Jag skapar alltså bara en mängd metoder som skriver ihop en SQL-sats och sen skickar in den i metoden db som returnerar ett DataSet jag kan leka med i koden på den sida jag jobbar i.

Ni kanske även såg att i början av classen sätts den globala variabeln strConn genom att läsa av min web.config. Jag har alltså hela min connectionsstring i min web.config genom att lägga till denna rad inom configuration-taggen:

<altDB>
    <add key="DbConn" value="server=[SERVER];uid=[USER];pwd=[PASS];database=[DATABASE];Allow Zero Datetime=true;"/>
</altDB>

Och inom configuration > ConfigSections-taggen skriver du in detta:

<section name="altDB" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral,PublicKeyToken=b77a5c561934e089, Custom=null"/>

Med detta så kan jag med koden jag tidigare pratat om få fram mina databasinställningar. ”altDB” och ”DbConn” är helt godtyckliga namn, fria för dig att sätta. Ett extra steg måste dock göras i alla filer som ska läsa av inställningar från web.config (i detta fall är det enbart vår databas-class), och det är att lägga till följande using-direktiv i class-filen.

using System.Configuration;
using System.Collections.Specialized;

Så, nu kan du på riktigt bara köra. För att anropa metoden db_getCountries i din databas-class från en annan CodeBehind-fil så gör man bara en instansiering av objektet. Först ska du så klart ladda in klassen med using funcs (det namespace du satt i class-filen). Jag deklarerar sen globalt klassen jag ska jobba med.

database myDB = new database();

I och med att du kör in hela namespace:et med using-direktivet så har den läst in alla classer du har i din App_Code-mapp som ingår i just det namespacet, vilket vår class database gör. Nu kan du med klassinstansen myDB komma åt alla metoderna. Såhär kan jag till exempel göra i min Default.aspx.cs:

ddlCountries.DataSource = myDB. db_getCountries();
ddlCountries.DataBind();

dllCountries är då en DropDownList som binder id till value, och name till text. Se här min aspx-kod:

<asp:DropDownList ID="ddlCountries" runat="server" DataValueField="id" DataTextField="name" />

C#-koden strax innan ligger i min sidas Page_Load-metod så att den anropas direkt sidan startas. Nu behöver jag bara köra min kod så fylls min droplista med allt innehåll från tabellen country. Och som du ser kan man nu rätt lätt bygga på med fler metoder i sin databas-class, och lätt använda den på valfria sidor. Och då vi nu programmerat i olika skikt så har du bara ett ställe att administrera dina SQL:er på.

Hoppas detta fick igång dig lite med MySQL + ASP.NET i C#. Det kommer fler tips senare, bland annat för att hantera dina DataSet direkt i koden, hur man gör INSERT, hur man kör multipla SQL:er. Mycket gott blir det!





Hej

14 11 2009

Natten till fredag den 13:e denna månad sov jag ingenting nästa. Bara massa idéer. En av idéerna var att starta upp mitt bloggande om webbutveckling igen och dela med mig av över 14 års erfarenhet.

Här kommer ni kunna läsa om HTML, XHTML, CSS, CSS-hack, Explorer-problem, webbdesign, Photoshop, klassisk ASP, ASP.NET, ASP.NET MVC, MySQL, SQL Server, W3C, standarder, och mycket annat. Det kommer dels vara upplagt i form av lösningar på mina egna problem som jag berättar om, men även i form av grundläggande och avancerade kurser samt introduktioner.

Stay tuned!








Följ

Få meddelanden om nya inlägg via e-post.