Navigatie

Contact

Send mail to the author(s) E-mail

View Richard Soeteman's profile on LinkedIn

RSS 2.0 | Atom 1.0 | CDF

Archief

Categorieën

Blogroll

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

Sign In

Zoeken

# Tuesday, 19 December 2006
Tuesday, 19 December 2006 20:13:45 (GMT Standard Time, UTC+00:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Ik heb met tot afgelopen week vaak afgevraagd waarom ik ooit gebruik zou maken van CLR integratie in SQL Server 2005. Totdat ik een query zag waar een Regular Expression meer op zijn plaats was geweest. Regular Expressions kent T-SQL niet, maar middels CLR integratie is dit op te lossen.

In onderstaand voorbeeld is men vergeten emailadressen te valideren. Daardoor staan er foutief geformateerde emailadressen in de database. Middels het gebruik van een Regular Expression gaan we deze in de database opzoeken. Onderstaande afbeelding toont alle data in de contacts tabel.

Code

Onderstaande code bevat de functie IsValidEmailAdress. Deze functie wordt straks ook binnen SQL Server gebruikt om te controlleren of het een geldig emailadres betreft.  De code zelf maakt gebruik van een regular expression om te bepalen of het emailadres geldig is.

using System;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

public class DatabaseFunctions
{
    [SqlFunction( DataAccess = DataAccessKind.None , IsDeterministic=true) ]
    public static bool IsValidEmailAddress(string emailAddress)
    {
        Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
        return regex.IsMatch(emailAddress);
    }
}

Drie zaken die opvallen:

  1. We maken gebruik van de Microsoft.SqlServer.Server namespace. De Microsoft.SqlServer.Server bevat alle onderdelen die we nodig hebben voor CLR integratie. 
  2. We maken gebruik van het Attribuut SqlFunction. Aan dit attribuut geven we de volgende parameters mee :
    • DataAccess. Deze kan de waarde DataAccessKind.None, of DataAccessKind.Read bevatten. We voeren geen database acties uit, dus gebruiken we DataAccessKind.None 
    • IsDeterministic. Indien True wordt de output gecached op basis van de inputparameters en database state. We willen performance dus zetten we deze op true
  3. IsValidEmailAddress is static. Functies die binnen SQL Server worden gebruikt moeten static zijn.

Gebruik van de code in SQL Server

CLR integratie staat default uit. Middels onderstaande statements zetten we dit aan. Mocht je dit trouwens vergeten, geeft SQL Server zelf aan dat CLR integratie aangezet moet worden en ook hoe je dat moet doen.

EXEC sp_configure 'show advanced options' , '1';
go
reconfigure;
go
EXEC sp_configure 'clr enabled' , '1'
go
reconfigure;

Vervolgens registreren we onze Assembly.

CREATE ASSEMBLY CLRDatabaseFunctions FROM 'D:\CLRDatabaseFunctions.dll' WITH PERMISSION_SET = SAFE

We kunnen de functie IsValidEmailAddress niet direct aanroepen, daarom maken we gebruik van onderstaande functie(SQL) welke de CLR functie IsValidEmailAddress  wel aan kan roepen.

CREATE FUNCTION IsValidEmailAddress(@emailAddress nVarchar(255)) RETURNS bit
AS EXTERNAL NAME CLRDatabaseFunctions.DatabaseFunctions.IsValidEmailAddress

Nu kunnen we de foutieve emailadressen opvragen:

Select Contacts.* from Contacts WHERE  dbo.IsValidEmailAddress(Contacts.EmailAddress) = 0 

Dit geeft als resultaat het emailadres wat niet correct was ingevoerd.

 

Downloads en meer info

Via onderstaande links zijn de gebruikte voorbeelden te downloaden:

Verder kan je via onderstaande links meer informatie over dit onderwerp vinden:

Comments [0] | | # 
# Saturday, 11 November 2006
Saturday, 11 November 2006 08:33:13 (GMT Standard Time, UTC+00:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

TechEd zit er helaas alweer op. Deze week heb ik een hoop geleerd, een aantal nieuwe manieren geleerd om een bepaalde techniek toe te passen. Dus mijn overall indruk van dit evenement is goed. Wel hoorde ik van veel mensen die al eens eerder bij TechEd waren geweest dat deze TechEd tegenviel en dat de sfeer niet hetzelfde was als tevoren. Ik hoop het volgend jaar te kunnen vergelijken :-)

Comments [0] | | # 
# Thursday, 09 November 2006
Thursday, 09 November 2006 23:58:19 (GMT Standard Time, UTC+00:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Inmiddels is het al weer drie weken geleden dat Microsoft ASP.NET AJAX Beta 1 uitbracht. Op een project waaraan ik werk maken we gebruik van ASP.NET AJAX, toen heette het nog ATLAS. Na een Upgrade kregen we onderstaande foutmelding na een postback:

 

Na enige tijd speuren bleek dit te komen doordat we gebruik maakte van de ASP.NET Tracing functionaliteit, waarbij de output direct in de browser getoond werd. Van de week kreeg ik te horen dat ASP.NET AJAX Beta 2 uit was en heb deze direct geïnstalleerd om te kijken of dit was opgelost. Ik krijg nog steeds een foutmelding na een postback, maar ik kan nu wel in één oogopslag zien wat de foutmelding inhoud. 

Comments [0] | | # 
# Wednesday, 08 November 2006
Wednesday, 08 November 2006 19:20:22 (GMT Standard Time, UTC+00:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Vandaag zijn we bij de opname van .NET Rocks geweest, in de vorm van een panel discussie met Carl Franklin, Richard Campbell, Stephen Forte, Roy Osherove en Kate Gregory. Het onderwerp was Agile development en mede omdat ik al een geruime tijd volgens Agile methode werk vond ik deze aflevering zeer de moeite waard. Het einde van de show is echt hilarisch Roy Osherove pakt een paar oude melodien en maakt daar "Agile songs" van. Gewoon downloaden deze show dus. Hij is vanaf 21 novemer te downloaden via de .NET Rocks site.

De meeste personen uit dit panel hielden vandaag ook een sessie. Zo begon Roy Osherove vanochtend met een White Board sessie over Test Driven Development. Deze man is echt een guru op dat gebied. Hij vroeg aan de zaal wat men wilde weten van TDD en dat was de agenda.  

Stephen Forte en Richard Campbell hielden een sessie over T-SQL Querying: Tips and Techniques. Deze sessie was grappig en toch leerzaam. Helaas viel de sessie "10 Undiscovered Features of ASP.NET 2.0" een beetje tegen. De meeste features waren helemaal niet undiscovered. Volgens mij had ik al deze onderwerpen al eens langs zien komen op een MSDN event. 

Verder nog een Hands on  LAB over Windows Workflow gedaan.  Morgen alweer donderdag , je komt echt tijd te kort hier :-(

Comments [0] | | # 
Wednesday, 08 November 2006 06:25:42 (GMT Standard Time, UTC+00:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Teched Europe 2006 is begonnen. De keynote werd gegeven door Eric Rudder en werd vooraf gegaan door Simon Brown. Simon Brown had Arfa Karim, een Microsoft Certified Professional van 11 jaar uitgenodigd om een door haar ontwikkelde Calculator te tonen. Nadat Simon vroeg wat er nog aan de applicatie moest gebeuren en Arfa daar op antwoorde dat de applicatie nog gedocumenteerd moest worden hoorde je uit de zaal "She's a real developer".

Verder werden er nog een aantal mooie demo's getoond. Uiteraard een demo van WPF en ATLAS en het daarop volgende succes verhaal van Otto, waar mijn collega geen vertrouwen in had omdat Otto er 8 dagen voor nodig had om de prijs van een LCD TV aan te passen.

 

 

DEV230 Developing Rich Web Applications with ASP.NET AJAX

Dat sessies snel vol zitten was me direct duidelijk. Eigenlijk had ik naar de sessie "OFF202 Windows SharePoint Services v3 and Office SharePoint Servers 2007 as a Development Platform " willen gaan. Maar bij aankomst bleek deze al vol te zitten.  Daarom snel naar deze Sessie gegaan. Het was een hele aardige sessie gegeven door Shanku Niyogi. Omdat ik al aardig wat met ATLAS heb gedaan ben ik niet veel wijzer geworden van deze sessie. Wel ben ik er nu achter dat er voor JSON Serializatie is gekozen omdat SOAP te veel overhead met zich mee brengt. 

OFF001 DEMO: Designing and Implementing a Solution with SharePoint 2007, Windows Workflow Foundation and InfoPath 2007

Een van mijn doelen voor Teched is zoveel mogelijk te weten te komen over Sharepoint Development. De demo van  Mario Szpuszta leek me daarom goed om heen te gaan. De demo liet zien hoe je zeer gemakkelijk (in demo's gaat uiteraard alles vlekkeloos ;-)) een orderformulier met InfoPath in elkaar zet, workflow aan het formulier kan koppelen en deze middels sharepoint kan publiceren zodat iedereen met een browser een order kan plaatsen. Ik ben er na deze sessie nog meer bewust van geworden dat Sharepoint 2007 en Workflow erg  groot gaan worden volgend jaar. Ik kijk er al naar uit om een project met deze nieuwe technieken te gaan doen.

DEV223 LINQ Overview

Naar deze sessie van Anders Hejlsberg had ik al de hele dag uit gekeken. Afgelopen jaar had mijn collega al eens een sessie over LINQ gehouden. Daarna heb ik LINQ eigenlijk een beetje links laten liggen. Het is me duidelijk. Ik moet hier heel snel weer aandacht aan gaan besteden. Dit onderwerp wordt echt huge in .NET 3.0. Anders liet zien hoe gemakkelijk je met LINQ data kan opvragen,groeperen ,kan combineren met andere datasources en daar bijvoorbeeld weer een xml document van kan genereren en dit allemaal geintegreerd in VB.Net of C#  3.0.

Dev203 ADO.NET Present and Future

Naar deze demo door Jackie Goldstein had ik ook uitgekeken. Veel vernieuwende zaken heb ik niet gezien maar wel weer een aantal handige tips opgedaan. Zoals het afhandelen van concurrency conflicts. Wel vind ik dat een "Software Legend" in zijn demo's altijd gebruik moet maken van best practices, hetgeen Jackie niet deed. Zo werden bijvoorbeeld queries met  string concatenation opgebouwd.

Comments [1] | | # 
# Thursday, 02 November 2006
Thursday, 02 November 2006 07:18:49 (GMT Standard Time, UTC+00:00) ( ASP.NET )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Vorig jaar heb ik het al eens heel kort gehad over het vernieuwde compilatie en deployment model. Dit onderwerp is echter zeer uitgebreid. Rick Strahl heeft hier een zeer uitgebreid artikel over geschreven. Rick Strahl is tevens de maker van de tool die ik destijds genoemd had. Dit artikel is een must read.

Link naar het het artikel.

Comments [0] | | # 
# Tuesday, 31 October 2006
Tuesday, 31 October 2006 21:21:21 (GMT Standard Time, UTC+00:00) ( ASP.NET )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Inmiddels is het al weer bijna twee weken geleden dat Microsoft ASP.NET Ajax Beta heeft released. Het project waar ik aan werk maakte gebruik van ATLAS en de upgrade van een CTP kostte ons slechts enkele minuten.  De upgrade van ATLAS naar Ajax .Net ging echter niet zo simpel. Dit heeft me overigens wel verbaasd heeft omdat de CTP releases erg goed waren, een gemiste kans.  Lees dit migratiedocument en let bij een upgrade op het onderstaande:

Configuratie:

De configuratie in web.config is compleet veranderd. Appendix "Manual Configuration Changes" beschrijft hoe je je huidige web.config kan aanpassen.

Aanpassing van tagprefix:

Verder is de Prefix <ATLAS:/> veranderd in <ASP:/>. Dit houdt in dat je al je verwijzingen dus kan aanpassen.  

Deployment:

Voorheen werd een losse DLL geleverd. Deze kon je in je bin folder plaatsen en je had direct ATLAS functionaliteit. In de huidige versie wordt de DLL in de GAC geplaatst. Wanneer je een deployment naar een server waar de installatie niet is uitgevoerd, bijvoorbeeld een hosting provider kom je in de problemen omdat de Microsoft.Web.Extensions DLL niet gevonden wordt. Je krijgt onderstaande foutmelding te zien:

Could not load file or assembly 'Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

De Microsoft.Web.Extensions DLL is echter wel gemakkelijk uit de GAC te halen. Je zult dit echter via de Command Line moeten doen, omdat windows explorer de Assembly folder anders weergeeft dan normale folders en de DLL's dus niet te kopiëren zijn.

  1. CMD
  2. CD c:\windows\assembly\Gac_msil\microsoft.web.extensions\1.*
  3. copy microsoft.web.extensions.dll [type hier de binfolder waar de dll geplaatst moet worden]

Meer Info

Deze post beschrijft alleen de punten die we zelf tegengekomen zijn tijdens de migratie van ons project. We zijn nog een probleem tegen aangelopen met HTTPModules waarover later meer. Voor meer informatie zie de volgende resources:

Comments [2] | | # 
# Friday, 29 September 2006
Friday, 29 September 2006 23:46:34 (GMT Daylight Time, UTC+01:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Afgelopen week is DasBlog 1.9 released. Ik gebruik DasBlog al ruim een jaar en ben er zeer tevreden over. DasBlog is volgens mij ook nog eens de enige op .Net gebaseerde blogtool die geen database gebruikt (wat aanzienlijk scheelt aan hosting kosten). Alle data wordt in losse XML bestanden opgeslagen.

Onderstaande functies hebben me doen besluiten direct te upgraden:

  • DasBlog 1.9 is vele malen sneller.
  • Ondersteuning voor Windows Live Writer.
  • Feedburner ondersteuning op een manier dat mijn huidige subscribers op mijn RSS feeds automatisch doorverwezen worden. Overigens weet ik nog niet of ik overstap op Feedburner.
  • Verbeterde statistieken module.
  • Er zijn een aantal extra macro's ontwikkeld die je in je templates kan gebruiken.

Voor de volledige lijst zie deze url.

Comments [2] | | # 
# Tuesday, 12 September 2006
Tuesday, 12 September 2006 10:39:37 (GMT Daylight Time, UTC+01:00) ( Atlas )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Gisteren maakte  Scott Guthrie bekend dat Atlas V1.0 dit jaar nog wordt released. Hierin zal niet de volledige functionaliteit worden opgenomen zoals nu in de CTP het geval is maar het wordt wel volledig door Microsoft ondersteund. De overige functionaliteit blijft via CTP's beschikbaar.

Ook hebben ze de officiële naam bekend gemaakt, hier ben ik minder gelukkig mee. Atlas was een mooie naam, had dit Microsoft Atlas genoemd en je was klaar, maar nee dit is het geworden:

De Atlas Javascript Library wordt Microsoft AJAX Library
De Atlas server controls wordt ASP.NET 2.0 AJAX Extensions
De Atlas Control Toolkit wordt ASP.NET AJAX Control Toolkit

Lees meer

Comments [0] | | # 
# Monday, 21 August 2006
Monday, 21 August 2006 14:42:16 (GMT Daylight Time, UTC+01:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Normaliter blog ik niet over Excel, echter een probleemmelding waar ik vandaag betrokken bij was heeft me doen besluiten deze blogpost te plaatsen.

Een Excel document met vele Worksheets wordt geopend daarin worden 28 cellen aangepast waar de berekening van afhankelijk is. De output cellen worden door een applicatie gevuld en uitgelezen. Dit hele proces doet er ongeveer 5 seconde over. Na een aantal tests kwam ik erachter dat dit komt doordat de berekening elke keer uitgevoerd wordt wanneer een cel wordt aangepast. Dus de berekening werd 28 maal uitgevoerd.

In Excel kan je aangeven hoe berekeningen uitgevoerd moeten worden, dit gaat door property Calculation op Excel.Application te initialiseren, deze verwacht enumerator XlCalculation. XlCalculation kent de volgende waarden:

- XlCalculation.xlCalculationAutomatic, het berekenen start automatisch an het aanpassen van een cel. De standaard instelling van Excel
- XlCalculation.xlCalculationSemiautomatic, het berekenen start automatisch an het aanpassen van een cel. Echter worden tabellen worden niet meegenomen in berekening.
- XlCalculation.xlCalculationManual, Automatisch berekenen is uitgeschakeld. Berekenen dient handmatig te gebeuren.

Uiteraard wil ik uiteindelijk wel de berekening uitvoeren. Excel.Application kent hiervoor de volgende methoden:

- Calculate(), de berekening wordt uitgevoerd. De Calculate methode kan je overigens ook gebruiken op worksheets, cellen etc. Met de Calculate methode is het dus mogelijk een aparte cel opnieuw te berekenen
- CalculateFull(),de berekening wordt uitgevoerd op alle geopende workbooks
- CalculateFullRebuild(),de berekening wordt uitgevoerd en berekend tevens alle afhankelijke worksheets opnieuw.

Verder kent Excel.Application de property CalculateBeforeSave, waarmeer je aangeeft of de Calculate methode uitgevoerd moet worden voordat het Excel sheet opgeslagen wordt.Onderstaand mijn applicatie in VB.Net, de relevante regels heb ik in bold weergegeven.

Dim
excelApp As New Excel.Application()
Dim excelWorkBook As Excel.Workbook()
Dim excelworkSheet As Excel.Worksheet()

excelApp.Workbooks.Open("C:\Exceldoc.xls")
excelWorkBook = excelApp.ActiveWorkbook
excelworkSheet = excelWorkBook.Worksheets.Item(1) 'Eerste sheet

excelApp.Calculation = XlCalculation.xlCalculationManual
'Zet waarden…..

excelApp.CalculateFullRebuild() 'Bereken het Excel sheet opnieuw

excelApp.ActiveWorkbook.Saved = True
excelApp.ActiveWindow.Close()
excelApp.Quit()

'Release objects
Marshal.ReleaseComObject(excelworkSheet)
Marshal.ReleaseComObject(excelWorkBook)
Marshal.ReleaseComObject(excelApp)

Door bovenstaande aanpassing duurt het proces nog geen seconde. Een aardige performance boost door het plaatsen van twee regels code.

Comments [0] | | #