Bygg en egen DLL med c#
Förord
Den här artikeln kommer att visa hur du med hjälp av VS.NET Beta 2 kan skapa en DLL som sköter alla kommunikation med databasen. Vi kommer att använda VS.NET Beta 2 och C# samt en Access-databas.Innehåll
»»
Först får vi börja med att skapa ett nytt projekt i VS.NET. Starta VS och välj File -> New -> Project (Om du inte har VS.NET kan du använda en vanlig texteditor och därefter kompilera manuellt). Då kommer följande bild att visa sig:
Klicka på Visual C# Projects och välj därefter Class Library. Tryck OK. Visual Studio skapar nu de nödvändiga filerna. Nu är det snart dags att börja koda. Men vad ska vår dll innehålla? Den ska kunna hämta, ändra, ta bort och uppdatera databasen. När man hämtar data kan man ibland behöva arbeta med ett DataSet innan man binder den till en kontroll medans man ibland genast binder datan. Det finns alltså två olika fall vi måste ta hänsyn till. Därför är det en god ide att överlagra metoden för hämtning av data. Hur ska vi då hantera ändring och borttagning av data? Varken UPDATE eller DELETE returnerar någon data. I och med det behöver vår sista metod bara kunna köra en SQL-fråga.
Efter den första planeringen är det nu dags att börja koda. Vi börjar med att inkludera de Namespaces vi kommer att behöva. Som du ser är endast System inkluderad. Vi kommer däremot även att behöva System.Data och System.Data.OleDb.
Nu börjar det ta form. Nu har vi inkluderat det vi kommer att behöva och kodat den första metoden. Sökvägen i connectionString är deklarerad som konst så att den inte kan ändras. Se till så att den stämmer överens med sökvägen till databasen. Metoden getRecords tar, som du ser, tre argument. Först ett DataSet därefter en SQL-sträng(ex. SELECT * FROM Tabell). Slutligen har vi en sträng som innehåller namnet på den nya tabellen som hamnar i DataSetet. Metoden är deklarerad som void vilket innebär att den inte ska returnerna något. Hur kan det fungera? Metoden ska ju hämta data och sedan skicka tillbaka den. Det vore ju naturligare att exempelvis skicka en referens. Faktum är att det fungerar lika bra med referens anrop. Varför det här sättet fungerar är jag inte helt säker på. Jag använder det dock därför att anropet av metoden blir lättare eftersom man inte behöver komma ihåg att ha med ref.
Efter parameterlistan skapas en databasanslutning och en DataAdapter. DataAdaptern har till uppgift att hämta data från databasen och lägga den i ett DataSet.
Nu är vår första metod klar. Den andra metoden ska vara en överlagrad version av onvanstående metod. Skillnaden är att den ska returnera data som den hämtar. Den kan kodas så här:
För att returnera ett DataSet deklarerar man metoden som DataView. Förutom det är koden väldigt lik den för den andra metoden. Nu har vi bara en metod kvar att koda. Den kan vi göra så här:
Som du ser är koden för den här metoden lik den för de andra metoderna. Kommandot 'myCommand.ExecuteNonQuery()' används när man kör en SQL-fråga som inte returnerar några poster.
Nu är vi klara med alla metoder, nu återstår bara att kompilera och testköra. För att kompilera koden behöver du endast trycka på F5. Har du inte VS.NET får du öppna en Dos-prompt och sedan, i mappen där källkodsfilen finns, skriva 'csc /r:System.dll /r:System.Data.dll /t:library /out:DatabaseDLL.dll Filnamn.cs'. Förhoppningsvis kompileras koden utan några fel. Nu ska vi äntligen testa den. För att göra skapar vi en ASP.Net sida som kan se ut så här:
Notera raden <%@ Import Namespace= "DatabaseUtilities" %>. Den gör vår dll tillgänglig på ASP.Net sidan. Därefter skapar vi en ny instans av vår klass. Kom ihåg att det är namespace-namnet man använder för att inkludera DLL:en men att det är klassnamnet man använder för att skapa en ny instans.
Skapa nu en ny katalog som du kommer åt ifrån din webserver. Vi kan kalla den mappen testdll. Skapa därefter en underkatalog till den som heter 'bin' och lägg där den kompilerade dll:en. 'bin'-katalogen är den plats som automatiskt söks igenom efter dll:er.
Innan du startar din webläsare så ändra på webservern så att den katalog som innehåller ASP.Net-filen blir rot-katalogen (ex http://localhost/testdll.aspx ). Om du inte vill ändra på din webserver så kan du skapa bin-katalogen i webserverns rot-katalog. Om man inte gör detta hittar ASP.Net-sidan ibland inte dll:en. Starta nu din webläsare och gå till ASP.Net-sidan. Förhoppningsvis ser du något liknande det här:
Vår dll saknar fortfarande vissa funktioner som exempelvis felhantering. Men det kan man lätt ordna. Förhoppningsvis har du i alla fall fått en idé om hur man skapar kompilerade dll:er med hjälp av C# och ASP.Net. Lycka till!
Fil: dllex.zip
För att jag skall veta om kursen är bra eller om den måste skrivas om så rösta gärna här uppe till höger. Skicka gärna ett iMail om du vill kommentera något som är felaktigt eller du tycker borde förtydligas.
/André Isaksson
Klicka på Visual C# Projects och välj därefter Class Library. Tryck OK. Visual Studio skapar nu de nödvändiga filerna. Nu är det snart dags att börja koda. Men vad ska vår dll innehålla? Den ska kunna hämta, ändra, ta bort och uppdatera databasen. När man hämtar data kan man ibland behöva arbeta med ett DataSet innan man binder den till en kontroll medans man ibland genast binder datan. Det finns alltså två olika fall vi måste ta hänsyn till. Därför är det en god ide att överlagra metoden för hämtning av data. Hur ska vi då hantera ändring och borttagning av data? Varken UPDATE eller DELETE returnerar någon data. I och med det behöver vår sista metod bara kunna köra en SQL-fråga.
Efter den första planeringen är det nu dags att börja koda. Vi börjar med att inkludera de Namespaces vi kommer att behöva. Som du ser är endast System inkluderad. Vi kommer däremot även att behöva System.Data och System.Data.OleDb.
using System;
using System.Data;
using System.Data.OleDb;
namespace DatabaseUtilities
{
public class Database
{
const string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\inetpub\\wwwroot\\db\\db.mdb";
public void getRecords(DataSet ds,string Sql,string DataTableName)
{
OleDbConnection myConnection = new OleDbConnection(@connectionString);
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(Sql,myConnection);
adapter.Fill(ds,DataTableName);
}
}
}
Nu börjar det ta form. Nu har vi inkluderat det vi kommer att behöva och kodat den första metoden. Sökvägen i connectionString är deklarerad som konst så att den inte kan ändras. Se till så att den stämmer överens med sökvägen till databasen. Metoden getRecords tar, som du ser, tre argument. Först ett DataSet därefter en SQL-sträng(ex. SELECT * FROM Tabell). Slutligen har vi en sträng som innehåller namnet på den nya tabellen som hamnar i DataSetet. Metoden är deklarerad som void vilket innebär att den inte ska returnerna något. Hur kan det fungera? Metoden ska ju hämta data och sedan skicka tillbaka den. Det vore ju naturligare att exempelvis skicka en referens. Faktum är att det fungerar lika bra med referens anrop. Varför det här sättet fungerar är jag inte helt säker på. Jag använder det dock därför att anropet av metoden blir lättare eftersom man inte behöver komma ihåg att ha med ref.
Efter parameterlistan skapas en databasanslutning och en DataAdapter. DataAdaptern har till uppgift att hämta data från databasen och lägga den i ett DataSet.
Nu är vår första metod klar. Den andra metoden ska vara en överlagrad version av onvanstående metod. Skillnaden är att den ska returnera data som den hämtar. Den kan kodas så här:
public DataView getRecords(string Sql,string DataTableName)
{
OleDbConnection myConnection = new OleDbConnection(@connectionString);
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(Sql,myConnection);
adapter.Fill(ds,DataTableName);
DataSet ds = new DataSet();
adapter.Fill(ds,DataTableName);
return ds.Tables[DataTableName].DefaultView;
}
För att returnera ett DataSet deklarerar man metoden som DataView. Förutom det är koden väldigt lik den för den andra metoden. Nu har vi bara en metod kvar att koda. Den kan vi göra så här:
public void executeQuery(string Sql)
{
OleDbConnection myConnection = new OleDbConnection(connectionString);
OleDbCommand myCommand = new OleDbCommand(Sql,myConnection);
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
}
Som du ser är koden för den här metoden lik den för de andra metoderna. Kommandot 'myCommand.ExecuteNonQuery()' används när man kör en SQL-fråga som inte returnerar några poster.
Nu är vi klara med alla metoder, nu återstår bara att kompilera och testköra. För att kompilera koden behöver du endast trycka på F5. Har du inte VS.NET får du öppna en Dos-prompt och sedan, i mappen där källkodsfilen finns, skriva 'csc /r:System.dll /r:System.Data.dll /t:library /out:DatabaseDLL.dll Filnamn.cs'. Förhoppningsvis kompileras koden utan några fel. Nu ska vi äntligen testa den. För att göra skapar vi en ASP.Net sida som kan se ut så här:
<%@ Import Namespace="DatabaseUtilities" %>
<script language="c#" runat="server">
void Page_Load(Object sender,EventArgs e)
{
DataBind();
}
void DataBind()
{
Database db = new Database();
DG.DataSource = db.getRecords("SELECT * FROM test","Test");
DG.DataBind();
}
void updateDB(Object sender,EventArgs e)
{
Database db = new Database();
db.executeQuery("INSERT INTO test (info,pris) VALUES ('"+info.Text+"',"+pris.Text+")");
DataBind();
}
</script>
Notera raden <%@ Import Namespace= "DatabaseUtilities" %>. Den gör vår dll tillgänglig på ASP.Net sidan. Därefter skapar vi en ny instans av vår klass. Kom ihåg att det är namespace-namnet man använder för att inkludera DLL:en men att det är klassnamnet man använder för att skapa en ny instans.
Skapa nu en ny katalog som du kommer åt ifrån din webserver. Vi kan kalla den mappen testdll. Skapa därefter en underkatalog till den som heter 'bin' och lägg där den kompilerade dll:en. 'bin'-katalogen är den plats som automatiskt söks igenom efter dll:er.
Innan du startar din webläsare så ändra på webservern så att den katalog som innehåller ASP.Net-filen blir rot-katalogen (ex http://localhost/testdll.aspx ). Om du inte vill ändra på din webserver så kan du skapa bin-katalogen i webserverns rot-katalog. Om man inte gör detta hittar ASP.Net-sidan ibland inte dll:en. Starta nu din webläsare och gå till ASP.Net-sidan. Förhoppningsvis ser du något liknande det här:
Vår dll saknar fortfarande vissa funktioner som exempelvis felhantering. Men det kan man lätt ordna. Förhoppningsvis har du i alla fall fått en idé om hur man skapar kompilerade dll:er med hjälp av C# och ASP.Net. Lycka till!
Exempelfil att ladda ner
Fil: dllex.zip
Avslutningsvis
För att jag skall veta om kursen är bra eller om den måste skrivas om så rösta gärna här uppe till höger. Skicka gärna ett iMail om du vill kommentera något som är felaktigt eller du tycker borde förtydligas./André Isaksson
0 Kommentarer