Welkom op het developersblog van 4DotNet
Op dit developersblog zullen onze eigen ontwikkelaars hun praktijkervaringen en andere inseressante onderwerpen plaatsen.

Archief van 'SQL'

Rene Kapitein

Autonummer resetten

Laatst was ik bezig met een database conversie in Microsoft SQL Server 2005. Ik had een script gemaakt om de data vanuit een bron database over te zetten naar een doel database. Bij een nieuwe database vind ik het mooi als een kolom met autonummering netjes met een 1 begint. Hier is een handig statement voor: dbcc checkindent. Om een tabel opnieuw te nummeren, kun je de onderstaande code uitvoeren.

DELETE tblActie
DBCC CHECKIDENT('tblActie', RESEED, 0)
Rene Kapitein

Werken tijdens de feestdagen

Twee vragen, één oplossing

De afgelopen weken kreeg ik van twee verschillende klanten een vrijwel identieke vraag. De ene klant wilde een uitbreiding in een bestaand programma om bij een bepaalde datum de eerstvolgende werkdag te bepalen. De andere wilde in een document een datum afdrukken waarop uiterlijk gereageerd kan worden. Voor deze datum geldt als regel dat men 20 dagen de tijd krijgt om te reageren. Als oplossing voor beide vragen heb ik een SQL functie gebruikt.


Lees verder…

Rene Kapitein

Heeft DTS de X-factor?

Bij DTS zullen de meeste lezers aan het volgende bedrijf denken: DTS Meppel. Dat is natuurlijk prima, niets mis mee. Ik vermoed echter dat er ook lezers zijn die de afkorting DTS kennen vanuit SQL Server. DTS staat dan voor Data Transformation Services.  Over die DTS gaat het hier. In de Enterprice Manager van SQL Server 2000 heb je de mogelijkheid om een DTS package te maken.  Vanaf SQL Server 2005 is DTS in mijn ogen volwassener geworden.  De DTS functionaliteit zit echter wel een beetje verstopt en is verweven met Visual Studio. Deze integratie kom je ook tegen in de naamgeving SSIS (SQL Server Integration Service).  Onder deze afkorting kun je op Internet meer voorbeelden vinden.

Een probleem waar jullie natuurlijk zelf nooit tegenaan lopen maar andere ontwikkelaars wel, is dat het soms lastig is om een oude applicatie die je ooit hebt geschreven na een paar maanden / jaren nog te begrijpen. Om nog maar te zwijgen over de ellende die je tegenkomt wanneer je hele lappen code van een collega moet bestuderen.  Met DTS heb je de mogelijkheid om op een gestructureerde manier een proces samen te stellen.  In plaats van een hele brij code is het meer een kwestie van componenten bij elkaar slepen en hierbij de juiste properties in te stellen.

Ok, tijd voor een voorbeeld:


Lees verder…

Rene Kapitein

Dynamische SQL

Voor een uitbreiding van een website bij mijn opdrachtgever kreeg ik laatst het verzoek om een stored procedure te maken waarmee je documenten uit een database kunt vinden. Als zoekcriterium kun je hiervoor oa. een aantal woorden invullen dat binnen de tekst moet voorkomen. Voor deze stored procedure heb ik dynamisch SQL gebruikt.  Dynamisch heeft hier de betekenis dat je de query runtime opbouwt en dan pas uitvoert. Deze techniek zul je niet vaak gebruiken, omdat juist de kracht van stored procedures is dat deze vooraf gecompileerd zijn en daardoor snel het gewenste resultaat opleveren. Ook zul je hierbij bewust moeten zijn van het gevaar van SQL injection. Bij deze opdracht heb ik toch voor dynamische SQL gekozen, omdat het aantal zoekwoorden kan variëren van 0 tot meer dan 10.

De totale stored procedure (SP) is te lang om hier in z’n geheel weer te geven. Dit verhaal zou dan ook voor sommigen saai en langdradig worden en dat is nu net wat je niet verwacht bij een artikel met ‘Dynamisch’ in de titel. Om de vaart erin te houden, wil ik in dit blog daarom de belangrijkste onderdelen even kort benoemen.  Wie weet helpt het iemand op weg die ook met dynamisch SQL wil werken. Ik ben overigens best benieuwd naar andere voorbeelden van geschikte toepassingen van deze techniek.


Lees verder…

Rene Kapitein

Tussenvoegsels

    Tussenvoegsels, niet iedereen heeft ze in zijn naam maar als je bijvoorbeeld De Boer, Van der Vaart of Van ‘t Schip heet, dan weet je waar we het over hebben. Het komt geregeld voor dat je met een SQL query een oplijsting moet maken waarin je de volledige naam wilt tonen. In een database zijn de tussenvoegsels vaak in een apart veld (kolom) opgeslagen. Een veelgebruikte oplossing is dan om eerst de achternaam weer te geven, dan een komma, gevolgd door de voornaam / voorletters en ten slotte de tussenvoegsels.

    Dit geeft dan:

    Boer, R. de

    Vaart,  R. van der

    Bergkamp, D.

    Schip, J. van ‘t

    Op zich een goede manier om namen weer te geven,  maar soms wil je liever de namen op een normale manier tonen.

    R. de Boer

    R. van der Vaart

    D. Bergkamp

    J. van ‘t Schip


    Met onderstaande selectie kun je de naam van een persoon op een normale manier weergeven, zonder overbodige spaties.

SELECT voetballer = LTRIM(RTRIM(ISNULL(voorletters, '') + ' '
                  + ISNULL(tussenvoegsels, '')) + ' '
                  + ISNULL(naam,'') )
FROM tblspeler
Andre Mussche

Een aantal zaken mbt Delphi (Win32 + Prism):

  • RemObjects heeft hun open source repository uitgebreid metDelpi Prism Templates en Delphi Prism Aspects .
    Op moment van schrijven zitten er alleen een Monoobj Template en een ASP.Net MVC Template en een CheckDisposedAttribute Aspect .
    De bedoeling is dat dit natuurlijk uitgebreid wordt, en iedereen wordt aangemoedigd om mee te helpen!
  • Ik had in mijn vorige blog al even Plastic SCM genoemd. Er is een interessant blog van de makers verschenen over het blame commando: hiermee kun je opvragen welke regel door wie of in welke branch aangepast is!
  • Verder kun je Plastic SCM koppelen dmv triggers met bijvoorbeeld CruiseControl, voor Contineous Integration .
  • Momenteel ben ik aan het oriënteren voor een nieuwe data object structuur bij mijn huidige opdrachtgever. Dit omdat in de toekomst waarschijnlijk meer met .Net gedaan gaat worden (Delphi 2007 + Delphi Prism?). Dan vervalt sowieso de huidige (en oude) structuur. Dus als iemand ideeën of tips heeft, graag! (het liefst voor zowel Delphi als .Net te gebruiken ipv 2 verschillende).
  • Een interessante kandidaat is Hitsoft SQL Object Library (HitSQLe): een soort LINQ voor Delphi Win32! Uiteraard niet 100% compatible maar toch heel uitbreid en krachtig. Zo hoef je oa niet druk te maken over Oracle of SQL Server commando’s, en het heeft een ingebouwde connection pool. O ja, en het is nog open source ook!
  • Een ander alternatief is Data Abstract van RemObjects . Hiermee kan namelijk eenvoudig multi-tier systemen mee gebouwd worden. Ik heb al eens een Proof Of Concept gemaakt voor multi-tier, boven op het RemObjects Remoting Framework (wat wat we al voor messaging en onderlinge service communicatie gebruiken). Maar Data Abstact werkt ook boven op dezelfde SDK, en het is idem database onafhankelijk (het gebruikt oa Schema Modeler ). Ook interessant dus :-) .
  • Momenteel ben ik bezig met het opfrissen van de GUI. Oa met de nieuwe versie van de VCL Components van TMS (ze hebben ook .Net componenten). Hiermee kan bijvoorbeeld eenvoudig een “Office 2007 Blue” look verkregen worden, maar je kunt ook zelf de kleuren schema’s aanpassen. Zo moet straks een groene Greenax look verkregen worden ivm de integratie hiermee.
  • Verder heeft TMS mooie “Smooth” componenten! Deze maakt gebruik van de videokaart voor de 3D effecten.
  • Naast de TMS componenten, wordt nu ook gebruik gemaakt van de mooi iconen van GlyphLab. Dit is een hele uitgebreide set, inclusief originele gelayerde PhotoShop bestanden, zodat je zelf eenvoudig aanpassingen en combinaties kunt maken! En $200 is dan niet duur! Een verademing in vergelijking met de ouderwetse Delphi 3 iconen… Het leuke van het aanpassen van GUI is dat in principe de werking gelijk blijft, maar het toont gelijk een heel stuk beter!
  • Nog meer wat betreft de GUI? Ja, want GUI testen is nogal lastig. Hopelijk gaat OpenCTF mij hierbij helpen. Dit is een uitbreiding op DUnit, waarmee ik al bezig geweest ben voor een POC voor integratie testen.

Nog wat leuke informatie mbt .Net algemeen:

  • Het Mono project heeft een aantal uitbreidingen gemaakt voor .Net. 1 ervan is Mono.Simd. Hiermee kan eenvoudig en snel met vectoren gewerkt worden, die door de Mono compiler omgezet wordt in SSE /SIMD instructies voor de CPU. Dit is stukken sneller dan normale CPU instructies. Mono.Simd is compatible met het Microsoft .Net framework, alleen maakt deze compiler er normale CPU instructies van, dus vele malen trager (maar het is wel compatible). Het is vooral bedoel voor games, omdat deze veel gebruik maken van vectoren.
  • Een specifiekere uitbreiding is ondersteuning voor Microthreads (of Continuations). Vooral bedoeld voor games, maar kan ook goed gebruikt worden voor afhandeling van veel (kleine) netwerk connecties. Microthreads draaien in 1 thread, waarbij bijvoorbeeld de status van een functie opgeslagen kan worden (CPU registers, stack, etc), zodat deze later weer “resumed” kan worden. Het gaat te ver om het helemaal uit te leggen, lees het blog zelf maar :-) . Maar een voorbeeld is wel handig:

prince.WaitForObjectVisible (princess);
prince.WalkTo (princess);
prince.Kiss (princess);

Rene Kapitein

een Update statement met een Inner Join

Een update statement in SQL Server. Ik kom ze bijna dagelijks tegen. Meestal is de syntax erg eenvoudig. Soms is de where clause wat uitgebreider, wanneer de update afhankelijk is van de inhoud van een andere tabel. Hieronder een voorbeeld van een update query zoals ik ze tot nu toe meestal maakte.

UPDATE MetaLoginMenu

SET Positie = 20

WHERE MetaMenuID =

(

SELECT MetaMenuID

FROM MetaMenu

WHERE MenuNaam = ‘mnuAbout’

)

AND MetaLoginID = 3

In dit voorbeeld gaat het nog om slechts twee tabellen. In de praktijk kunnen dit er al snel meer zijn, waardoor de where clause wat onoverzichtelijk wordt.  Een constructie met een inner join kan dan uitkomst bieden.

UPDATE L

SET Positie = 20

FROM MetaLoginMenu L INNER JOIN

Metamenu M ON L.MetaMenuID = M.MetaMenuID

AND MenuNaam = ‘mnuAbout’

AND MetaLoginID = 3

De onderste variant lijkt op het eerste gezicht wat vreemd: er staat geen where in de query! Toch is het resultaat van beide queries identiek. Qua performance is er amper verschil merkbaar. Bij een meer uitgebreide update kies ik de laatste tijd steeds vaker voor de onderste variant.

Rene Kapitein

Conversie van Oracle naar SQL Server

Bij mijn huidige opdrachtgever zijn veel relatief kleine applicaties gemaakt met Visual Basic 6. Het beleid is erop gericht dit terug te brengen tot een aantal grote applicaties. Toch komt het nog wel eens voor dat de mensen op de werkvloer een oude applicatie missen en bepaalde gegevens willen raadplegen. Vorige week kreeg ik de opdracht om in korte tijd de applicatie DEKKINGSBOEKEN weer terug te zetten. In het verleden maakte deze applicatie gebruik van een Oracle database. De server waar dit op draaide is inmiddels historie. Van de data had men nog wel een back-up naar SQL Server gemaakt. Kwestie van connectiestring aanpassen dachten we in eerste instantie. De klus bleek toch iets omvangrijker dan dat: de VB code bevatte een groot aantal SQL statements met een specifiek Oracle dialect. Dit laten staan was geen optie: daar zou het programma op stuk lopen.
Lees verder…

De laatste tijd gebruik ik regelmatig het tooltje SQL Digger om te zoeken naar tekst in Views, Stored Procedures, etc. in een SQL Server database. Zo kun je bijvoorbeeld snel kijken of er een view/procedure bestaat die je kunt gebruiken voor het ophalen van bepaalde gegevens.

Je kunt SQL Digger ook integreren in de .NET IDE en SQL Server Manager.

Website: SQL Digger

Andre Mussche

Oa voor unit testen wilde ik nested transacties gebruiken bij MS Sql Server 2005. Tot mijn verbazing is dit standaard niet mogelijk via ADO! Het is wel mogelijk via SQL, maar dan nogal omslachtig… Uiteindelijk is het me gelukt…

Je kunt namelijk handmatig transacties starten en committen via SQL met “BEGIN TRANSACTION” en “COMMIT TRANSACTION” statements. Dit kan ook nested, waarbij je transacties een naam kunt geven, bijv: “BEGIN TRANSACTION level1″.


Lees verder…