Eenvoudig database queries maken in ASP.NET
Door Tim Musschoot
2 april 2002
Iedereen die gebruik maakt van ADO.NET heeft ongetwijfeld gemerkt dat de verschillende methoden van
database manipulatie een stuk overzichtelijker zijn geworden in vergelijking tot ASP. Om vlot met databases
te kunnen werken hebt u toch nog steeds kennis nodig van:
- Een programmeertaal (VB.NET, C#,…)
- SQL
In dit artikel wordt geen tutorial betreffende programmeren gegeven. Hierover kunt u genoeg artikelen vinden
op het net. Het is wel de bedoeling om een gebrekkige kennis van SQL, dé database manipulatietaal, als obstakel
uit de weg te ruimen om een database-driven webapplicatie uit te bouwen.
Wanneer u gegevens uit een database wenst op te halen of naar de database wenst te schrijven gebeurt dit meestal in de
vorm van een SQL-Query. De meest voorkomende queries zijn:
- SELECT queries om gegevens op te halen
- INSERT queries om gegevens op te slaan
- UPDATE queries om gegevens aan te passen
- DELETE queries om gegevens te wissen
Omdat de syntax van SELECT en DELETE queries relatief eenvoudig is wordt deze hier enkel kort weergegeven. Straks gaan we
in op de resterende types.
Gegevens opvragen gebeurt a.h.v. een SELECT query. De meest eenvoudige syntax van deze query is:
SELECT <fieldnames> FROM <tablenames> WHERE <conditions>
Indien u veel velden tegelijk wenst op te vragen kunt u van de ‘*’-wildcard gebruik maken om het typwerk te verminderen.
Gegevens verwijderen gebeurt met volgende query:
DELETE FROM <table> WHERE <condition>
Het aanmaken van INSERT en UPDATE queries is een stuk ingewikkelder. Hoewel ingewikkelder misschien niet echt goed gekozen is, is iedereen
het er ongetwijfeld over eens dat ze heel wat meer werk vragen om op te bouwen, vooral als er veel velden aangepast moeten worden. De reden
hiervoor is dat men ieder veld apart dient te vermelden in de query. De algemene syntax voor een INSERT en een UPDATE query is:
INSERT INTO <tablename> (field1, field2, …) VALUES (value1,value2,…)
En
UPDATE <tablename> SET field1=value1, field2=value2, … WHERE <condition>
Omdat er verschillende types velden zijn (datum, tekst, nummeriek, …) die verschillende vormen kunnen aannemen bij verschillende database types
(Access, SQL-Server) is het maken van syntactisch correcte queries vaak een tijdrovende bezigheid. Dit geldt des te meer als er veel velden mee
gemoeid zijn. Indien u meer basiskennis betreffende SQL wenst op te doen verwijs ik u door naar http://www.sqlcourse.com.
Om dit probleem te vermijden werd de QueryBuilder Class ontworpen. Hier worden de velden en hun waarden gestructureerd bewaard en kunt u automatisch
de INSERT en UPDATE queries genereren. Dit gebeurt onafhankelijk van het gebruikte database model (MS Access of SQL-Server). Hier is de code.
public class QBuilder
{
private int Sz = 0;
private String[] Fields;
private String[] Values;
private int Type;
public QBuilder()
{
Sz = 0;
Fields = new String[60];
Values = new String[60];
Type = 0;
}
public QBuilder(int Val)
{
Sz = 0;
Fields = new String[60];
Values = new String[60];
if (Val == 1) Type = 1;
else Type = 0;
}
public void AddNumberField(String Fld,int Value)
{
Fields[Sz] = Fld.ToString();
Values[Sz++] = Value.ToString();
}
public void AddTextField(String Fld,String Value)
{
Fields[Sz] = Fld.ToString();
Values[Sz++] = ("'" + Value.ToString().Replace("'","''")+"'");
}
public void AddDateField(String Fld,System.DateTime Date)
{
if (Type == 0)
{
Fields[Sz] = Fld.ToString();
Values[Sz++] = ("#" + Date.Month + "-" + Date.Day + "-" +
Date.Year + "#");
}
else
{
Fields[Sz] = Fld.ToString();
Values[Sz++] = ("'" + Date.Month + "/" + Date.Day + "/" +
Date.Year + "'");
}
}
public void AddBoolField(String Fld, bool Value)
{
if (this.Type == 0)
{
Fields[Sz] = Fld.ToString();
if (Value == true)
Values[Sz++] = "true";
else
Values[Sz++] = "false";
}
else
{
Fields[Sz] = Fld.ToString();
if (Value == true)
Values[Sz++] = "1";
else
Values[Sz++] = "0";
}
}
public int GetSize()
{
return Sz;
}
public String GetInsertString(String Table)
{
String Str = "insert into " + Table + " (";
for (int I = 0; I<Sz; I++)
{
Str += Fields[I].ToString();
if (I < (Sz-1)) Str += ", ";
}
Str += ") values (";
for (int I = 0; I<Sz; I++)
{
Str += Values[I].ToString();
if (I < (Sz-1)) Str += ", ";
}
Str += ")";
return Str;
}
public String GetEditString(String Table,String Fld,int Val)
{
String Str = "";
Str = "UPDATE " + Table + " set ";
for (int I = 0; I<Sz; I++)
{
Str += (Fields[I] + " = " + Values[I]);
if (I < (Sz-1)) Str += ", ";
}
Str += (" WHERE " + Fld + " = " + Val.ToString());
return Str;
}
public String GetEditString(String Table,String Fld,String Val)
{
String Str = "";
Str = "UPDATE " + Table + " set ";
for (int I = 0; I<Sz; I++)
{
Str += (Fields[I] + " = " + Values[I]);
if (I < (Sz-1)) Str += ", ";
}
Str += (" WHERE " + Fld + " = '" + Val + "'");
return Str;
}
}
De klasse heeft twee verschillende constructors:
- public QBuilder(int Val)
- public QBuilder()
Dit onderscheid is nodig omdat de klasse met verschillende types databases bruikbaar is.
Wat het nut hiervan is wordt onmiddellijk duidelijk wanneer u de representatie van een datum bekijkt
in SQL voor MS Access en T-SQL dat bij SQL-Server gebruikt wordt. Indien u geen parameter meegeeft
aan de constructor of de parameter gelijk is aan 0, dan worden de queries voor MS Access gegenereerd.
Indien de parameter 1 is, zal een query voor SQL-Server gegenereerd worden.
Vervolgens is het de bedoeling de gewenste velden in te klasse te steken. Dit gebeurt door volgende functies
op te roepen:
- public void AddNumberField(String Fld,int Value)
- public void AddTextField(String Fld,String Value)
- public void AddDateField(String Fld,System.DateTime Date)
- public void AddBoolField(String Fld, bool Value)
De betekenis van deze functies spreekt voor zich. Deze functies vormen slechts een basis. U kunt onbeperkt uw eigen functies toevoegen. (vb: AddDecimalField, …)
Belangrijk om weten is dat in de functies alle specifieke zaken betreffende veldeigenschappen worden afgehandeld. Een TextField dat een enkel ‘-teken bevat zal omgezet worden naar een veld waar alle desbetreffende tekens verdubbeld zijn, een datum onder MS Access zal onder de #mm-dd-yyyy# worden opgeslagen, etc. U hoeft enkel de primaire datatypes mee te geven met de functieoproep.
Als u eenmaal alle parameters voor de query hebt ingegeven kunt u twee verschillende queries genereren:
- public String GetInsertString(String Table)
- public String GetEditString(String Table,String Fld,String Val)
- public String GetEditString(String Table,String Fld,int Val)
Bij de eerste functie GetInsertString(String Table) zal een INSERT statement worden gegenereerd.
Het argument Table is de naam van de tabel waarin de ingegeven velden moeten opgeslagen worden.
De tweede functie zal een UPDATE query genereren. Het argument Table is opnieuw de tabel
waarin de gegevens staan. De twee volgende argumenten duiden het referentieveld en de bijhorende
voorwaarde aan. Dit duidt aan waar de update moet doorgevoerd worden. Vertaald in SQL termen komt
dit neer op WHERE Fld = Val.
Tot slot van dit artikel nog even terugkomen op de beperkingen van de klasse.
Wanneer u de code bekijkt ziet u dat er ruimte is gemaakt voor 60 velden.
Als u meer velden in uw query wenst kunt u dit aantal aanpassen. De member functies
betreffende ingave van velden en waarden zijn beperkt tot de meest basic routines.
Verdere uitbreidingen dient u zelf te maken.
copyright 2002 Tim Musschoot
|