ASPNL logo (1 kb)
zaterdag 17 mei 2008




Microsoft MVP

.NET Codewise Community
<< vorige | overzicht | volgende >>

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

<< vorige | ^ naar boven | overzicht | volgende >>
copyright 2000-2007 ASPNL